Гигабитный сетевой интерфейс ограничен ЦП до 25 МБ / с. Как я могу максимизировать пропускную способность?

3803
netvope

У меня Acer Aspire R1600-U910H с гигабитным сетевым адаптером nForce. Максимальная пропускная способность TCP составляет около 25 МБ / с, и, по-видимому, она ограничена одноядерным процессором Intel Atom 230; при достижении максимальной пропускной способности загрузка ЦП составляет около 50% -60%, что соответствует полной загрузке, учитывая, что это ЦП с поддержкой гиперпоточности.

Та же проблема возникает как в Windows XP, так и в Ubuntu 8.04. В Windows я установил последнюю версию драйвера чипсета nForce, отключил функции энергосбережения и включил разгрузку контрольной суммы. В Linux для драйвера по умолчанию включена разгрузка контрольной суммы. На сайте Nvidia нет драйвера для Linux.

ethtool -k eth0 показывает, что разгрузка контрольной суммы включена:

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 

Следующее является выводом, powertopкогда сеть простаивает:

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) 

И когда достигается максимальная пропускная способность около 25 МБ / с:

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) 

Обратите внимание на 20000 прерываний в секунду. Может ли это быть причиной высокой загрузки процессора и низкой пропускной способности? Если так, как я могу улучшить ситуацию?

Как справка, другие компьютеры в сети обычно могут передавать со скоростью 50+ МБ / с без проблем. Компьютер с процессором Core 2 генерирует только 5000 прерываний в секунду при скорости передачи 110 МБ / с. Количество прерываний примерно в 20 раз меньше, чем у системы Atom (если прерывания масштабируются линейно с пропускной способностью.)

Может ли увеличение размера окна TCP решить проблему? Это общая настройка в ОС или приложение?

И небольшой вопрос: как я могу узнать, какой драйвер используется для eth0?

3
Предложение: Возможно, включение jumbo-кадров уменьшит накладные расходы и увеличит пропускную способность. http://superuser.com/questions/95546/why-do-i-only-get-300-400mbit-on-my-1000mbit-network/95563#95563 Chris W. Rea 14 лет назад 1
Спасибо, попробую. Я сделал эту Windows без эффектов, но теперь я понимаю, что не включал ее на других компьютерах. Я думаю, что для работы Jumbo Frame требуется поддержка с обоих концов. netvope 14 лет назад 0
Для поддержки Jumbo-кадров определенно требуются оба конца (так называемый компьютер и коммутатор). Я сомневаюсь, что вы можете увеличить пропускную способность на этом оборудовании. Я предполагаю, что вам нужно будет заменить phy ethernet на лучший (например, с контрольной суммой hardare), что вряд ли возможно на этом оборудовании. (Скорее всего, это встроенный запаянный чип Ethernet, а не модуль pci.) MacLemon 14 лет назад 0

3 ответа на вопрос

2
Eric

Похоже, сетевая карта имеет довольно маленький буфер и работает в режиме прерывания, вы можете увеличить пропускную способность, переключившись на опрос, если это поддерживается вашей сетевой картой и драйвером.

Тем не менее, проблема, вероятно, не может быть полностью решена без переключения на сетевую карту с большим буфером, что, вероятно, невозможно с этим оборудованием.

Благодарю. Как перейти в режим опроса? netvope 14 лет назад 0
1
geek

Как я могу узнать, какой драйвер используется для eth0?

Проверка вывода dmesg может помочь.

Вот частный случай, который я получаю на этом компьютере, где я набираю ответ:

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

В некоторых случаях поддержка NIC встроена прямо в ядро ​​(не как модуль). Так что по крайней мере он не появится в выводе lsmod .

Ницца! Я получил "Forcedeth: Reverse Engineered nForce ethernet драйвер. Версия 0.61." netvope 14 лет назад 0
0
Lawrence Dol

Попробуйте использовать TCP Optimizer . Выбор оптимизированных рекомендаций последовательно увеличивает пропускную способность по сравнению с установочными настройками TCP по умолчанию.