- Menjelajahi implementasi pipe Unix di Linux dan cara mengoptimalkan program uji yang menulis dan membaca data melalui pipe
- Program awal memiliki throughput sekitar 3.5GiB/s, dan melalui berbagai optimasi angka ini ditingkatkan 20 kali lipat
- Optimasi ini dilakukan dengan memprofilkan program menggunakan alat
perf di Linux
- Artikel ini terinspirasi oleh program FizzBuzz yang dioptimalkan dan mendorong output ke pipe pada kecepatan ~35GiB/s
- Menggali secara mendalam cara kerja internal pipe, alasan menulis dan membaca darinya lambat, serta bagaimana system call
vmsplice dan splice dapat meningkatkan performa
- Membahas bagaimana paging Linux dan penggunaan huge pages dapat menghasilkan versi program yang lebih cepat
- Optimasi terakhir mencakup penggantian polling dengan busy loop
- Pengujian dilakukan pada CPU Intel Skylake i7-8550U dan Linux 5.17
- Artikel ini menjelaskan secara rinci bagaimana memori tersusun dari page berukuran tetap dan bagaimana CPU menggunakan page table untuk menerjemahkan alamat virtual ke alamat fisik
- Artikel ini menyimpulkan dengan pengamatan bahwa beralih ke huge pages dalam program dapat meningkatkan performa sekitar 50%
- Artikel ini membahas penggunaan huge pages di CPU dan cara mengurangi miss pada Translation Lookaside Buffer (TLB), yang dapat meningkatkan performa
- Kode kernel mengasumsikan bahwa
struct page menunjuk ke page berukuran standar pada arsitektur saat ini. Untuk huge pages, head struct page berisi informasi tentang page fisik yang sebenarnya, sementara page tail yang berurutan hanya berisi pointer yang menunjuk ke page head
- Kernel yang lebih baru (setelah 5.17) menyertakan tipe baru,
struct folio, yang secara eksplisit mengidentifikasi page head. Ini meningkatkan performa dengan mengurangi kebutuhan untuk memeriksa saat runtime apakah struct page adalah page head atau page tail
- Artikel ini membahas konsep busy loop untuk menghindari biaya sinkronisasi. Ini dilakukan dengan meminta
vmsplice untuk mengembalikan kontrol jika pipe tidak bisa ditulisi, lalu menjalankan busy loop sampai siap. Ini dapat memberi peningkatan performa 25%, tetapi dengan biaya satu inti CPU terpakai penuh sampai vmsplice siap
- Penulis merangkum topik-topik utama yang dibahas dalam artikel: operasi zero-copy, ring buffer, paging & memori virtual, overhead sinkronisasi
- Penulis juga mengakui bahwa ada banyak opsi dan detail lain yang tidak dibahas dalam artikel, karena dianggap tidak relevan atau kurang menarik
- Artikel ini diterima dengan baik oleh para pembaca, karena mereka menganggapnya membantu dan menarik
1 komentar
Opini Hacker News
vmspliceyang bekerja sebagai mekanisme mini shared memory antara dua prosesvmsplicememerlukan penanganan buffer yang cermat saat membaca dan menulis, dan meskipun kompleks, bisa efisiensplice()danvmsplice(), yang dilaporkan sulit digunakan dan jarang dimanfaatkan di sebagian besar programstdoutsatu program kestdinprogram lain, sehingga operasinya menjadizerocopyatau, dalam situasi yang kurang optimal,onecopyyang cepatperf, dan menekankan pentingnya hal itu terhadap throughputcat,sed,awk,cut,grep,uniq, danjqberulang kali