Eine Gigabit-Netzwerkschnittstelle ist CPU-beschränkt auf 25 MB / s. Wie kann ich den Durchsatz maximieren?

4054
netvope

Ich habe ein Acer Aspire R1600-U910H mit einem nForce Gigabit-Netzwerkadapter. Der maximale TCP-Durchsatz beträgt etwa 25 MB / s und wird anscheinend durch den Single Core Intel Atom 230 begrenzt. Wenn der maximale Durchsatz erreicht ist, beträgt die CPU-Auslastung etwa 50% -60%. Dies entspricht der vollen Auslastung, wenn man bedenkt, dass dies eine Hyper-Threading-fähige CPU ist.

Das gleiche Problem tritt sowohl unter Windows XP als auch unter Ubuntu 8.04 auf. Unter Windows habe ich den neuesten nForce-Chipsatz-Treiber installiert, die Energiesparfunktionen deaktiviert und die Prüfsummenverschiebung aktiviert. Unter Linux ist für den Standardtreiber die Prüfsummenverschiebung aktiviert. Auf der Website von Nvidia ist kein Linux-Treiber verfügbar.

ethtool -k eth0 zeigt an, dass die Prüfsummenverschiebung aktiviert ist:

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 

Das Folgende ist die Ausgabe, powertopwenn das Netzwerk inaktiv ist:

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) 

Und wenn der maximale Durchsatz von etwa 25 MB / s erreicht ist:

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) 

Beachten Sie die 20000 Interrupts pro Sekunde. Könnte dies die Ursache für die hohe CPU-Auslastung und den geringen Durchsatz sein? Wenn ja, wie kann ich die Situation verbessern?

Als Referenz können die anderen Computer im Netzwerk in der Regel ohne Probleme mit 50+ MB / s übertragen werden. Ein Computer mit einer Core-2-CPU generiert bei einer Übertragung mit 110 MB / s nur 5000 Interrupts pro Sekunde. Die Anzahl der Interrupts ist etwa 20-mal geringer als beim Atom-System (wenn Interrupts linear mit dem Durchsatz skalieren.)

Kann durch Erhöhen der TCP-Fenstergröße das Problem gelöst werden? Ist es eine allgemeine Einstellung im Betriebssystem oder anwendungsspezifisch?

Und eine kleine Frage: Wie kann ich herausfinden, was der Treiber für eth0 ist?

3
Suggestion: Perhaps enabling jumbo frames would reduce the overhead and increase throughput. http://superuser.com/questions/95546/why-do-i-only-get-300-400mbit-on-my-1000mbit-network/95563#95563 Chris W. Rea vor 14 Jahren 1
Danke, ich werde es versuchen. Ich habe das Windows ohne Effekte gemacht, aber jetzt ist mir klar, dass ich es auf den anderen Computern nicht eingeschaltet habe. Ich denke, der Jumbo-Frame erfordert wahrscheinlich Unterstützung von beiden Enden, um zu arbeiten. netvope vor 14 Jahren 0
Jumbo-Frames erfordern definitiv beide Enden (auch Computer und Switch genannt), um dies zu unterstützen. Ich bezweifle, dass Sie den Durchsatz dieser Hardware erhöhen können. Ich denke, Sie müssten die Ethernet-Phase gegen eine bessere austauschen (z. B. bei hardare-Prüfsummen), die auf dieser Hardware wahrscheinlich nicht möglich ist. (Wahrscheinlich eher ein integrierter Ethernet-Chip als ein PCI-Modul.) MacLemon vor 14 Jahren 0

3 Antworten auf die Frage

2
Eric

Die Netzwerkkarte verfügt über einen relativ kleinen Puffer und arbeitet im Interrupt-Modus. Sie können möglicherweise den Durchsatz erhöhen, indem Sie auf Abfragen umschalten, sofern dies von Ihrer Netzwerkkarte und Ihrem Treiber unterstützt wird.

Das Problem kann jedoch wahrscheinlich nicht vollständig gelöst werden, ohne zu einer Netzwerkkarte mit einem größeren Puffer zu wechseln, was mit dieser Hardware wahrscheinlich nicht möglich ist.

Vielen Dank. Wie wechsle ich in den Abrufmodus? netvope vor 14 Jahren 0
1
geek

Wie kann ich herausfinden, welchen Treiber der eth0 verwendet?

Überprüfen der Ausgabe von dmesg kann hilfreich sein.

Hier ist ein besonderer Fall, den ich auf diesem Computer bekomme, wo ich die Antwort eingebe:

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

In bestimmten Fällen ist die NIC-Unterstützung direkt in den Kernel integriert (nicht als Modul). Es erscheint also zumindest nicht in der Ausgabe von lsmod .

Nett! Ich bekam "gezwungen: Reverse Engineered nForce Ethernet-Treiber. Version 0.61." netvope vor 14 Jahren 0
0
Lawrence Dol

Versuchen Sie es mit dem TCP Optimizer . Durch die Auswahl der optimierten Empfehlungen wird der Durchsatz gegenüber den TCP-Standardeinstellungen für die Installation konstant erhöht.