vmsplice terlalu cepat
- Beberapa program menggunakan system call bernama
vmsplice untuk memindahkan data melalui pipe dengan lebih cepat
- Ditemukan bahwa pipe Linux lebih lambat dari yang diperkirakan ketika tidak menggunakan
vmsplice
- Sedang menulis program untuk mengenkode/dekode kode Morse dengan cepat, dan menggunakan pipe untuk itu
Menulis data dalam kondisi ideal
- Program di bawah ini menyalin data tanpa system call
- Berjalan pada kecepatan 167 GB/s menggunakan AVX-512
- Saat AVX-512 dinonaktifkan dan diuji dengan AVX2 serta SSE2, kecepatannya tetap sama (167 GB/s)
- Selama vektorisasi digunakan, kecepatan 167 GB/s bisa dicapai
Benar-benar menulis data ke pipe
- Setelah menulis dan mengukur program yang menulis data ke pipe, tercatat kecepatan 17 GB/s
- Ini 10 kali lebih lambat dibanding menulis ke buffer
- Hasil profiling menunjukkan sebagian besar waktu dihabiskan pada pemanggilan
write
- Banyak waktu dihabiskan untuk mengalokasikan halaman memori di fungsi
pipe_write
- Penyalinan data itu sendiri hanya memakan 20% waktu CPU, tetapi tetap dua kali lebih lambat daripada
__memset_avx512_unaligned_erms
Bantuan dari vmsplice
vmsplice memindahkan buffer dari user space ke kernel tanpa menyalinnya
- Dengan
vmsplice, kecepatan 210 GB/s dapat dicapai
vmsplice melewati bagian mahal dari system call write
Penutup
- Menulis ke pipe 10 kali lebih lambat daripada menulis ke memori mentah
- Hal ini disebabkan oleh biaya mengunci buffer serta menyimpan dan memulihkan konteks SIMD
splice dan vmsplice menghindari biaya ini dan memindahkan data secara efisien
Ringkasan GN⁺
- Artikel ini menjelaskan cara memaksimalkan performa pipe Linux dengan menggunakan
vmsplice
vmsplice sangat meningkatkan performa dengan memindahkan data secara langsung tanpa menyalinnya ke ruang kernel
- Berguna untuk program pemrosesan data berkecepatan tinggi seperti enkode/dekode kode Morse
- Proyek lain dengan fungsi serupa antara lain
splice dan sendfile
1 komentar
Komentar Hacker News
Alasan
JMPtidak digantikan denganRETadalah karena opsi CONFIG_RETHUNKobjdump, bisa dilihat hasilRETyang digantikan menjadiJMP __x86_return_thunkInstruksi NOP di awal dan akhir fungsi memungkinkan ftrace menyisipkan instruksi pelacakan
Side project seorang pengguna mengusulkan system call yang menyediakan ring buffer untuk file descriptor
Menyebut pipe Linux "lambat" itu seperti menyebut Toyota Corolla "lambat"
Pada CPU modern,
rep movsbsecepat versi tervectorisasi yang paling cepatAVX512 boros daya dan memicu penskalaan frekuensi CPU
Sedang kembali mengalami "hug of death" dari Hacker News
Menarik untuk melihat versi yang menggunakan io_uring
Klaim bahwa waktu muat blog sekitar 20 detik adalah pernyataan yang berani
Hampir semua bentuk IPC itu "lambat"
Awalnya tidak mengerti mengapa splice bisa selambat itu