การวิเคราะห์ประสิทธิภาพล่าสุดที่เปรียบเทียบการใช้งาน io_uring ของ Zig กับเครื่องมือ benchmark มาตรฐานอุตสาหกรรมอย่าง FIO ได้จุดประกายการสนทนาที่น่าสนใจเกี่ยวกับการเพิ่มประสิทธิภาพ file I/O และวิธีการ benchmark การศึกษานี้ได้ผลลัพธ์ที่น่าประทับใจ โดย Zig ทำความเร็วในการเขียน 3.8 GB/s และการอ่าน 7.0 GB/s เมื่อเทียบกับ FIO ที่ทำได้ 4.1 GB/s และ 7.3 GB/s ตามลำดับ
การเปรียบเทียบประสิทธิภาพ
เครื่องมือ | ความเร็วในการเขียน | ความเร็วในการอ่าน | การดำเนินการ I/O ต่อวินาที |
---|---|---|---|
FIO | 4.083 GB/s | 7.33 GB/s | ~14,000 |
Zig | 3.802 GB/s | 6.996 GB/s | ~14,000 |
![]() |
---|
จุดตัดของตัวชี้วัดประสิทธิภาพ ซึ่งแสดงด้วยรูปเรขาคณิตตัว 'X' ที่โดดเด่น เป็นสัญลักษณ์ของลักษณะการแข่งขันของความเร็วในการ I/O ไฟล์ |
ตัวเลขประสิทธิภาพซ่อนความเรียบง่ายที่แท้จริง
แม้ว่าตัวเลขหลักจะดูน่าประทับใจ แต่การวิเคราะห์จากชุมชนเผยให้เห็นว่าเงื่อนไข benchmark ทำให้ความสำเร็จนี้ดูไม่น่าทึ่งเท่าที่ควรจะเป็น throughput 7 GB/s ที่ block size 512 KB แปลเป็นเพียงประมาณ 14,000 operations ต่อวินาที ซึ่งแสดงถึงประมาณ 70 microseconds ต่อ I/O operation นี่เป็น workload ที่ค่อนข้างเบา ๆ ที่สามารถจัดการได้อย่างมีประสิทธิภาพแม้กระทั่งกับแนวทาง synchronous I/O พื้นฐาน
การสนทนาเน้นย้ำว่า benchmark ก่อนหน้านี้จากผู้เขียนคนเดียวกันแสดงให้เห็นอัตรา operation ที่สูงกว่ามากประมาณ 240,000 I/O operations ต่อวินาที ซึ่งบ่งบอกว่าสถานการณ์ทดสอบนี้ไม่ได้ใช้ความสามารถของ NVMe storage สมัยใหม่อย่างเต็มที่
การกำหนดค่าการทดสอบ
- ฮาร์ดแวร์: CPU Ryzen EPYC 32 คอร์, RAM 756 GB, SSD NVMe สำหรับศูนย์ข้อมูล
- ระบบปฏิบัติการ: Ubuntu 24.04 พร้อม kernel 6.14
- ขนาดบล็อก: 512 KB
- ความลึกของคิว: 64
- ขนาดไฟล์: 16 GB
- การตั้งค่าพิเศษ: nvme.poll_queues=16, เปิดใช้งาน direct I/O
ตัวเลือกการใช้งานเทคนิคถูกตรวจสอบ
การใช้งาน Zig รวมคุณสมบัติ io_uring ขั้นสูงหลายอย่าง รวมถึง polled I/O, registered buffers และ kernel-side busy polling (SQTHREAD_POLL) อย่างไรก็ตาม สมาชิกชุมชนได้ระบุจุดที่อาจปรับปรุงได้ ข้อสังเกตที่น่าสนใจอย่างหนึ่งเกี่ยวกับค่าคงที่ alignment 512-byte ที่ hard-coded ในขณะที่ NVMe drive สมัยใหม่หลายตัวสามารถ reformat ใหม่เพื่อใช้ logical block size 4096-byte เพื่อประสิทธิภาพที่ดีกว่า
ความซับซ้อนของ storage block size เพิ่มอีกชั้นหนึ่งให้กับความท้าทายในการเพิ่มประสิทธิภาพ NVMe drive สมัยใหม่ทำงานกับ block size หลายแบบ - LBA size สำหรับการถ่ายโอน OS, NAND page size พื้นฐานสำหรับ read/write operations และ erase block size สำหรับ wear leveling การเข้าใจความแตกต่างเหล่านี้มีความสำคัญอย่างยิ่งสำหรับการปรับแต่งประสิทธิภาพที่เหมาะสม
ประเภทขนาดบล็อกของ NVMe
- ขนาด LBA: 512B หรือ 4KB (สามารถกำหนดค่าได้สำหรับการถ่ายโอนข้อมูลของ OS)
- ขนาดเพจ NAND: ~16KB+ (ความละเอียดในการอ่าน/เขียน)
- ขนาดบล็อกลบ: หลายเมกะไบต์ (การกระจายการสึกหรอ)
- ความละเอียด FTL: โดยปกติ 4KB (การดำเนินการเขียนแบบอะตอมิก)
โอกาสการเพิ่มประสิทธิภาพที่หายไป
ความคิดเห็นจากชุมชนแนะนำการปรับปรุงที่เป็นไปได้หลายประการสำหรับการใช้งาน การไม่มี registered file descriptors ซึ่งสามารถให้ประโยชน์ด้านประสิทธิภาพอย่างมากกับ io_uring ถูกสังเกตว่าอาจเป็นการมองข้าม นอกจากนี้ยังมีคำถามเกี่ยวกับกลยุทธ์การจัดสรร memory โดยมีข้อเสนแนะให้ใช้ page allocators สำหรับ aligned memory แทนแนวทาง over-allocation
มันคือ hardware block size ที่สำคัญจริง ๆ ในกรณีนี้ (direct I/O) ค่านั้นเป็นคุณสมบัติของ hardware และไม่สามารถเปลี่ยนแปลงได้
ลักษณะเฉพาะของเวอร์ชันของ Zig I/O APIs ที่พัฒนาอย่างรวดเร็วก็ได้รับความสนใจ โดยสมาชิกชุมชนเน้นย้ำความสำคัญของการบันทึกเวอร์ชัน Zig ที่ใช้อย่างชัดเจนเพื่อการทำซ้ำได้
สรุป
แม้ว่าการใช้งาน Zig จะแสดงให้เห็นประสิทธิภาพที่แข่งขันได้กับเครื่องมือที่มีชื่อเสียงอย่าง FIO สำเร็จ แต่การสนทนาของชุมชนเผยให้เห็นว่าทั้งสถานการณ์ benchmark และการใช้งานยังมีที่ว่างสำหรับการเพิ่มประสิทธิภาพ อัตรา I/O operation ที่ค่อนข้างต่ำบ่งบอกว่า workload ที่ต้องการมากกว่านี้จะให้ข้อมูลเชิงลึกที่ดีกว่าเกี่ยวกับลักษณะประสิทธิภาพที่แท้จริงของแนวทางต่าง ๆ สำหรับนักพัฒนาที่ทำงานกับแอปพลิเคชัน I/O ประสิทธิภาพสูง การเข้าใจความแตกต่างของลักษณะ storage hardware และคุณสมบัติ io_uring ยังคงมีความสำคัญอย่างยิ่งสำหรับการบรรลุผลลัพธ์ที่เหมาะสมที่สุด