1 poin oleh GN⁺ 2025-03-19 | 1 komentar | Bagikan ke WhatsApp
  • Jika membangun sendiri paket source code jq yang disediakan Ubuntu, performanya bisa meningkat hingga 90%
  • Performa dimaksimalkan dengan meningkatkan compiler, flag optimasi, dan allocator memori

Pengaturan

  • jq digunakan untuk memproses file GeoJSON berformat JSON
    • Menjalankan kueri yang menampilkan nama kota dari semua parcel yang bernilai di atas ambang tertentu pada parcel map Alameda County Assessor berukuran 500MB
  • Pada sistem Ryzen 9 9950X, dibutuhkan sekitar 5 detik untuk file yang sudah tercache, sehingga dicoba untuk ditingkatkan

Langkah 1: Membangun ulang paket

  • Mengunduh source code jq dari Launchpad lalu membangunnya ulang tanpa flag apa pun
  • Hasil: peningkatan performa 2~4%
  • Hasil benchmark
    • jq hasil build: rata-rata 4.517 detik
    • Paket bawaan Ubuntu: rata-rata 4.641 detik
    • Peningkatan performa: 1,03x lebih cepat

Langkah 2: Menggunakan Clang dan flag optimasi tingkat lanjut

  • Dikompilasi dengan Clang-18 dan menggunakan level optimasi serta LTO
  • Flag utama yang digunakan:
    • -O3 → meningkatkan level optimasi
    • -flto → menerapkan Link-Time Optimization
    • -DNDEBUG → mengecualikan kode debug
  • Hasil benchmark
    • jq hasil build: rata-rata 3.853 detik
    • Paket bawaan Ubuntu: rata-rata 4.631 detik
    • Peningkatan performa: 1,20x lebih cepat

Langkah 3: Menambahkan TCMalloc

  • Menggunakan TCMalloc alih-alih malloc bawaan GNU libc
  • Membangun dengan menambahkan -L/usr/lib/x86_64-linux-gnu -ltcmalloc_minimal
  • Hasil benchmark
    • jq hasil build: rata-rata 3.253 detik
    • Paket bawaan Ubuntu: rata-rata 4.611 detik
    • Peningkatan performa: 1,42x lebih cepat

Langkah 4: Menerapkan preload dinamis TCMalloc

  • Pada paket bawaan Ubuntu, TCMalloc digunakan melalui preload dinamis
  • Hasil benchmark
    • jq bawaan: rata-rata 4.601 detik
    • jq dengan TCMalloc: rata-rata 4.082 detik
    • Peningkatan performa: 1,13x lebih cepat

Langkah 5: Menguji preload dinamis allocator lain

  • Menguji allocator memori lain yang disediakan Ubuntu, yaitu jemalloc dan mimalloc
  • mimalloc memberikan performa terbaik
  • Hasil benchmark
    • jq bawaan: rata-rata 4.123 detik
    • jq dengan TCMalloc: rata-rata 4.130 detik
    • jq dengan Jemalloc: rata-rata 3.510 detik
    • jq dengan Mimalloc: rata-rata 3.154 detik → performa meningkat 1,31x

Langkah 6: Build langsung dengan mimalloc

  • Menautkan mimalloc secara statis, bukan lewat preload dinamis
  • Performa dimaksimalkan
  • Hasil benchmark
    • jq hasil build: rata-rata 2.428 detik
    • Paket bawaan Ubuntu: rata-rata 4.606 detik
    • Peningkatan performa: 1,90x lebih cepat

🚀 Hasil akhir

  • jq hasil build sendiri 90% lebih cepat daripada paket Ubuntu
  • Performa pemrosesan 13.000 file JSON berukuran total 2,2GB:
    • jq hasil build: 0.755 detik
    • jq bawaan: 1.424 detik
    • Peningkatan performa: sekitar 2x

1 komentar

 
GN⁺ 2025-03-19
Komentar Hacker News
  • Judul "Membuat Ubuntu 90% lebih cepat dengan membangun ulang paket dan mengganti allocator memori" terdengar seperti clickbait

    • Ini hanya membahas satu paket saja, dan sebagian peningkatan performa tidak dicapai lewat kompilasi ulang
    • Pernah punya pengalaman mengganti implementasi malloc dengan mem-preload jemalloc, dan hasilnya positif untuk menstabilkan penggunaan memori
    • Ini menyelesaikan masalah kebocoran memori, dan kemungkinan besar sebenarnya masalah fragmentasi memori, bukan masalah pada aplikasinya sendiri
  • Rekayasa adalah seni berkompromi

    • Artikel itu menjelaskan bahwa sebagian besar peningkatan performa didapat dengan membuat allocator memori lebih terspesialisasi
    • Dalam proyek multithread, pemilihan allocator itu penting, dan peningkatan kecepatan di satu proyek bisa menyebabkan crash di proyek lain
    • Strategi realloc juga perlu dipertimbangkan, dan perlu memilih antara stabilitas jangka panjang dan kecepatan jangka pendek
    • Saat mengembangkan editor video, pernah mencoba berbagai allocator dan menemukan bahwa allocator glibc memberi stabilitas jangka panjang
  • Gentoo Linux adalah sistem operasi yang dirancang agar bisa dioptimalkan sesuai kebutuhan spesifik pengguna

    • Setelah penyiapan awal, penggunaannya sederhana, dan ada kenangan mendapat banyak teman di kanal Gentoo Linux
    • ChromeOS versi awal pada dasarnya adalah instalasi Gentoo Linux kustom
  • Jika memasang paket seperti jq secara manual, Anda bisa tidak lagi menerima pembaruan keamanan

    • Misalnya, pernah ada pembaruan keamanan untuk onigurama, dan jika situasi seperti ini terulang, sistem bisa menjadi rentan
    • Ada kasus di mana berbagai kerentanan keamanan seperti CVE-2017-9224 dan lainnya telah diperbaiki
  • Menggunakan malloc tidak resmi bisa menimbulkan bug aneh

    • Jika melampaui flag yang digunakan para pengembang, kemungkinan besar masalah akan muncul
  • Setelah membaca bahwa perubahan sederhana bisa memberi peningkatan kecepatan besar, ingin memberi tahu pengembang jq

    • Artikel itu tampaknya tidak mempertimbangkan opsi ini, dan juga tidak disebutkan di komentar
  • Mengompilasi paket dari source atau mengunduh biner resmi bisa bermanfaat

    • Dulu sulit memeriksa pembaruan untuk paket hasil pemasangan manual dan kompilasi dari source, tetapi pernah mengembangkan alat untuk mengatasi ini
  • Fitur "cargo install" di Rust berguna karena memungkinkan optimasi untuk platform tertentu

    • jaq dan yq adalah opsi yang sering digunakan untuk meningkatkan performa saat memakai jq
  • Setelah mengganti allocator memori, Ubuntu bisa dibuat 90% lebih cepat dengan membangun ulang paket

    • Kemungkinan ini juga bekerja di Debian dan RedHat
    • Awalnya mengira ini artikel tentang mengubah Ubuntu menjadi Linux From Scratch