
Verifique o buffer de anel da NIC:
# ethtool -g eth0
Ring parameters for eth0:
Pre-set maximums:
RX: 4096
RX Mini: 0
RX Jumbo: 0
TX: 4096
Current hardware settings:
RX: 256
RX Mini: 0
RX Jumbo: 0
TX: 256
Pode-se definir "RX/TX" até o limite mostrado nos "Máximos predefinidos" como:
# ethtool -G eth0 rx 4096 rx 4096
A pergunta é: por padrão;,por que estes estão tão baixos(em todos os servidores que tenho, todos eles estão em 256) em vez de um valor mais alto ou seus recursos máximos de hardware? Há alguma desvantagem (se sim, qual?) ao aumentar esses valores?
Responder1
Primeiro, os números que você definiu não estão embytescomo muitas pessoas pensam, eles estão emdescritores(e o tamanho do descritor depende do hardware). Portanto, quando você aumenta o comprimento do anel, você solicita que mais memória seja alocada no kernel para esses descritores. Em geral, você deseja essa memória do kernel no cache L1 para que o processamento de interrupções seja o mais rápido possível. Aumentar o tamanho do anel torna isso menos provável e, em alguns casos, completamente impossível.
A próxima coisa é a coalescência de interrupções - em geral, quando você aumenta o tamanho do buffer de anel, a NIC ajustará suas marcas baixas/altas adequadamente e acionará a interrupção quando mais dados forem armazenados em buffer (ou seja, com menos frequência). O tempo exigido pelo kernel para processar essas grandes quantidades de dados durante o processamento de interrupção também aumentaria como resultado.
Todos os itens acima resultam em um efeito de balde simples - com um anel maior, a probabilidade de queda de pacotes diminui e a latência da rede aumenta. Isso pode ser perfeitamente adequado se você estiver transmitindo arquivos grandes por TCP e pode ser completamente indesejável se você for um aplicativo de pacotes pequenos de baixa latência (ou seja, jogos e outros).
Os números padrão que você vê são uma compensação razoável entre os dois.