Nach anderthalb Jahren Entwicklung Projektveröffentlichung , das einen leistungsstarken Netzwerk-Stack im Benutzermodus entwickelt, der auf dem Framework basiert und dem TCP/IP-Stack von FreeBSD (F-Stack ist nicht an FreeBSD gebunden und betrachtet Linux als primäre Plattform für den Einsatz). Das Projekt wird in verschiedenen Produkten und Dienstleistungen verwendet , dem größten Telekommunikationsunternehmen in China. Der Code steht unter der BSD-Lizenz. Die Nutzung unter Linux und FreeBSD wird unterstützt.
F-Stack ermöglicht die Organisation der Netzwerkkommunikation in Anwendungen, indem anstelle des Betriebssystem-Netzwerkstacks ein eigener Netzwerkstack verwendet wird, der im Benutzermodus funktioniert und direkt mit der Netzwerkhardware arbeitet. spezialisierte Versionen von Nginx und Redis, die auf die Nutzung von F-Stack umgestellt wurden.
Für die Anwendungsentwicklung sowohl die standardmäßige Posix-API (Socket, Epoll, Kqueue), die den Übergang bestehender Anwendungen zu F-Stack vereinfacht, als auch die eigene Programmierschnittstelle auf Basis von Koroutinen (Mikro-Threads), die die Erstellung von Netzwerk Anwendungen erleichtert und ohne komplexe Logik der asynchronen Anfragenverarbeitung auskommt. F-Stack bietet auch Mittel zur Vereinfachung der Anwendung in Anwendungen mit multiprozessorer Architektur.
Für die Interaktion mit der Netzwerkkarte, ohne die Schnittstellen des Betriebssystemkerns zu verwenden, wird das Framework (Data Plane Development Kit), das eine Sammlung von Bibliotheken für die niedrigstufige Arbeit mit Netzwerkadaptern, die Interaktion in Mehrkernsystemen, die Verwendung von Ringpuffern und großen Speicherseiten ("huge page") bereitstellt. Die Nutzung von DPDK erlaubt es, Netzwerkpakete mit einer minimalen Anzahl von CPU-Zyklen (etwa 80 Zyklen pro Paket) zu empfangen und zu senden und leistungsstarke Komponenten des Netzwerkstacks zu entwickeln. Die Funktionalität des TCP/IP-Stacks wurde direkt aus FreeBSD 11.1 übernommen und in eine betriebssystemunabhängige Bibliothek ausgelagert.
F-Stack wird als Lösung positioniert, die zur Steigerung der Leistung von Netzwerk-Request-Handlern eingesetzt werden kann, wenn der Standard-TCP/IP-Stack des Linux-Kernels ein Engpass ist und die Skalierbarkeit einschränkt. Der Einsatz von F-Stack ermöglicht eine deutliche Optimierung und kann in manchen Situationen die Anzahl verarbeiteter kleiner Anfragen um ein Vielfaches erhöhen.
Die Leistungssteigerung wird durch den Ausschluss von Operationen wie das Kopieren von Netzwerkpaketen, Thread-Planung, Interrupt-Behandlung und Systemaufrufen erreicht. F-Stack ermöglicht es, die maximale Netzwerkleistung zu erreichen, die für die verwendete Netzwerkkarte möglich ist. Beispielsweise haben F-Stack-basierte Lösungen gezeigt, dass sie 10 Millionen parallele Verbindungen, 5 Millionen Anfragen pro Sekunde und 1 Million Verbindungen pro Sekunde verarbeiten können.
In der neuen Version:
- Unterstützung für VLAN hinzugefügt;
- Möglichkeit der Ausführung in isolierten Docker-Containern gewährleistet;
- Schnittstellen ff_dup, ff_dup2, ff_ioctl_freebsd, ff_getsockopt_freebsd und ff_setsockopt_freebsd implementiert;
- Der Parameter „idle_sleep“ wurde hinzugefügt, um die CPU-Belastung in Situationen ohne eingehende Pakete zu reduzieren.
- Die Unterstützung für die ARM64-Architektur wurde hinzugefügt.
- In der F-Stack-Übersetzung von Nginx wurden die Handler getpeername, getsockname und shutdown ersetzt.
- Der Übergang zur neuen DPDK-Version 17.11.4 LTS wurde vollzogen.
- Ein Tool wurde hinzugefügt, , um den aktuellen Verkehr anzuzeigen, der von den auf F-Stack basierenden Anwendungen verarbeitet wird (ähnlich wie trafshow).
Zu den zukünftigen Plänen gehören IPv6-Unterstützung, Bereitstellung einer API für die Programmiersprachen Python, PHP und Go, Unterstützung der Cyptodev-API (), Verwendung von zerocopy beim Senden von Paketen, Unterstützung und die Möglichkeit, als Hintergrundprozess zu laufen.
Quelle: opennet.ru
