Profiling Aplikasi Terdistribusi dengan Linux perf: Panduan Praktis
Mengoptimalkan aplikasi yang matang dapat terasa seperti mencari jarum dalam tumpukan jerami. Cara terbaik untuk mengidentifikasi hambatan performa yang sebenarnya adalah membiarkan data, bukan intuisi, mengarahkan keputusan Anda. Dalam praktiknya, kode yang paling memakan waktu sering kali adalah yang tidak terduga.
Saat saya menyadui sebuah kode lambat, saya pertama-tama memeriksa bukti sebelum saya memodifikasinya.
Profiling mengubah intuisi tersebut menjadi fakta yang dapat diukur. Sementara ada banyak profiler di pasaran, memilih alat yang tepat untuk sistem multi-threaded atau terdistribusi bisa menjadi tantangan. Profiler hitungan instruksi tradisional seperti Callgrind dapat merusak waktu, terutama di bawah kontensi mutex yang berat, karena mereka mengukur instruksi daripada waktu nyata.
Profiler statistik, di sisi lain, mengambil sampel program yang berjalan dengan overhead rendah, menjadikannya ideal untuk beban kerja konkuren yang kompleks. perf Linux adalah contoh utama dari pendekatan ini.
Di bawah ini adalah alur kerja langkah demi langkah yang menunjukkan cara menggunakan perf bersama dengan FlameGraph Brendan Gregg untuk mengidentifikasi titik panas dalam aplikasi terdistribusi. Contohnya menargetkan contoh c/hello_dynamic dari RTI Connext 5.3.0.
1. Instal perf
Di Ubuntu, jalankan:
sudo apt-get install linux-tools-common linux-tools-3.13.0-107-generic
2. Clone FlameGraph
Clone repositori ke lokasi yang nyaman (misalnya, direktori rumah Anda):
git clone https://github.com/brendangregg/FlameGraph
3. Bangun contoh
Navigasi ke rti_workspace/examples/c dan kompilasi dengan simbol debug:
export DEBUG=1 make -f makefile_Hello_x64Linux3gcc4.8.2
Ganti nama makefile dengan yang cocok dengan platform Anda jika diperlukan.
4. Jalankan publisher saat profiling
Mulai subscriber di latar belakang, lalu jalankan perf:
objs/x64Linux3gcc4.8.2/Hello sub & sudo perf record -g objs/x64Linux3gcc4.8.2/Hello pub
Setelah periode pengujian singkat, tekan Ctrl+C untuk menghentikan publisher. perf akan menghasilkan perf.out.
5. Konversi data untuk FlameGraph
Terjemahkan output perf menjadi file stack yang dilipat:
perf script -f | ~/FlameGraph/stackcollapse-perf.pl > out.perf-folded
Lalu buat flame graph visual:
~/FlameGraph/flamegraph.pl out.perf-folded > perf.svg
6. Periksa hasil
Buka perf.svg di browser web. Sumbu horizontal menunjukkan waktu yang dihabiskan dalam setiap fungsi, sementara bar bertumpuk mengungkapkan tumpukan panggilan. Mengklik bar akan memperbesar tumpukan tersebut. Menjalankan publisher tanpa subscriber akan menghapus bagian kanan grafik, mengonfirmasi bahwa DDS hanya memancarkan data ketika ada subscriber.
Perf menawarkan banyak opsi lainnya—sesuaikan frekuensi sampling, ecualikan kode kernel, atau fokus pada CPU tertentu. Jika Anda memiliki tips atau telah menemukan alat pelengkap yang menyederhanakan profiling, bagikan dalam komentar.
Selamat profiling!