- What the Fork adalah alat lintas platform yang memvisualisasikan berbagai proses build seperti C/C++/Rust secara real-time
- Memudahkan untuk memahami masalah struktural seperti kurangnya pemrosesan paralel dan proses yang tidak efisien pada sistem build yang ada
- Dapat berjalan pada semua sistem build dan bahasa pemrograman, serta mendukung berbagai alat build seperti make, ninja, gradle, zig, cargo, dan lainnya
- Melalui pemantauan system call, alat ini memvisualisasikan waktu eksekusi, perintah, dan hubungan dependensi tiap proses dalam bentuk kotak
- Sangat berguna untuk optimasi build, analisis bottleneck, dan peningkatan performa CI
Pengenalan dan latar belakang
- What the Fork adalah alat visualisasi build real-time yang dikembangkan untuk mendiagnosis secara visual penyebab build menjadi lambat
- Pada proyek seperti LLVM, kompilasi bisa lambat karena ukuran kode yang besar, tetapi pada kebanyakan build, waktu yang terlalu lama sering kali disebabkan oleh konfigurasi yang tidak efisien
- Sebelumnya, sulit untuk memeriksa masalah build secara langsung atau memahami persoalan strukturalnya dalam sekali lihat, sehingga alat seperti ini dibutuhkan
- Alat ini dirancang lintas platform dan dapat diterapkan pada semua sistem build dan bahasa
Fitur utama dan cara penggunaan
- What the Fork bukan sekadar profiler sistem biasa, melainkan alat untuk mendiagnosis masalah yang spesifik pada build
- Contohnya meliputi tidak digunakannya flag
-j saat memakai make, konsentrasi waktu pada file atau tahap kompilasi tertentu, serta deteksi perintah yang berjalan berurutan padahal bisa diparalelkan
- Sangat efektif terutama untuk analisis dan optimasi performa clean build di lingkungan CI
- Cara pakainya adalah menjalankan perintah
wtf di depan perintah build (misalnya wtf make, wtf cargo build, wtf npm run build, dan sebagainya)
- Saat build dimulai, UI akan berjalan dan memperbarui status tiap proses secara real-time
UI dan metode visualisasi
- Setiap proses build ditampilkan pada timeline dalam bentuk kotak, dengan warna berbeda sesuai jenisnya
- Hubungan parent-child antarproses direpresentasikan dalam struktur bertingkat
- Panel bawah menampilkan waktu eksekusi, direktori kerja, dan informasi lengkap argumen perintah dari proses yang dipilih
Cara kerja
- Build adalah gabungan dari banyak proses (misalnya
bash, clang, ld)
- Build berskala besar menggunakan berbagai alat seperti
cargo, make, bazel, gradle, xcodebuild, dan semuanya pada praktiknya menjalankan banyak perintah, dependensi, cache, dan penjadwalan
- Dari output terminal saja, tidak mungkin memahami proses bertingkat seperti proses internal (
ld yang dipanggil dari clang, misalnya) maupun struktur timing yang rinci
- Untuk itu, alat ini memanfaatkan system call yang mendeteksi awal dan akhir proses pada tiap OS (macOS: Endpoint Security API, Linux: ptrace(), Windows: Event Tracing for Windows, dan lainnya)
- Dengan pendekatan ini, seluruh proses build dan timeline dapat direkonstruksi, sehingga jalur eksekusi dan waktu dari setiap tahap bisa diidentifikasi
- Selain build, alat ini juga dapat dimanfaatkan untuk melacak berbagai subprocess lain
Contoh nyata dan hasil pengamatan
- Beberapa engineer (dari Delta, Mozilla, dan Apple) benar-benar menerapkannya pada proyek mereka dan menemukan masalah yang tak terduga
- Contoh 1: Pada proyek open source yang menggunakan Cargo, file dikompilasi secara berurutan sehingga terlihat kurangnya paralelisme (pada CPU 10 core, ada potensi peningkatan kecepatan lebih dari 10x)
- Contoh 2: Pada build LLVM berbasis Ninja, semua core CPU menjalankan pekerjaan paralel secara efisien sehingga tercapai efisiensi build yang ideal
- Contoh 3: Pada proyek berbasis CMake, ditemukan struktur tidak efisien berupa eksekusi bertingkat cmake/make/clang serta pemeriksaan ulang versi Xcode/OS yang berulang sampai 85 kali (padahal pekerjaan sebenarnya sangat sedikit)
- Contoh 4: Pada proyek Objective-C besar yang memakai xcodebuild, terdeteksi kurangnya pemrosesan paralel pada fase akhir build dan adanya periode tidak aktif selama 6 detik sebelum build dimulai (sementara ninja mulai kompilasi hanya setelah 0,4 detik)
- Contoh 5: Saat Zig mengompilasi Orca Project, urutan build dependensi ditentukan secara acak sehingga efisiensi paralel berubah tergantung keberuntungan. Teramati bahwa beberapa dependensi berjalan paling akhir dan menurunkan paralelisme
- Contoh 6: Pada proyek GitHub CLI yang menggunakan make/go, waktu unduh dependensi sangat besar. Mengurangi dependensi diperkirakan dapat meningkatkan kecepatan build
Dampak penggunaan dan keterbatasan
- Melalui analisis timeline visual, pengguna dapat mengidentifikasi area bottleneck yang tak terduga, pengulangan dependensi yang tidak perlu, dan bagian yang kurang paralel
- Masalah dependensi, rework yang tidak perlu, dan inefisiensi pada alat tertentu dapat cepat dipahami sebagai titik perbaikan struktural, sehingga langsung berguna untuk optimasi performa build
- Melihat perintah lengkap tiap proses juga memungkinkan analisis yang lebih mendetail
Program beta
- What the Fork berjalan di Windows, Linux, dan macOS
- Individu dan tim yang ingin memberikan masukan dapat mendaftar ke private beta (tautan Google Form disediakan)
Belum ada komentar.