Pada artikel ini kita akan melakukan benchmark PHP Swoole vs NodeJs vs Go. Benchmark yang dilakukan adalah benchmark sederhana yaitu masing-masing bahasa pemrograman mengembalikan sebuah string “Welcome to hello world benchmark.” Show Meskipun benchmark ini tidak menggambarkan kondisi aplikasi real world pada umumnya. Namun paling tidak benchmark ini dapat mengindikasikan bagaimana performa dasar dari setiap bahasa pemograman.
Sekilas Tentang PHP Swoole, NodeJS dan GoSwoole adalah sebuah asynchronus framework berbasis co-routine untuk PHP. Swoole ditulis menggunakan C dan dan didistribusikan dalam bentuk eksensi untuk PHP. Untuk menggunakannya pengguna harus melakukan instalasi lewat pecl. NodeJS adalah sebuah runtime Javascript yang mendukung asynchronous event-driven dan non-blocking I/O. NodeJS dibangun diatas javascript engine yang digunakan oleh Chrome yaitu V8. Go atau Golang adalah sebuah bahasa pemrograman open source yang dikembangkan oleh Google. Go mendukung concurency secara default melalui apa yang disebut sebagai goroutine atau channel. Konfigurasi BenchmarkTerdapat dua mesin dalam konfigurasi benchmark yang dilakukan. Satu mesin untuk hosting aplikasi server yang dibuat pada masing-masing bahasa pemrograman. Satu lagi untuk menjalankan HTTP load testing menggunakan Apache Bench (ab). Benchmark ini dilakukan menggunakan layanan AWS cloud dengan tipe instance c5d.2xlarge. Berikut spesifikasi untuk kedua mesin yang digunakan. +------------+------------------------------------------------+ Konfigurasi kernel yang digunakan baik untuk application server atau client. cat <<EOF | tee /etc/sysctl.conf Script untuk PHP SwooleVersi PHP yang digunakan adalah PHP v7.4.5 dan Swoole v4.5.0. $ cat > hello.php Script untuk NodeJSVersi NodeJS yang digunakan adalah v12.16.3. $ cat > hello.js Script untuk GoVersi Go yang digunakan adalah v1.14.2. $ cat > hello.go Menjalankan BenchmarkBenchmark dijalankan secara bergantian artinya hanya ada satu server aplikasi yang jalan pada satu waktu. Sebagai contoh ketika melakukan benchmark pada PHP Swoole maka server NodeJS dan Go dimatikan. Hal ini untuk memberikan gambaran yang lebih adil terutama penggunaan memori. Berikut cara Saya menjalankan benchmark untuk masing-masing http server. Setiap benchmark diulang 3 kali tanpa mematikan http server. Setiap akan diulang cache memory dibersihkan dengan perintah. $ echo 2 > sudo tee /proc/sys/vm/drop_caches Sebelum memulai lagi saya juga memastikan bahwa semua network socket yang ada sudah bersih dan tidak ada yang menunggu. $ sudo netstat -ntap | grep WAIT Jika tidak socket yang tergantung maka benchmark dapat dimulai. Hal ini untuk menghindari limit open_max_files. Karena setiap socket yang dibuka juga merupakan sebuah file di sistem operasi berbasi *NIX. Memulai benchmark pada masing-masing HTTP ServerBenchmark yang dilakukan adalah mengirim HTTP request dengan concurency 500 dengan total request sebanyak 500,000.
# Pada Mesin Server 2. Benchmark NodeJS # Pada Mesin Server 3. Benchmark Go # Pada Mesin Server Hasil Benchmark PHP Swoole vs NodeJS vs GoHasil benchmark dibagi dalam tiga bagian. Satu adalah Request per Second (RPS). Kedua adalah Max CPU Usage atau penggunaan CPU maksimum. Ketiga adalah Memory Usage atau penggunaan memory. Request Per SecondRequest per Second (Semakin tinggi semakin baik)Pemenang untuk benchmark request per second (RPS) adalah Go. Namun bersaing ketat dengan PHP Swoole.
Max CPU Usage Max CPU Usage (Semain rendah semakin baik)Pemenang untuk benchmark Max CPU Usage adalah NodeJS dengan rata-rata 20% maksimum penggunaan CPU. Dimana penggunaannya tidak sampai separuh dari PHP Swoole dan Go.
Memory UsageMemory Usage (Semakin rendah semakin baik)Pemenang untuk penggunaan memory atau RAM adalah PHP Swoole. Dimana rata-rata maksimum penggunaannya 228,67 MB. Selish cukup kecil dengan Go diposisi kedua.
Kesimpulan BenchmarkUntuk urusan performa PHP Swoole dan Go bersaing cukup ketat. NodeJS tertinggal cukup jauh untuk bagian ini. Hal yang positif dari NodeJS adalah penggunaan CPU yang cukup rendah. Ini dikarenakan NodeJS secara design adalah single-threaded sehingga tidak memanfaatkan 8 core CPU yang ada. Saya mencoba menjalankan NodeJS dengan mode cluster untuk multi-core processor menggunakan pm2. Namun anehnya performannya malah jauh menurun dari normal 21,626 req/s menjadi hanya 15k req/s. Entah apa yang salah dengan konfigurasi saya. Hal yang diluar dugaan adalah Swoole yang fantastis dan hampir setara dengan Go. Jadi jika Anda dalah PHP developer dan tidak ada waktu untuk migrasi ke Go maka Swoole adalah alternatif yang sangat menarik. |