Die Veröffentlichung des Projekts F-Stack 2.0, das die FreeBSD-Netzwerkstapel-Edition weiterentwickelt, die für den isolierten Betrieb im Benutzerspeicher in Form einer Bibliothek angepasst wurde. Das Projekt wurde von dem größten Telekommunikationsunternehmen Chinas, Tencent, ins Leben gerufen und wird in seinen Produkten und Dienstleistungen eingesetzt. Der Code ist in C geschrieben und wird unter der BSD-Lizenz veröffentlicht. Die Nutzung in Linux und FreeBSD wird unterstützt. Auch die in F-Stack integrierte Version von Nginx 1.28 und der Datenbank Redis 6.2.6 wurden angepasst, welche eine höhere Leistung als gewöhnliche Builds aufweisen, die über den systemeigenen Netzwerkstapel arbeiten.
F-Stack ermöglicht es, in Anwendungen einen eigenen lokalen Netzwerkstapel zu verwenden, der unabhängig vom Netzwerkstapel des Betriebssystems funktioniert, im Benutzerspeicher arbeitet und direkt mit der Netzwerktechnologie kommuniziert. F-Stack wird als Lösung positioniert, die die Leistung der Netzwerk-Request-Handler steigern kann, wenn der standardmäßige TCP/IP-Stapel des Linux-Kernels zu einem Engpass wird und das Scaling einschränkt. Theoretisch ermöglicht es F-Stack, die Netzwerkleistung zu erreichen, die für die verwendete Netzwerkkarte möglich ist, und in bestimmten Situationen die Anzahl der verarbeiteten kleinen Netzwerkrequests erheblich zu steigern.
Die Leistungssteigerung wird erreicht, indem Operationen wie das Kopieren von Netzwerkpaketen, die Planung von Threads, die Behandlung von Interrupts und der Zugriff auf Systemaufrufe ausgeschlossen werden. Um mit der Netzwerkkarte zu interagieren, ohne über die Schnittstellen des Betriebssystemkerns zu gehen, wird das DPDK-Framework (Data Plane Development Kit) verwendet, das eine Sammlung von Bibliotheken für die nieder(Niedrig)-level-Arbeit mit Netzwerkadaptern bereitstellt. DPDK ermöglicht es, die Overhead-Kosten zu senken und die Anzahl der CPU-Zyklen beim Empfangen oder Senden von Netzwerkpaketen auf ein Minimum zu reduzieren.
Die Funktionalität des TCP/IP-Stacks entspricht dem Netzwerk-Stack von FreeBSD 15 und wurde aus diesem Betriebssystem in eine unabhängige Bibliothek ausgelagert. Zur Entwicklung von Anwendungen kann die Standard-API POSIX (socket, epoll, kqueue) oder eine eigene Schnittstelle basierend auf Mikrosystemen verwendet werden, die die Erstellung von Netzwerk-Anwendungen vereinfacht und es ermöglicht, ohne komplexe Logik der asynchronen Anfragenverarbeitung auszukommen. Eine Verwendung mit unveränderten Anwendungen über LD_PRELOAD ist möglich.
Die auffälligsten Änderungen in der neuen Version:
- Die Komponenten des Netzwerk-Stacks wurden auf den Stand FreeBSD 15 aktualisiert (zuvor kam FreeBSD 13 zum Einsatz).
- Ein Thread-Modus (thread_mode=1) wurde in einem Prozess implementiert, der den zuvor verfügbaren Multiprozessmodus ergänzt.
- Ein leichter Betriebsmodus (primary_slim) wurde hinzugefügt, bei dem der Hauptprozess nur die grundlegenden Initialisierungs- und Koordinationsaufgaben übernimmt, während das Empfangen von Paketen und die Verarbeitung von Rx/Tx-Warteschlangen nur von den Kindprozessen durchgeführt wird.
- Unterstützung für Hardwarebeschleunigungsmechanismen wurde hinzugefügt.
TSO (TCP Segmentation Offload) zur Auslagerung der Paket-Kombinationsoperationen auf die Netzwerkkarte, mit der Möglichkeit, auf eine Software-Implementierung zurückzugreifen. Die Unterstützung für TSO (TCP Segmentation Offload, Auslagerung der Segmentierung von Paketen auf die Netzwerkkarte) für IPv6 wurde verbessert. - Die Möglichkeit zur Anpassung der MTU (Maximum Transmission Unit) wurde hinzugefügt, und es wurde Unterstützung für Jumbo-Frames implementiert.
- Die Möglichkeiten zur Verwaltung des Hardwarebeschleunigung zur Berechnung der Prüfziffern gesendeter Pakete wurden erweitert.
- Die Funktion ff_zc_recv() wurde hinzugefügt, um Daten ohne Zwischenpufferung (zero-copy) zu empfangen. Die ähnliche Funktion ff_zc_send() zum Senden wurde umgestaltet und optimiert. IPv6-Unterstützung Die Funktion ff_rss_check() wurde optimiert.
- Die Option FF_KERNEL_COEXIST wurde hinzugefügt, um zusammen mit dem Netzwerk-Stack des Kernels zu arbeiten.
- Die Möglichkeit wurde bereitgestellt, Informationen über den Datenverkehr mit Nanosekunden-Genauigkeit in pcap-Dump-Dateien zu speichern.
- Neue Parameter idle_loop_interval, extra_eal_args, drain_ring_size, reload_heartbeat_timeout_ms und reload_udp_idle_ms wurden in config.ini hinzugefügt.
- In der spezialisierten Nginx-Build-Version wurde die Unterstützung für die Nachladung der Konfiguration und die Aktualisierung der Binärdatei ohne Unterbrechung der Verbindungen (graceful_reload=1) implementiert.
Quelle: opennet.ru
