PPL 2020 — Document Builder: Mengukur Performa dengan ApacheBench
Dalam mengembangkan aplikasi yang banyak digunakan orang, tentu kita harus memperhatikan performa dari aplikasi tersebut. Performa menjadi hal yang sangat penting demi kenyamanan pengguna dalam menggunakan aplikasi kita. Salah satu cara untuk mengukur performa aplikasi web adalah menghitung berapa banyak request yang bisa ditanganinya dalam satu detik atau requests per second (RPS).
Sekarang, bagaimana cara kita menghitung banyaknya request per detik tersebut? Apakah membuka ratusan web browser yang membuka situs yang sama? Tentu tidak mungkin. Salah satu cara adalah menggunakan aplikasi khusus yang bisa mengirim request sebanyak apapun yang kita mau, salah satunya adalah ab
(ApacheBench).
ApacheBench
ApacheBench merupakan aplikasi khusus yang dibuat untuk melakukan benchmarking sebuah server HTTP. ApacheBench bekerja dengan mengirimkan beberapa request sekaligus dengan concurrency yang disesuaikan kemudian akan ditampilkan hasil analisisnya berupa connection time maupun besaran bytes yang ditransfer. Apache Benchmark biasanya sudah sepaket dalam package bernama apache2-utils
. Anda dapat mencari di internet tentang cara install Apache Benchmark di sistem operasi Anda.
Perhatian: Berhati-hatilah dalam menggunakan aplikasi tersebut, melakukan request terlalu banyak terhadap server dapat menyebabkan denial of service dan hanya gunakan untuk server yang Anda miliki!
ApacheBench dapat digunakan dalam CLI (command line interface). Banyak sekali parameter yang bisa Anda manfaatkan, namun yang biasa digunakan adalah -n
untuk banyaknya request yang akan dilakukan dan -c
untuk banyaknya concurrency, sebagai contoh:
ab -n 100 -c 50 http://127.0.0.1:5000/api
Perintah tersebut berarti mengirim 100 request HTTP GET ke endpoint /api
dengan concurrency 50 yang artinya dalam 100 request tersebut, hanya boleh dijalankan sebanyak 50 request sebanyak satu waktu. Analoginya seperti Anda ingin mengeluarkan air sebanyak 100 liter dengan membuka sebanyak 50 keran. Anda bisa melihat penjelasan tentang concurrency di StackOverflow.
Hasil ApacheBench akan berbentuk seperti berikut:
Maka, terlihat bahwa server tersebut dapat menangani sekitar 322 request dalam satu detik untuk kondisi yang diberikan.
Mengukur Performa Document Builder di Localhost
Sekarang, akan diberikan contoh penggunaan ApacheBench untuk mengukur performa aplikasi Document Builder di localhost. Untuk mempermudah, kita akan menggunakan endpoint yang kita gunakan untuk mendapatkan daftar template yang bisa kita gunakan, yaitu GET: /api/templates
. Sebelum itu, kita coba melakukan request sekali dengan verbosity level 2 agar lebih jelas hasilnya:
ab -n 1 -v 2 \
http://127.0.0.1:5000/api/templates\?limit=5\&offset=10
Akan terlihat hasil berikut:
Ternyata gagal! Hal ini disebabkan oleh pemanggilan request tanpa autentikasi. Kita harus melakukan login terlebih dahulu untuk mengakses endpoint tersebut.
Melakukan Request dengan Autentikasi
Perlu diketahui, Document Builder memanfaatkan sistem session ID yang disimpan pada cookies untuk menyimpan suatu sesi pengguna. Kita bisa melihat cookie tersebut pada browser kita:
Logikanya, apabila kita bisa menggunakan session ID yang sudah terautentikasi dan melakukan benchmark dengan cookie session ID tersebut, maka kita bisa mendapatkan hasil yang benar. Untungnya, ApacheBench mempunyai parameter khusus untuk menambahkan sebuah cookie dalam request yang akan kita coba, yaitu -C cookie-name=value
. Parameter tersebut akan kita coba seperti berikut (dipotong menggunakan backslash agar lebih mudah dibaca) :
ab -n 1 -v 2 \
-C connect.sid=s%3ACtLV80t9DvPKTrjOt\
0J0UVUEW_kXCrwa.%2BLNPaKei0QOdITb7pRO\
ffhcuEWFRRP2n%2B%2FUftPrXCEw \
http://127.0.0.1:5000/api/templates\?limit=5\&offset=0
Maka, akan keluar hasil berikut:
Yay! Hasilnya sekarang sudah sesuai yang diinginkan.
Mencoba Benchmark yang Sebenarnya
Setelah mencoba satu request sudah berhasil, maka kita bisa melanjutkan untuk benchmark dengan jumlah request yang banyak. Untuk contoh ini, akan dilakukan sebanyak 500 request dengan concurrency sebanyak 10.
ab -n 500 -c 10 \
-C connect.sid=s%3ACtLV80t9DvPKTrjOt\
0J0UVUEW_kXCrwa.%2BLNPaKei0QOdITb7pRO\
ffhcuEWFRRP2n%2B%2FUftPrXCEw \
http://127.0.0.1:5000/api/templates\?limit\=5\&offset\=0
Berikut adalah hasilnya:
Terlihat bahwa aplikasi kita mampu menangani request sekitar 90 request per detiknya untuk kondisi yang telah diberikan.
Yang Perlu Diperhatikan
Ketahui juga bahwa angka tersebut tidak selalu menunjukkan keadaan sebenarnya dari performa aplikasi kita. Angka-angka tersebut bisa bergantung juga terhadap keadaan database yang kita miliki (apakah besar atau tidak, tanda dari operasi query yang menjadi bottleneck), atau bahkan kualitas koneksi kita ke server. Pemilihan endpoint juga menjadi penting untuk mendapatkan hasil yang mewakili keadaan sebenarnya (carilah endpoint yang cukup berat dan sering diakses pengguna). Maka dari itu, perlu analisis lebih lanjut untuk mengukur performa sebuah aplikasi.
Kesimpulan
Kita telah membahas tentang ApacheBench dan penggunaannya dalam mengukur performa suatu server. Telah dilakukan juga percobaan untuk mengukur performa aplikasi Document Builder yang dipasang di localhost. Pada kasus tersebut, dibutuhkan pemasangan cookie untuk melakukan request dengan session yang telah terautentikasi. Walaupun demikian, pengukuran request per second menggunakan ApacheBench belumlah cukup untuk mendapatkan pengukuran yang mewakili keseluruhan dari performa aplikasi kita.
Sekian penjelasan saya tentang ApacheBench dan kegunaannya untuk mengukur performa. Tautan di bawah merupakan artikel yang membahas lebih lanjut tentang stress testing pada suatu aplikasi, dan artikel saya tentang pentingnya pemilihan algoritma untuk performa sebuah aplikasi web. Jangan lupa untuk membaca artikel dari anggota tim lain.