Prinsip utama di balik moderasi interupsi adalah untuk menghasilkan kurang dari satu interupsi per frame yang diterima (atau satu interupsi per penyelesaian frame transmisi), mengurangi overhead OS yang ditemui ketika melakukan servis interupsi. Pengontrol BCM5709 mendukung beberapa metode dalam perangkat keras untuk penggabungan interupsi, termasuk:
- Hasilkan interupsi setelah menerima frame X (rx-frame di ethtool)
- Hasilkan interupsi ketika tidak ada lagi frame yang diterima setelah X usecs (rx-usecs di ethtool)
Masalah dengan menggunakan metode perangkat keras ini adalah Anda harus memilihnya untuk mengoptimalkan throughput atau latensi, Anda tidak dapat memiliki keduanya. Menghasilkan satu interupsi untuk setiap frame yang diterima (rx-frames = 1) meminimalkan latensi, tetapi melakukannya dengan biaya tinggi dalam hal overhead layanan interupsi. Menetapkan nilai yang lebih besar (katakanlah rx-frames = 10) mengurangi jumlah siklus CPU yang dikonsumsi dengan menghasilkan hanya satu interupsi untuk setiap sepuluh frame yang diterima, tetapi Anda juga akan menemukan latensi yang lebih tinggi untuk frame pertama dalam kelompok sepuluh.
Implementasi NAPI mencoba untuk memanfaatkan fakta bahwa lalu lintas datang dalam tandan, sehingga Anda menghasilkan interupsi segera pada frame pertama yang diterima, kemudian Anda segera beralih ke mode polling (yaitu menonaktifkan interupsi) karena lebih banyak lalu lintas akan ditutup. Setelah Anda mengumpulkan beberapa frame (16 atau 64 dalam pertanyaan Anda) atau beberapa interval waktu, maka driver akan mengaktifkan kembali interupsi dan memulai lagi.
Jika Anda memiliki beban kerja yang dapat diprediksi, maka nilai-nilai tetap dapat dipilih untuk salah satu di atas (NAPI, rx-frame, rx-usecs) yang memberi Anda trade-off yang tepat, tetapi sebagian besar beban kerja bervariasi dan Anda akhirnya membuat beberapa pengorbanan. Di sinilah bermain adaptif-rx / adaptif-tx. Idenya adalah bahwa pengemudi secara konstan memonitor beban kerja (frame yang diterima per detik, ukuran frame, dll.) Dan mengatur skema penggabungan perangkat keras untuk mengoptimalkan latensi dalam situasi lalu lintas rendah atau mengoptimalkan throughput dalam situasi lalu lintas tinggi. Ini adalah teori yang keren tetapi mungkin sulit untuk diterapkan dalam praktik. Hanya beberapa driver yang mengimplementasikannya (lihat http://fxr.watson.org/fxr/search?v=linux-2.6&string=use_adaptive_rx_coalesce ) dan driver bnx2 / e1000 tidak ada dalam daftar itu.
Untuk deskripsi yang baik tentang bagaimana setiap bidang penggabungan ethtool seharusnya berfungsi, lihat definisi untuk struktur ethtool_coalesce di alamat berikut:
http://fxr.watson.org/fxr/source/include/linux/ethtool.h?v=linux-2.6#L111
Untuk Anda situasi tertentu (~ 400Mb / s throughput) Saya sarankan menyetel nilai rx-frame dan rx-usecs untuk pengaturan terbaik untuk beban kerja Anda. Lihatlah overhead ISR dan sensitivitas aplikasi Anda (httpd? Dll.) Terhadap latensi.
Dave