Melakukan profiling pada suatu sistem sangat berguna untuk mengidentifikasi pemakaian resource pada saat aplikasi berjalan. Kita dapat melihat fungsi apa yang memakai paling banyak CPU atau memori. Kita dapat melihat apakah aplikasi kita sudah efisien atau belum, dan kita dapat mencari cara untuk mengimprovenya. Pada aplikasi Go, kita dapat menggunakan pprof, library built-in untuk profiling yang dapat dengan mudah kita gunakan dan integrasikan.
Bagaimana cara menggunakan pprof
Untuk menggunakan pprof pada aplikasi golang, kita perlu import net/http/pprof
dan buat handlers untuk profiling. Kalau aplikasimu adalah web server dan menggunakan HTTP server default, kita bisa tinggal import library nya dengan blank identifier, seperti di bawah ini:
import _ net/http/pprof
Tapi kemungkinan besar kita tidak menggunakan HTTP server default. Kalau begitu kita perlu membuat handlers berikut:
r.HandleFunc("/debug/pprof/", pprof.Index)
r.HandleFunc("/debug/pprof/heap", pprof.Index)
r.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
r.HandleFunc("/debug/pprof/profile", pprof.Profile)
r.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
r.HandleFunc("/debug/pprof/trace", pprof.Trace)
Sekarang kita bisa melakukan profiling saat aplikasi kita berjalan.
Bagaimana cara melakukan profiling
Untuk mengetestnya, kita buat handler yang mengambil data dari database, hit third-party API, kemudian melakukan kalkulasi yang memakan banyak CPU.
Lalu kita hit server secara terus menerus selama 5 menit sambil melakukan profiling. Untuk melakukan profiling, kita memanggil API /debug/pprof/profile
dan menentukan berapa lama profiling berjalan pada parameter seconds
, kemudian simpan hasilnya pada sebuah file. Berikut ini adalah command untuk melakukan profiling dengan curl:
curl --output myappprofile "localhost:4560/debug/pprof/profile?seconds=300"
Tunggu sampai profiling selesai kemudian kita bisa analisa hasilnya.
Bagaimana cara menganalisa hasil pprof
Setelah kita dapatkan file hasil pprof, kita dapat menganalisanya menggunakan go tool pprof
. Kita dapat menganalisanya dengan command line interaktif atau dengan web interface.
Untuk membukanya dalam command line interaktif:
go tool pprof myappprofile
Kita dapat mengetik help
untuk melihat command yang tersedia.
Salah satu command yang bisa kita gunakan adalah top
. Ini untuk melihat fungsi yang paling banyak memakan resource.
Dari hasil di atas, kita dapat melihat bahwa fungsi calculateCityPopulation
adalah fungsi yang paling banyak menggunakan CPU. Kita dapat mencoba-coba command lainnya dan melihat bagaimana hasilnya.
Sekarang kita coba gunakan web interface. Untuk menganalisa hasil pprof pada web interface, gunakan command berikut:
go tool pprof -http localhost:3435 myappprofile
Parameter localhost:3435
adalah alamat untuk mengakses web interface nya. Kita dapat mengubahnya sesuai keinginan. Sekarang coba buka alamat tersebut di web browser. Kita akan melihat grafik seperti ini:
Kita bisa lihat bahwa fungsi calculateCityPopulation
adalah kotak terbesar dan yang warnanya paling merah. Ini adalah fungsi yang paling banyak memakai CPU. Pada grafik ini kita juga dapat melihat flow dari function-function yang dipanggil. Ini dapat membantu kita mengerti suatu aplikasi dan menganalisanya. Kita dapat mengubah tampilan dengan mengklik tombol VIEW
. Dibawah ini adalah hasilnya dalam Flame Graph.
Saya sendiri lebih suka menggunakan web interface daripada interactive command line, karena lebih mudah digunakan. Grafiknya juga dapat mempermudah kita menganalisa aplikasi dan mengimprovenya.
Kesimpulan
Untuk melakukan profiling aplikasi Golang kita dapat menggunakan pprof. Tool ini dapat melakukan profiling saat aplikasi berjalan. Jadi kita dapat melakukannya kapan saja, terutama ketika hal misterius terjadi pada server kita. Lalu kita dapat menganalisanya dengan interactive command line atau web interface. Thanks for reading, leave a comment.
The complete code
The complete code is here (click to expand)
main.go
|
|
service/city.go
|
|