Uma interface de rede gigabit está limitada pela CPU a 25MB / s. Como posso maximizar o rendimento?

3

Eu tenho um Acer Aspire R1600-U910H com um adaptador de rede nForce gigabit. O throughput máximo do TCP é de cerca de 25MB / s, e aparentemente é limitado pelo Intel Atom 230 de núcleo único; quando o throughput máximo é atingido, o uso da CPU é de cerca de 50% -60%, o que corresponde à utilização total, considerando que esta é uma CPU habilitada para Hyper-threading.

O mesmo problema ocorre no Windows XP e no Ubuntu 8.04. No Windows, instalei o driver mais recente do chipset nForce, desativei recursos de economia de energia e realizei o descarregamento da soma de verificação. No Linux, o driver padrão possui o descarregamento de checksum ativado. Não há nenhum driver Linux disponível no site da Nvidia.

ethtool -k eth0 mostra que o descarregamento da soma de verificação está ativado:

Offload parameters for eth0:
rx-checksumming: on
tx-checksumming: on
scatter-gather: on
tcp segmentation offload: on
udp fragmentation offload: off
generic segmentation offload: off

O seguinte é a saída de powertop quando a rede está inativa:

Wakeups-from-idle per second : 61.9     interval: 10.0s
no ACPI power usage estimate available

Top causes for wakeups:
  90.9% (101.3)       <interrupt> : eth0
   4.5% (  5.0)             iftop : schedule_timeout (process_timeout)
   1.8% (  2.0)     <kernel core> : clocksource_register (clocksource_watchdog)
   0.9% (  1.0)            dhcdbd : schedule_timeout (process_timeout)
   0.5% (  0.6)     <kernel core> : neigh_table_init_no_netlink (neigh_periodic_timer)

E quando a taxa de transferência máxima de cerca de 25MB / s é atingida:

Wakeups-from-idle per second : 11175.5  interval: 10.0s
no ACPI power usage estimate available

Top causes for wakeups:
  99.9% (22097.4)       <interrupt> : eth0
   0.0% (  5.0)             iftop : schedule_timeout (process_timeout)
   0.0% (  2.0)     <kernel core> : clocksource_register (clocksource_watchdog)
   0.0% (  1.0)            dhcdbd : schedule_timeout (process_timeout)
   0.0% (  0.6)     <kernel core> : neigh_table_init_no_netlink (neigh_periodic_timer)

Observe as 20000 interrupções por segundo. Isso poderia ser a causa do alto uso da CPU e da baixa taxa de transferência? Se sim, como posso melhorar a situação?

Como referência, os outros computadores na rede geralmente podem transferir a 50 + MB / s sem problemas. Um computador com uma CPU Core 2 gera apenas 5000 interrupções por segundo quando está transferindo a 110MB / s. O número de interrupções é cerca de 20 vezes menor do que o sistema Atom (se as interrupções escalarem linearmente com a taxa de transferência).

O aumento do tamanho da janela TCP resolve o problema? É uma configuração geral no sistema operacional ou específica do aplicativo?

E uma pergunta menor: Como posso descobrir qual é o driver em uso para eth0?

    
por netvope 26.03.2010 / 13:42

3 respostas

2

Parece que a placa de rede tem um buffer razoavelmente pequeno e está operando no modo de interrupção, você pode aumentar o throughput alternando para polling, se ele for suportado pelo NIC & motorista.

No entanto, o problema provavelmente não pode ser completamente resolvido sem alternar para uma NIC com um buffer maior, o que provavelmente não é possível com esse hardware.

    
por 28.03.2010 / 05:28
1

How can I find out what is the driver in use for eth0?

Inspecionar a saída do dmesg pode ajudar.

Aqui está um caso específico que recebo neste computador onde digito a resposta:

$ dmesg | grep ethernet
forcedeth: Reverse Engineered nForce ethernet driver. Version 0.62.

Em certos casos, o suporte a NIC é construído diretamente no kernel (não como módulo). Então, pelo menos, não aparecerá na saída de lsmod .

    
por 27.03.2010 / 11:26
0

Tente usar o TCP Optimizer . A seleção de suas recomendações otimizadas aumenta consistentemente a taxa de transferência em relação às configurações TCP de instalação padrão.

    
por 27.03.2010 / 08:46