1 poin oleh GN⁺ 2023-10-06 | 1 komentar | Bagikan ke WhatsApp
  • 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

 
GN⁺ 2023-10-06
Opini Hacker News
  • Artikel tentang kecepatan pipe Linux, berfokus pada vmsplice yang bekerja sebagai mekanisme mini shared memory antara dua proses
  • Penggunaan vmsplice memerlukan penanganan buffer yang cermat saat membaca dan menulis, dan meskipun kompleks, bisa efisien
  • Implementasi standar pipe Linux dilaporkan 20 kali lebih lambat daripada kecepatan optimal
  • Artikel ini diterima dengan baik, dan para pembaca memuji sifatnya yang informatif
  • Seorang pembaca menunjukkan bahwa pipe Linux dapat menciptakan perilaku deterministik, serta menautkan sumber eksternal untuk bacaan lebih lanjut
  • Muncul pertanyaan tentang library pemrosesan data yang menyediakan abstraksi di atas pipe, socket, file, dan memori, serta apakah mereka menerapkan optimasi yang dibahas dalam artikel
  • Artikel ini menyebut API seperti splice() dan vmsplice(), yang dilaporkan sulit digunakan dan jarang dimanfaatkan di sebagian besar program
  • Kecepatan pipe Linux dibandingkan dengan kecepatan satu inti CPU dalam sistem; kernel memetakan halaman memori fisik yang sama dari stdout satu program ke stdin program lain, sehingga operasinya menjadi zerocopy atau, dalam situasi yang kurang optimal, onecopy yang cepat
  • Artikel ini menghubungkan konsep page table dengan analisis performa menggunakan perf, dan menekankan pentingnya hal itu terhadap throughput
  • Seorang pembaca berbagi pengalaman tentang implementasi pipe Cygwin, dan menyebut kecepatannya lebih lambat dibanding Linux
  • Kecepatan pipe Linux dinilai cukup untuk merangkai dan menyusun perintah seperti cat, sed, awk, cut, grep, uniq, dan jq berulang kali