Một phân tích hiệu suất gần đây so sánh triển khai io_uring của Zig với công cụ benchmark tiêu chuẩn ngành FIO đã khơi dậy những cuộc thảo luận thú vị về tối ưu hóa file I/O và phương pháp benchmark. Nghiên cứu đạt được kết quả ấn tượng, với Zig đạt tốc độ ghi 3.8 GB/s và đọc 7.0 GB/s so với 4.1 GB/s và 7.3 GB/s tương ứng của FIO .
So sánh hiệu suất
Công cụ | Tốc độ ghi | Tốc độ đọc | Số thao tác I/O/giây |
---|---|---|---|
FIO | 4.083 GB/s | 7.33 GB/s | ~14,000 |
Zig | 3.802 GB/s | 6.996 GB/s | ~14,000 |
![]() |
---|
Sự giao thoa của các chỉ số hiệu suất, được thể hiện bằng hình chữ "X" hình học đậm nét, tượng trưng cho bản chất cạnh tranh của tốc độ file I/O |
Những con số hiệu suất che giấu sự đơn giản bên dưới
Mặc dù những con số chính có vẻ ấn tượng, phân tích từ cộng đồng cho thấy rằng các điều kiện benchmark khiến thành tích này ít đáng chú ý hơn so với vẻ ngoài ban đầu. Thông lượng 7 GB/s với kích thước khối 512 KB chỉ tương đương khoảng 14,000 thao tác mỗi giây, tức là khoảng 70 microsecond cho mỗi thao tác I/O. Đây thực tế là một khối lượng công việc tương đối khiêm tốn có thể được xử lý hiệu quả ngay cả với các phương pháp I/O đồng bộ cơ bản.
Cuộc thảo luận nhấn mạnh rằng các benchmark trước đó từ cùng tác giả đã chứng minh tốc độ thao tác cao hơn nhiều khoảng 240,000 thao tác I/O mỗi giây, cho thấy rằng kịch bản thử nghiệm cụ thể này không thực sự đẩy khả năng lưu trữ NVMe hiện đại đến giới hạn.
Cấu hình kiểm thử
- Phần cứng: CPU Ryzen EPYC 32 nhân, RAM 756 GB, SSD NVMe Datacenter
- Hệ điều hành: Ubuntu 24.04 với kernel 6.14
- Kích thước khối: 512 KB
- Độ sâu hàng đợi: 64
- Kích thước tệp: 16 GB
- Cài đặt đặc biệt: nvme.poll_queues=16, bật direct I/O
Các lựa chọn triển khai kỹ thuật bị đặt dưới kính hiển vi
Triển khai Zig tích hợp một số tính năng io_uring tiên tiến bao gồm polled I/O, registered buffers và kernel-side busy polling ( SQTHREAD_POLL ). Tuy nhiên, các thành viên cộng đồng đã xác định những lĩnh vực có thể cải thiện. Một quan sát đáng chú ý liên quan đến hằng số alignment 512-byte được mã hóa cứng, trong khi nhiều ổ NVMe hiện đại có thể được định dạng lại để sử dụng kích thước khối logic 4096-byte cho hiệu suất tốt hơn.
Sự phức tạp của kích thước khối lưu trữ thêm một lớp thách thức khác cho việc tối ưu hóa. Các ổ NVMe hiện đại thực tế hoạt động với nhiều kích thước khối - kích thước LBA cho việc truyền tải OS, kích thước trang NAND bên dưới cho các thao tác đọc/ghi, và kích thước khối xóa cho wear leveling. Hiểu được những mức độ chi tiết khác nhau này là rất quan trọng để điều chỉnh hiệu suất tối ưu.
Các Loại Kích Thước Block NVMe
- Kích Thước LBA: 512B hoặc 4KB (có thể cấu hình cho việc truyền tải OS)
- Kích Thước NAND Page: ~16KB+ (độ chi tiết đọc/ghi)
- Kích Thước Erase Block: Vài MB (cân bằng độ mòn)
- Độ Chi Tiết FTL: Thường là 4KB (các thao tác ghi nguyên tử)
Những cơ hội tối ưu hóa bị bỏ lỡ
Phản hồi từ cộng đồng đề xuất một số cải tiến tiềm năng cho triển khai. Việc thiếu registered file descriptors, có thể mang lại lợi ích hiệu suất đáng kể với io_uring , được ghi nhận như một sự thiếu sót có thể xảy ra. Ngoài ra, các câu hỏi nảy sinh về chiến lược phân bổ bộ nhớ, với đề xuất sử dụng page allocators cho bộ nhớ được căn chỉnh thay vì các phương pháp over-allocation.
Thực sự là kích thước khối phần cứng mới quan trọng trong trường hợp này (direct I/O). Giá trị đó là thuộc tính của phần cứng và không thể thay đổi.
Bản chất phụ thuộc phiên bản của các API I/O đang phát triển nhanh chóng của Zig cũng thu hút sự chú ý, với các thành viên cộng đồng nhấn mạnh tầm quan trọng của việc ghi chép rõ ràng phiên bản Zig nào được sử dụng để có thể tái tạo.
Kết luận
Mặc dù triển khai Zig đã thành công chứng minh hiệu suất cạnh tranh với các công cụ đã được thiết lập như FIO , cuộc thảo luận cộng đồng cho thấy rằng cả kịch bản benchmark và triển khai đều còn chỗ để tối ưu hóa. Tốc độ thao tác I/O tương đối thấp cho thấy rằng các khối lượng công việc đòi hỏi cao hơn sẽ cung cấp những hiểu biết tốt hơn về đặc tính hiệu suất thực sự của các phương pháp khác nhau. Đối với các nhà phát triển làm việc trên các ứng dụng I/O hiệu suất cao, việc hiểu các sắc thái của đặc tính phần cứng lưu trữ và các tính năng io_uring vẫn rất quan trọng để đạt được kết quả tối ưu.
Tham khảo: Hitting Peak File IO Performance with Zig