Antarmuka jaringan gigabit terbatas pada CPU hingga 25MB / s. Bagaimana saya bisa memaksimalkan throughput?

3

Saya memiliki Acer Aspire R1600-U910H dengan adaptor jaringan nForce gigabit. Throughput TCP maksimumnya sekitar 25MB / s, dan tampaknya dibatasi oleh single core Intel Atom 230; ketika throughput maksimum tercapai, penggunaan CPU adalah sekitar 50% -60%, yang sesuai dengan pemanfaatan penuh mengingat ini adalah CPU berkemampuan Hyper-threading.

Masalah yang sama terjadi pada Windows XP dan Ubuntu 8.04. Di Windows, saya telah menginstal driver chipset nForce terbaru, fitur hemat daya yang dinonaktifkan, dan mengaktifkan checksum offload. Di Linux, driver default memiliki checksum offload diaktifkan. Tidak ada driver Linux yang tersedia di situs web Nvidia.

ethtool -k eth0 menunjukkan bahwa checksum offload diaktifkan:

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

Berikut ini adalah output powertopsaat jaringan idle:

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)

Dan ketika throughput maksimum sekitar 25MB / s tercapai:

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)

Perhatikan 20000 interupsi per detik. Mungkinkah ini penyebab penggunaan CPU yang tinggi dan throughput yang rendah? Jika demikian, bagaimana saya dapat memperbaiki situasi?

Sebagai referensi, komputer lain dalam jaringan biasanya dapat mentransfer pada 50 + MB / s tanpa masalah. Komputer dengan CPU Core 2 hanya menghasilkan 5.000 interupsi per detik saat ditransfer pada 110MB / s. Jumlah interupsi sekitar 20 kali lebih sedikit dari sistem Atom (jika interupsi skala linier dengan throughput.)

Bisakah meningkatkan ukuran jendela TCP memecahkan masalah? Apakah ini pengaturan umum di OS, atau spesifik aplikasi?

Dan sebuah pertanyaan kecil: Bagaimana saya bisa mengetahui apa yang digunakan pengemudi untuk eth0?

netvope
sumber
1
Saran: Mungkin mengaktifkan bingkai jumbo akan mengurangi overhead dan meningkatkan throughput. superuser.com/questions/95546/…
Chris W. Rea
Terima kasih, saya akan coba. Saya melakukan itu Windows tanpa efek, tetapi sekarang saya menyadari saya tidak menyalakannya di komputer lain. Saya kira bingkai jumbo mungkin membutuhkan dukungan dari kedua ujungnya untuk bekerja.
netvope
Frame Jumbo pasti membutuhkan kedua ujungnya (alias komputer dan sakelar) untuk mendukung ini. Saya ragu Anda dapat meningkatkan throughput pada perangkat keras ini. Saya kira Anda perlu menukar phy ethernet dengan yang lebih baik (misalnya dengan hardare checksumming) yang tidak mungkin dilakukan pada perangkat keras ini. (Kemungkinan menjadi chip ethernet onboard yang disolder daripada modul pci.)
MacLemon

Jawaban:

2

Sepertinya kartu jaringan memiliki buffer yang cukup kecil dan beroperasi dalam mode interupsi, Anda mungkin dapat meningkatkan throughput dengan beralih ke polling, jika didukung oleh NIC & driver Anda.

Namun, masalahnya kemungkinan tidak dapat diselesaikan sepenuhnya tanpa beralih ke NIC dengan buffer yang lebih besar, yang mungkin tidak mungkin dilakukan dengan perangkat keras itu.

Eric
sumber
Terima kasih. Bagaimana cara saya beralih ke mode polling?
netvope
1

Bagaimana saya bisa mengetahui driver apa yang digunakan untuk eth0?

Memeriksa output dmesg dapat membantu.

Berikut adalah kasus khusus yang saya dapatkan di komputer ini tempat saya mengetik jawabannya:

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

Dalam kasus-kasus tertentu, dukungan NIC dibangun langsung ke dalam kernel (bukan sebagai modul). Jadi setidaknya tidak akan muncul di output lsmod .

kutu buku
sumber
Bagus! Saya "dipaksa: driver ethernet Reverse Engineered nForce. Versi 0.61."
netvope
0

Coba gunakan Pengoptimal TCP . Memilih rekomendasi yang dioptimalkan secara konsisten meningkatkan throughput dibandingkan pengaturan TCP instalasi default.

Lawrence Dol
sumber