Configurações de TCP de baixa latência no Ubuntu

10

Há um servidor para medições em execução no Ubuntu no meu laboratório. E existe o programa C, que recebe dados através da conexão TCP e deve enviar o mais rapidamente possível uma resposta.

Configuração

  • Processadores: 2 processadores x 4 núcleos - CPU Intel (R) Xeon (E) E5345 a 2,33 GHz
  • RAM: 12 GB
  • NIC: Controladora Gigabit Ethernet da Intel Corporation 80003ES2LAN / Controladora Gigabit Ethernet 82546EB
  • Comutador de rede: Cisco Catalyst 2960
  • Informação de dados: Os blocos de dados são fornecidos aprox. cada 10 milissegundos. O tamanho do bloco de dados é de aprox. 1000 bytes.

A latência da rede ao receber pacotes é muito crítica (dezenas de microssegundos são importantes). Otimizei o programa ao máximo, mas não tenho experiência em ajustar o Ubuntu.

O que pode ser configurado no Ubuntu para reduzir o atraso local do processamento / envio de pacotes?

Alex V
fonte
Sim, gostaria de saber a marca / modelo do servidor.
precisa saber é
você deve cavar muito mais fundo. leia algumas coisas sobre otimização de kernel para negociação de alta frequência. Faça um Cisco Paper das vendas: cisco.com/c/dam/en/us/products/collateral/switches/…, portanto, obtenha uma placa PCI-E decente dos dois lados para economizar um pouco. Muito provavelmente (dependendo de quanto tempo você gasta nisso), você reconstruirá pelo menos o kernel com configurações diferentes, removendo muitas coisas que o ubuntu precisa, mas você não precisa. Assim como o ewwhite escreveu nos comentários, o ubuntu pode não ser perfeito para as configurações mais baixas.
Dennis Nolte
Com o hardware listado, são os equipamentos da era 2008 (CPUs da série 5300 da Intel). Naquela época, não havia muitas alterações especiais de hardware de baixa latência possíveis. Eu configuraria o BIOS do sistema para executar no modo de alto desempenho e desabilitaria os estados C da CPU.
precisa saber é o seguinte
@ewwhite Sim, você está certo quanto aos equipamentos da era de 2008. Eu vou tentar as suas sugestões. Obrigado!
Alex V
Alguma capacidade de ajustar este software para TCP_NODELAY?
Matt

Respostas:

10

Honestamente, eu não usaria o Ubuntu para isso ... mas há opções que podem ser aplicadas a qualquer variante do Linux.

Você deseja criar seus buffers de pilha de rede:

net.core.rmem_default = 10000000
net.core.wmem_default = 10000000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

Se o aplicativo estiver gravando no disco, talvez seja necessário alterar o agendador / elevador (por exemplo, o deadlineelevador).

No nível do servidor, você pode modificar o governador da CPU e o gerenciamento de energia e frequência da CPU (Estados-P, Estados-C).

No nível do sistema operacional, você pode alterar a prioridade em tempo real do seu aplicativo ( chrt), otimizando para reduzir as interrupções, fixando-o a uma CPU ou grupo de CPUs ( taskset) e interrompendo quaisquer serviços ou daemons desnecessários.

Você também pode ver algumas sugestões em: Como solucionar problemas de latência entre dois hosts Linux

É difícil ser mais específico sem conhecer o hardware ou o equipamento de rede envolvido.

ewwhite
fonte
3
Este não é realmente o local apropriado para debates religiosos. Leve-o para outro lugar, como o bate-papo.
Michael Hampton
1
@ MichaelHampton Havia links interessantes na discussão relacionados à pergunta: Guia de Ajuste em Tempo Real da Red Hat .
Alex V
6

Se você está seguindo o caminho do alto desempenho, normalmente deseja executar o mínimo possível de outros processos (agendados), pois eles interferem no seu aplicativo.

O Linux, como os sistemas operacionais UNIX clássicos, foi projetado para executar vários aplicativos simultaneamente de uma maneira justa e tenta evitar a falta de recursos, e você estará buscando o oposto, deixando de lado todo o resto, exceto seu aplicativo. Etapas simples no nível do sistema operacional estão alterando o bom nível e a prioridade em tempo real do seu aplicativo, alterando o agendador ou optando por um kernel em tempo real .

O TCP / IP geralmente é ajustado para evitar quedas de conexão e fazer uso eficiente da largura de banda disponível. Para obter a menor latência possível de um link muito rápido, em vez de obter a maior largura de banda possível de uma conexão em que alguns links intermediários são mais restritos, você ajustará o ajuste da pilha de rede.

 sysctl -a 

mostrará uma série de configurações de kernels que você pode ajustar. As configurações dependem de você estar usando IPv4 ou IPv6 ou não e o que exatamente você já faz no seu aplicativo, mas que pode ser do seu interesse:

  • net.ipv4.tcp_window_scaling=1 RFC 1323 - suporte para tamanhos de janela TCP IPV4 maiores que 64 K - geralmente necessários em redes de alta largura de banda
  • net.ipv4.tcp_reordering=3 O número máximo de vezes que um pacote IPV4 pode ser reordenado em um fluxo de pacotes TCP sem que o TCP assuma a perda de pacotes e inicie lentamente.
  • net.ipv4.tcp_low_latency=1destina-se a dar preferência a baixa latência em vez de maior rendimento; setting = 1 desativa o processamento da pré-fila IPV4 tcp
  • net.ipv4.tcp_sack=0 a configuração como 1 ativa o reconhecimento seletivo para IPV4, o que requer a ativação de tcp_timestamps e adiciona alguma sobrecarga de pacote, que você não precisa se não tiver perda de pacote
  • net.ipv4.tcp_timestamps=0 Aconselhado apenas nos casos em que é necessário saco.
  • net.ipv4.tcp_fastopen=1 Habilite para enviar dados no pacote SYN de abertura.

A maioria, se não todos, está melhor documentada na fonte do kernel .

É claro que você pode codificar soquetes TCP brutos e ignorar amplamente a pilha TCP / IP do kernel.

Geralmente, os sistemas altamente ajustados são executados em uma rede confiável e terão seus firewalls locais (tabelas de ip) desativados.

HBruijn
fonte