Membaca flame graph tanpa menipu diri sendiri
Flame graph menunjukkan di mana waktu dihabiskan, dan itu sangat berharga. Ia juga sangat mudah disalahartikan.
Kesalahan pertama: lebar = lambat
Batang lebar berarti fungsi itu sering muncul di tumpukan sampel. Itu belum berarti ia lambat — bisa saja ia cepat tapi dipanggil satu juta kali.
Yang dicari adalah lebar yang tidak proporsional terhadap pekerjaannya. Fungsi serialisasi yang menghabiskan 30% waktu lebih mencurigakan daripada fungsi pembacaan yang menghabiskan 30%.
Kesalahan kedua: mengabaikan apa yang tidak ada
Flame graph tidak menunjukkan waktu yang dihabiskan menunggu. Kalau program menghabiskan 90% waktunya menunggu I/O, grafnya akan terlihat sangat sepi dan semuanya tampak baik-baik saja.
# Profil CPU, bukan waktu dinding
go test -cpuprofile=cpu.out -bench=.
go tool pprof -http=:8080 cpu.outKalau CPU profile sepi tapi programnya lambat, persoalannya di tempat lain: kunci, I/O, atau alokasi.
Kesalahan ketiga: mengukur kode yang berbeda
Profil di mesin pengembangan sering menyesatkan. Perbedaan ukuran cache, jumlah core, dan keberadaan kunci konkurensi mengubah hasilnya secara kualitatif.
Yang saya lakukan sekarang
Sebelum melihat graf:
- Ukur dulu dengan angka tunggal — berapa detiknya. Kalau tidak ada angka awal, tidak ada cara tahu apakah perubahan memperbaiki sesuatu.
- Ubah satu hal, ukur ulang.
- Simpan profil sebelum dan sesudah, agar bisa dibandingkan.
Intuisi saya tentang bagian mana yang lambat salah kira-kira dua dari tiga kali. Angka tidak pernah berdebat.