Sebuah network interface dapat menerima paket lebih cepat daripada kemampuan CPU untuk menangani satu hardware interrupt untuk setiap paket. Interrupt coalescing mengatasi ketidakseimbangan ini dengan membiarkan adapter mengelompokkan notifikasi completion dan meng-interrupt CPU lebih jarang.
Trade-off-nya jelas. Interrupt yang lebih sedikit mengurangi beban penanganan interrupt dan scheduling, tetapi sebuah paket dapat menunggu lebih lama sebelum software diberi tahu bahwa receive work sudah siap. Pengaturan terbaik bergantung pada packet rate, target latensi, kapasitas CPU, dan kontrol coalescing yang tersedia pada adapter.
Kedatangan paket dan pengiriman interrupt adalah dua peristiwa berbeda
Frame yang diterima pertama kali tiba di network adapter. Adapter memvalidasi lalu menempatkan data paket atau descriptor ke struktur receive yang dapat diakses host sesuai desain driver dan DMA.
Adapter kemudian perlu memberi sinyal bahwa software memiliki pekerjaan untuk diproses. Pada sistem modern, sinyal ini umumnya berupa interrupt MSI atau MSI-X, bukan legacy shared interrupt line.
Kedua peristiwa tersebut tidak harus terjadi pada saat yang sama. NIC dapat menerima beberapa paket, memperbarui beberapa completion entry, lalu mengeluarkan satu interrupt untuk seluruh pekerjaan yang terkumpul.
Pemisahan inilah yang menjadi dasar interrupt coalescing.
Satu interrupt per paket dapat membuang waktu CPU
Pada packet rate rendah, notifikasi langsung relatif murah dan memberi software sinyal dengan cepat. Pada rate tinggi, kebijakan yang sama dapat menghasilkan interrupt dalam jumlah sangat besar.
Setiap interrupt memiliki biaya pemrosesan. Prosesor mengubah execution context, menjalankan pekerjaan kernel terkait interrupt, dan dapat mengganggu eksekusi aplikasi serta cache locality. Walau tiap kejadian murah, event rate yang sangat tinggi dapat menghabiskan waktu CPU dalam jumlah besar.
Mengelompokkan notifikasi mengamortisasi biaya tetap tersebut ke beberapa paket. Jika satu interrupt membuat software memproses 32 receive completion, biaya notifikasi per paket bisa jauh lebih rendah dibanding 32 interrupt terpisah.
Kapasitas CPU yang terselamatkan dapat meningkatkan packet throughput yang mampu dipertahankan atau menyisakan lebih banyak waktu prosesor untuk pekerjaan aplikasi.
Coalescing dapat memakai jumlah paket, timer, atau keduanya
Implementasi hardware berbeda-beda, tetapi dua kontrol umum adalah packet threshold dan timer.
Packet threshold meminta adapter memberi sinyal setelah cukup banyak completion terkumpul. Mekanisme ini bekerja baik saat traffic sibuk karena threshold dapat tercapai dengan cepat.
Timer membatasi berapa lama pekerjaan menunggu ketika traffic jarang. Tanpa batas waktu, threshold 32 paket dapat membuat satu paket tunggal menunggu tanpa batas sampai 31 paket lain tiba.
Adapter dapat menggabungkan kedua mekanisme ini. Interrupt dapat terjadi ketika jumlah completion mencapai threshold atau saat timer habis, mana yang terjadi lebih dulu.
Kontrol, unit, dan batas persisnya bergantung pada device. Interface driver sering hanya mengekspos pengaturan yang didukung oleh hardware dan driver aktif.
Penundaan tambahan paling terlihat pada queue depth rendah
Coalescing delay bukan waktu transmisi di kabel. Ini adalah waktu yang disisipkan antara completion activity dan notifikasi ke CPU.
Untuk bulk transfer dengan banyak paket yang sudah berdatangan, packet threshold dapat tercapai hampir seketika. Penundaan tambahan per batch bisa kecil dibanding manfaat throughput.
Untuk traffic request-response yang jarang, paket pertama dalam sebuah batch mungkin tidak diikuti traffic lain yang cukup untuk segera memicu count threshold. Batas berbasis timer kemudian menjadi penting, dan interval yang dikonfigurasi dapat terlihat pada tail latency atau latensi aplikasi.
Karena itu, coalescing agresif kurang menarik untuk workload yang lebih mementingkan respons dalam skala mikrodetik daripada packet rate maksimum.
Batch yang lebih besar mengubah distribusi pekerjaan
Mengurangi interrupt tidak menghilangkan pemrosesan paket. Hal itu mengubah kapan pemrosesan diminta dan seberapa banyak pekerjaan yang tersedia sekaligus.
Batch yang lebih besar dapat memperbaiki amortisasi dan perilaku cache, tetapi juga dapat menciptakan burst pekerjaan kernel. Task lain yang berbagi CPU dapat menunggu lebih lama sebelum dijalankan jika receive processing menghabiskan budget besar dalam satu pass.
Mekanisme networking pada operating system dapat memberi batas tambahan pada pekerjaan per polling cycle atau menunda sisa pekerjaan. Kontrol tersebut berinteraksi dengan perilaku interrupt NIC, sehingga pengaturan coalescing tidak dapat dinilai hanya dari hardware interrupt counter.
Pengukuran yang berguna meliputi packet rate, interrupt rate, utilisasi CPU, receive drop, latensi aplikasi, dan beban per queue.
Receive queue dapat memiliki jalur interrupt terpisah
NIC multiqueue modern umumnya menyediakan beberapa receive queue dan memakai vector MSI-X sehingga tiap queue dapat memiliki jalur interrupt sendiri.
Hal ini memungkinkan pemrosesan traffic tersebar ke beberapa CPU. Artinya, interrupt coalescing merupakan bagian dari desain queue placement yang lebih luas. Interrupt rate rendah pada satu queue tidak membuktikan seluruh adapter sudah seimbang.
Receive Side Scaling dapat mengarahkan flow ke queue, sementara interrupt affinity menentukan CPU mana yang menangani notifikasi terkait. Coalescing kemudian mengatur frekuensi notifikasi untuk pekerjaan yang terkumpul pada queue tersebut.
Karena itu, perubahan tuning dapat memindahkan bottleneck alih-alih menghilangkannya. Mengurangi interrupt dapat membebaskan waktu CPU, tetapi distribusi queue yang buruk masih dapat membebani satu core sementara core lain tetap ringan.
Skema adaptif mengubah pengaturan mengikuti traffic
Sebagian driver dan adapter mendukung adaptive interrupt moderation. Alih-alih mempertahankan satu delay atau threshold tetap, sistem mengubah moderasi berdasarkan kondisi traffic yang diamati.
Tujuannya adalah mengutamakan notifikasi cepat pada rate rendah dan batching lebih kuat ketika packet rate meningkat. Ini dapat menjadi kompromi yang berguna untuk mesin yang bergantian antara traffic interaktif dan bulk transfer.
Perilaku adaptif juga membuat pengukuran kurang statis. Pola interrupt efektif dapat berubah bersama traffic walaupun administrator tidak mengubah pengaturan.
Untuk performance test yang dapat diulang, catat apakah adaptive moderation aktif bersama parameter coalescing yang terlihat.
Jumlah interrupt lebih rendah tidak menjamin latensi lebih rendah
Interrupt counter mudah diamati, tetapi meminimalkannya bukan tujuan performa yang lengkap.
Batching yang sangat agresif dapat menurunkan jumlah interrupt secara dramatis sambil meningkatkan request latency. Batching yang terlalu lemah dapat menjaga notification delay tetap rendah tetapi menghabiskan kapasitas CPU yang dibutuhkan aplikasi.
Target yang berguna adalah moderasi secukupnya untuk mengendalikan notification overhead tanpa melanggar kebutuhan latensi dan throughput workload.
Titik keseimbangan dapat berbeda antara storage server dengan transfer besar, packet-processing host yang menangani jutaan paket kecil, dan layanan interaktif yang didominasi request-response singkat.
Hardware offload memengaruhi pengukuran yang sama
Interrupt coalescing bekerja bersama mekanisme NIC dan kernel lainnya. Receive aggregation, checksum offload, segmentation feature, queue steering, dan polling behavior semuanya dapat mengubah jumlah pekerjaan yang terkait dengan satu interrupt.
Akibatnya, packets per interrupt bukan ukuran efisiensi universal. Satu interrupt dapat mewakili jumlah pekerjaan protocol yang berbeda pada sistem atau konfigurasi offload yang berbeda.
Perbandingan paling berguna ketika hardware, driver, jumlah queue, konfigurasi offload, bentuk traffic, dan penempatan CPU dibuat tetap.
Kontrol praktisnya adalah frekuensi notifikasi
Interrupt coalescing tidak membuat pemrosesan paket gratis dan tidak meningkatkan link speed. Ia mengatur seberapa sering adapter meminta CPU menangani pekerjaan network yang telah selesai.
Delay lebih pendek dan batch lebih kecil mengutamakan notifikasi cepat. Delay lebih panjang dan batch lebih besar mengutamakan overhead interrupt yang lebih rendah. Traffic rate menentukan seberapa cepat threshold terpenuhi, sedangkan timer memberi batas waktu tunggu saat traffic ringan.
Hasil akhirnya adalah keputusan antara latensi dan CPU. Ukur kedua sisi pertukaran tersebut pada pola traffic nyata alih-alih menganggap jumlah interrupt paling sedikit sebagai hasil terbaik.