การใช้งาน io_uring ของ Zig ทำประสิทธิภาพใกล้เคียง FIO แต่เผยข้อจำกัดของ Benchmark

ทีมชุมชน BigGo
การใช้งาน io_uring ของ Zig ทำประสิทธิภาพใกล้เคียง FIO แต่เผยข้อจำกัดของ Benchmark

การวิเคราะห์ประสิทธิภาพล่าสุดที่เปรียบเทียบการใช้งาน 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 ไฟล์
จุดตัดของตัวชี้วัดประสิทธิภาพ ซึ่งแสดงด้วยรูปเรขาคณิตตัว '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 ยังคงมีความสำคัญอย่างยิ่งสำหรับการบรรลุผลลัพธ์ที่เหมาะสมที่สุด

อ้างอิง: Hitting Peak File IO Performance with Zig