vmsplice quá nhanh
- Một số chương trình sử dụng lời gọi hệ thống
vmsplice để chuyển dữ liệu qua pipe nhanh hơn
- Khi không dùng
vmsplice, người ta phát hiện pipe trên Linux chậm hơn dự kiến
- Tác giả đang viết một chương trình mã hóa/giải mã mã Morse tốc độ cao và đang dùng pipe cho việc này
Ghi dữ liệu trong môi trường lý tưởng
- Chương trình bên dưới sao chép dữ liệu mà không cần lời gọi hệ thống
- Sử dụng AVX-512 và chạy ở tốc độ 167 GB/s
- Khi tắt AVX-512 và thử với AVX2 cùng SSE2, vẫn ghi nhận cùng tốc độ 167 GB/s
- Miễn là có vector hóa, có thể đạt tốc độ 167 GB/s
Thực sự ghi dữ liệu vào pipe
- Sau khi viết chương trình ghi dữ liệu vào pipe và đo đạc, tác giả ghi nhận tốc độ 17 GB/s
- Con số này chậm hơn 10 lần so với ghi vào bộ đệm
- Kết quả profiling cho thấy phần lớn thời gian bị tiêu tốn trong lệnh gọi
write
- Hàm
pipe_write mất nhiều thời gian để cấp phát các trang bộ nhớ
- Bản thân việc sao chép dữ liệu chỉ chiếm 20% thời gian CPU, nhưng vẫn chậm gấp đôi
__memset_avx512_unaligned_erms
Nhờ đến vmsplice
vmsplice di chuyển bộ đệm từ không gian người dùng sang kernel mà không sao chép dữ liệu
- Dùng
vmsplice có thể đạt tốc độ 210 GB/s
vmsplice bỏ qua phần tốn kém trong lệnh gọi hệ thống write
Kết luận
- Ghi vào pipe chậm hơn 10 lần so với ghi vào bộ nhớ thô
- Nguyên nhân là chi phí khóa bộ đệm và chi phí lưu/khôi phục ngữ cảnh SIMD
splice và vmsplice tránh được các chi phí này và di chuyển dữ liệu hiệu quả
Tóm tắt của GN⁺
- Bài viết giải thích cách tối đa hóa hiệu năng pipe trên Linux bằng
vmsplice
vmsplice cải thiện hiệu năng đáng kể bằng cách di chuyển dữ liệu trực tiếp mà không sao chép vào không gian kernel
- Hữu ích cho các chương trình xử lý dữ liệu tốc độ cao như mã hóa/giải mã mã Morse
- Các dự án khác có chức năng tương tự gồm
splice và sendfile
1 bình luận
Ý kiến trên Hacker News
Lý do
JMPkhông được thay bằngRETlà do tùy chọn CONFIG_RETHUNKRETđã được thay bằngJMP __x86_return_thunkCác lệnh NOP ở đầu và cuối hàm cho phép ftrace chèn lệnh theo dõi
Side project của một người dùng đề xuất một system call cung cấp ring buffer cho file descriptor
Gọi Linux pipe là "chậm" cũng giống như gọi Toyota Corolla là "chậm"
Trên CPU hiện đại,
rep movsbnhanh ngang với phiên bản vector hóa nhanh nhấtAVX512 tiêu thụ nhiều điện năng và gây ra việc scale tần số CPU
Đang lại trải nghiệm "hug of death" từ Hacker News
Sẽ rất thú vị nếu có một phiên bản dùng io_uring
Việc blog mất khoảng 20 giây để tải là một tuyên bố khá táo bạo
Gần như mọi hình thức IPC đều "chậm"
Ban đầu tôi không hiểu vì sao splice lại chậm đến vậy