Foi lançado o projeto F-Stack 2.0, que desenvolve uma edição da pilha de rede FreeBSD, adaptada para operar de forma isolada no espaço do usuário em forma de biblioteca. O projeto foi criado pela maior empresa de telecomunicações da China, Tencent, e é utilizado em seus produtos e serviços. O código é escrito em C e é distribuído sob a licença BSD. O funcionamento é suportado tanto no Linux quanto no FreeBSD. O projeto também oferece suporte a versões traduzidas do Nginx 1.28 e do banco de dados Redis 6.2.6, que demonstram desempenho superior em comparação com as compilações padrão que operam sobre a pilha de rede do sistema.
O F-Stack permite que aplicações utilizem sua própria pilha de rede local, independente da pilha de rede do sistema operacional, funcionando no espaço do usuário e interagindo diretamente com o hardware de rede. O F-Stack é posicionado como uma solução que aumenta o desempenho dos processadores de solicitações de rede em situações onde a pilha TCP/IP padrão do núcleo Linux se torna um gargalo e limita a escalabilidade. Teoricamente, o F-Stack consegue atingir o teto de desempenho de rede possível para a placa de rede utilizada e, em algumas situações, permite um aumento exponencial no número de pequenas solicitações de rede processadas.
O aumento de desempenho é alcançado através da eliminação de operações como a cópia de pacotes de rede, agendamento de threads, processamento de interrupções e chamadas de sistema. Para interagir com a placa de rede, contornando as interfaces do núcleo do sistema operacional, é utilizado o framework DPDK (Data Plane Development Kit), que desenvolve um conjunto de bibliotecas para trabalho de baixo nível com adaptadores de rede. O DPDK possibilita a redução de sobrecarga e permite que o número de ciclos da CPU para a recepção ou envio de pacotes de rede seja minimizado.
A funcionalidade da pilha TCP/IP está de acordo com a pilha de rede do FreeBSD 15 e foi isolada deste sistema operacional em uma biblioteca independente. Para desenvolvimento de aplicativos, pode-se utilizar a API padrão POSIX (socket, epoll, kqueue) ou uma interface própria baseada em microthreads, simplificando a criação de aplicativos de rede e permitindo evitar a lógica complexa de processamento assíncrono de requisições. É possível usar com aplicativos não modificados através do carregamento via LD_PRELOAD.
As mudanças mais notáveis na nova versão:
- Os componentes da pilha de rede foram atualizados para o estado do FreeBSD 15 (anteriormente usava-se o FreeBSD 13).
- Foi implementado um modo de operação multithread (thread_mode=1) em um único processo, complementando o modo multiprocesso anteriormente disponível.
- Adicionado um modo de operação leve (primary_slim), onde o processo principal executa apenas tarefas básicas de inicialização e coordenação, enquanto a recepção de pacotes e o processamento de filas de recepção/transmissão (rx/tx) são realizados apenas pelos processos filhos.
- Adicionada a suporte ao mecanismo de aceleração de hardware.
TSO (TCP Segmentation Offload) para descarregar para a placa de rede operações de agregação de pacotes, com a possibilidade de revertê-lo para uma implementação de software. Melhorado o suporte a TSO (TCP Segmentation Offload, descarregamento para a placa de rede para processamento de segmentos de pacotes) para IPv6. - Adicionada a possibilidade de alterar o tamanho do MTU (Maximum Transmission Unit) e implementado suporte a quadros jumbo.
- Expandidas as capacidades de gerenciamento da aceleração de hardware no cálculo de somas de verificação de pacotes enviados.
- Adicionada a função ff_zc_recv() para receber dados sem buffer intermediário (zero-copy). A função análoga ff_zc_send() para envio foi reformulada. Otimizada e ampliada. suporte a IPv6 A função ff_rss_check().
- Adicionada a opção FF_KERNEL_COEXIST para operação conjunta com a pilha de rede do núcleo.
- Possibilidade de armazenar informações sobre tráfego em dumps pcap com precisão de nanossegundos.
- Novos parâmetros idle_loop_interval, extra_eal_args, drain_ring_size, reload_heartbeat_timeout_ms e reload_udp_idle_ms foram adicionados ao config.ini.
- Em uma versão especializada do nginx, foi implementado o suporte à recarga de configuração e atualização do arquivo binário sem interrupção de conexões (graceful_reload=1).
Fonte: opennet.ru
