vmsplice เร็ว_เกินไป_
- บางโปรแกรมใช้ system call ชื่อ
vmsplice เพื่อย้ายข้อมูลผ่าน pipe ให้เร็วขึ้น
- พบว่าเมื่อไม่ใช้
vmsplice แล้ว Linux pipe ช้ากว่าที่คาดไว้
- กำลังเขียนโปรแกรมสำหรับเข้ารหัส/ถอดรหัส Morse code อย่างรวดเร็ว และใช้ pipe สำหรับงานนี้
การเขียนข้อมูลในสภาพแวดล้อมอุดมคติ
- โปรแกรมด้านล่างคัดลอกข้อมูลโดยไม่ต้องมี system call
- ทำงานได้ที่ความเร็ว 167 GB/s โดยใช้ AVX-512
- เมื่อปิดใช้งาน AVX-512 และทดสอบด้วย AVX2 และ SSE2 ก็ยังได้ความเร็วเท่าเดิมที่ 167 GB/s
- ตราบใดที่มีการใช้ vectorization ก็สามารถทำความเร็ว 167 GB/s ได้
การเขียนข้อมูลลง pipe จริง
- เขียนโปรแกรมที่ส่งข้อมูลลง pipe และวัดผล ได้ความเร็ว 17 GB/s
- ช้ากว่าการเขียนลงบัฟเฟอร์ถึง 10 เท่า
- ผลการทำ profiling พบว่าเวลาส่วนใหญ่ถูกใช้ไปกับการเรียก
write
- ใช้เวลาอย่างมากในการจัดสรร memory page ในฟังก์ชัน
pipe_write
- ตัวการคัดลอกข้อมูลเองใช้เวลา CPU เพียง 20% แต่ก็ยังช้ากว่า
__memset_avx512_unaligned_erms อยู่สองเท่า
ความช่วยเหลือจาก vmsplice
vmsplice ย้ายบัฟเฟอร์จาก user space ไปยัง kernel โดยไม่คัดลอกข้อมูล
- เมื่อใช้
vmsplice สามารถทำความเร็วได้ 210 GB/s
vmsplice ช่วยเลี่ยงส่วนที่มีต้นทุนสูงของ system call write
สรุปท้ายบท
- การเขียนลง pipe ช้ากว่าการเขียนลงหน่วยความจำดิบอยู่ 10 เท่า
- สาเหตุคือค่าใช้จ่ายในการล็อกบัฟเฟอร์และค่าใช้จ่ายในการบันทึกและกู้คืน SIMD context
splice และ vmsplice ช่วยหลีกเลี่ยงค่าใช้จ่ายเหล่านี้และย้ายข้อมูลได้อย่างมีประสิทธิภาพ
สรุปโดย GN⁺
- บทความนี้อธิบายวิธีรีดประสิทธิภาพสูงสุดของ Linux pipe ด้วย
vmsplice
vmsplice ย้ายข้อมูลได้โดยตรงโดยไม่ต้องคัดลอกเข้า kernel space จึงช่วยเพิ่มประสิทธิภาพอย่างมาก
- มีประโยชน์สำหรับโปรแกรมประมวลผลข้อมูลความเร็วสูง เช่น การเข้ารหัส/ถอดรหัส Morse code
- โครงการอื่นที่มีความสามารถคล้ายกัน ได้แก่
splice และ sendfile
1 ความคิดเห็น
ความเห็นจาก Hacker News
เหตุผลที่
JMPไม่ถูกแทนที่ด้วยRETเป็นเพราะตัวเลือก CONFIG_RETHUNKRETถูกแทนที่ด้วยJMP __x86_return_thunkได้จากดิสแอสเซมบลีของ objdumpคำสั่ง NOP ที่ต้นและท้ายของฟังก์ชันมีไว้เพื่อให้ ftrace สามารถแทรกคำสั่งสำหรับการติดตามได้
โปรเจกต์ข้างเคียงของผู้ใช้รายหนึ่งเสนอ system call ที่ให้ ring buffer สำหรับ file descriptor
การเรียก Linux pipe ว่า "ช้า" ก็เหมือนการเรียก Toyota Corolla ว่า "ช้า"
บน CPU สมัยใหม่
rep movsbเร็วพอๆ กับเวอร์ชันที่ทำเวกเตอร์ไรซ์แล้วซึ่งเร็วที่สุดAVX512 ใช้พลังงานสูงและทำให้เกิดการสเกลความถี่ของ CPU
กำลังเจอกับ "hug of death" จาก Hacker News อีกครั้ง
น่าสนใจหากได้เห็นเวอร์ชันที่ใช้ io_uring
การบอกว่าการโหลดบล็อกใช้เวลาประมาณ 20 วินาทีเป็นคำกล่าวที่กล้ามาก
IPC แทบทุกรูปแบบนั้น "ช้า"
เดิมทีไม่เข้าใจว่าทำไม splice ถึงช้านัก