- Tự biên dịch gói mã nguồn
jq do Ubuntu cung cấp có thể cải thiện hiệu năng lên tới 90%
- Tối đa hóa hiệu năng bằng cách cải thiện trình biên dịch, cờ tối ưu hóa và bộ cấp phát bộ nhớ
Thiết lập
jq được dùng để xử lý các tệp GeoJSON ở định dạng JSON
- Chạy truy vấn để in ra tên thành phố của mọi parcel có giá trị từ một ngưỡng nhất định trở lên trong bản đồ parcel của Alameda County Assessor dung lượng 500MB
- Trên hệ thống Ryzen 9 9950X, mất khoảng 5 giây với tệp đã được cache, nên đã thử cải thiện điều này
Bước 1: Biên dịch lại gói
- Tải mã nguồn
jq từ Launchpad rồi biên dịch lại mà không dùng cờ nào
- Kết quả: cải thiện hiệu năng 2~4%
- Kết quả benchmark
- jq đã biên dịch: trung bình 4.517 giây
- gói mặc định của Ubuntu: trung bình 4.641 giây
- Cải thiện hiệu năng: nhanh hơn 1,03 lần
Bước 2: Dùng Clang và cờ tối ưu hóa nâng cao
- Biên dịch bằng Clang-18 và dùng mức tối ưu hóa cùng LTO
- Các cờ chính đã dùng:
-O3 → tăng mức tối ưu hóa
-flto → áp dụng Link-Time Optimization
-DNDEBUG → loại bỏ mã debug
- Kết quả benchmark
- jq đã biên dịch: trung bình 3.853 giây
- gói mặc định của Ubuntu: trung bình 4.631 giây
- Cải thiện hiệu năng: nhanh hơn 1,20 lần
Bước 3: Thêm TCMalloc
- Dùng TCMalloc thay cho malloc mặc định của GNU libc
- Thêm
-L/usr/lib/x86_64-linux-gnu -ltcmalloc_minimal rồi biên dịch
- Kết quả benchmark
- jq đã biên dịch: trung bình 3.253 giây
- gói mặc định của Ubuntu: trung bình 4.611 giây
- Cải thiện hiệu năng: nhanh hơn 1,42 lần
Bước 4: Áp dụng preload động cho TCMalloc
- Dùng TCMalloc bằng preload động với gói mặc định của Ubuntu
- Kết quả benchmark
- jq mặc định: trung bình 4.601 giây
- jq có áp dụng TCMalloc: trung bình 4.082 giây
- Cải thiện hiệu năng: nhanh hơn 1,13 lần
Bước 5: Thử preload động với các bộ cấp phát khác
- Thử jemalloc và mimalloc, các bộ cấp phát bộ nhớ khác có trong Ubuntu
- mimalloc cho hiệu năng tốt nhất
- Kết quả benchmark
- jq mặc định: trung bình 4.123 giây
- jq có áp dụng TCMalloc: trung bình 4.130 giây
- jq có áp dụng Jemalloc: trung bình 3.510 giây
- jq có áp dụng Mimalloc: trung bình 3.154 giây → hiệu năng tăng 1,31 lần
Bước 6: Biên dịch trực tiếp với mimalloc
- Liên kết tĩnh với mimalloc thay vì dùng preload động
- Tối đa hóa hiệu năng
- Kết quả benchmark
- jq đã biên dịch: trung bình 2.428 giây
- gói mặc định của Ubuntu: trung bình 4.606 giây
- Cải thiện hiệu năng: nhanh hơn 1,90 lần
🚀 Kết quả cuối cùng
- jq tự biên dịch nhanh hơn 90% so với gói Ubuntu
- Hiệu năng xử lý 13.000 tệp JSON tổng dung lượng 2,2GB:
- jq đã biên dịch: 0.755 giây
- jq mặc định: 1.424 giây
- Cải thiện hiệu năng: gần 2 lần
1 bình luận
Ý kiến trên Hacker News
Tiêu đề "Làm gói Ubuntu nhanh hơn 90% bằng cách biên dịch lại và thay đổi trình cấp phát bộ nhớ" có vẻ như câu kéo nhấp chuột
jemallocđể thay thế triển khaimalloc, và đã nhận được kết quả tích cực trong việc ổn định mức sử dụng bộ nhớKỹ thuật là nghệ thuật của sự đánh đổi
glibcmang lại độ ổn định dài hạnGentoo Linux là hệ điều hành được thiết kế để có thể tối ưu hóa cho từng mục đích sử dụng cụ thể của người dùng
Nếu cài thủ công các gói như
jqthì có thể bị bỏ lỡ các bản cập nhật bảo mậtonigurama, và nếu tình huống tương tự lặp lại thì có thể trở nên dễ bị tấn côngCVE-2017-9224Dùng
mallockhông chính thức có thể gây ra những lỗi kỳ lạĐọc thấy chỉ với thay đổi đơn giản mà có thể tăng tốc lớn như vậy khiến tôi muốn báo cho tác giả
jqViệc biên dịch gói từ mã nguồn hoặc tải binary chính thức có thể mang lại lợi ích
Tính năng
cargo installcủa Rust rất hữu ích vì cho phép tối ưu hóa cho từng nền tảng cụ thểjaqvàyqlà những lựa chọn tôi thường dùng để cải thiện hiệu năng khi dùngjqSau khi thay đổi trình cấp phát bộ nhớ, có thể biên dịch lại gói Ubuntu để làm nó nhanh hơn 90%