The coroutine scheduler in Golang is multiple threads design. There are multiple coroutines parallel running, it is necessary to solve race conditions for the globally shared resources, to do synchronization and Show Although Golang has solved the problem of synchronizing between units of work by communicating over shared channels. But Golang still used mutex and locks underlayer. The coroutine scheduler in Open Swoole 4.x is single thread design. Only one coroutine is parallel running, so there are no problems such as data syncing between threads and avoid But how to share global variables and resources between different Swoole processes? There are three ways to solve this problem:
For example, in Golang:
defer task is needed to release the connection resources. Compare with the PHP style doing the defer task within 0.defer is doing similar tasks in Golang as a destructor in PHP. Looking at this piece of normal PHP code:
Compare with the Golang test function, it is not necessary to close the DB connection in PHP since PHP destroy and clean up the DB object created within the function. Because of the destructor function including the logic of closing the connection in 1 will be called before the DB object is destroyed.defer in Swoole 4.x is designed to be executed when the 2 task is finished. It is binding with the coroutine task.In Golang, it is possible to read the same socket with multiple coroutines concurrently. But the developer needs to control when to do so. For example, the following Golang code may throw errors:
Compare with Golang, reading socket concurrently with multiple coroutines is prohibited.
The above code throws Error:
If you like to reading socket concurrently, use 3 or 4 to build a connection pool to control the access to the connection resource. TeknoCerdas.com – Pada kesempatan ini penulis akan melakukan benchmark HTTP server 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.” Benchmark ini tidak menggambarkan kondisi nyata aplikasi pada umumnya dimana banyak I/O seperti pembacaan file atau database. Namun paling tidak benchmark ini dapat mengindikasikan bagaimana performa dasar dari setiap bahasa pemrograman. Bagi Anda yang tidak memiliki banyak waktu untuk membaca silahkan langsung ke bagian hasil benchmark untuk konklusi dari ketiga bahasa ini.
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 HTTP server yang dibuat pada masing-masing bahasa pemrograman. Satu lagi untuk menjalankan HTTP load testing menggunakan Apache Bench (ab). Versi dari bahasa pemrograman atau runtime yang digunakan pada benchmark kali ini.
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.
Script untuk PHP Swoole
Script untuk NodeJS
Script untuk Go
Memulai 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. Benchmark yang dilakukan adalah mengirim HTTP request dengan concurency 500 dengan total request sebanyak 500,000. Berikut cara penulis menjalankan benchmark untuk masing-masing http server. Setiap benchmark diulang 3 kali tanpa mematikan http server. Setiap akan diulang cache memory dibersihkan dengan perintah.
Sebelum memulai lagi penulis juga memastikan bahwa semua network socket yang ada sudah bersih dan tidak ada yang menunggu.
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 berbasis *NIX. Benchmark PHP Swoole
Benchmark NodeJS
Benchmark Go
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 UsageMax CPU Usage (Semakin kecil 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 UsageSystem Memory Usage (Semakin kecil 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.
Ringkasan 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. Penulis 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 penulis. 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. Penulis tidak menggunakan opsi keep-alive untuk lebih mensimulasikan kondisi sebenarnya dimana jumlah user diasumsikan cukup besar. Share
Rio Astamal Follow Adalah penulis utama di TeknoCerdas.com. Rio Astamal seorang yang sangat antusias dengan web development sejak 2003. Sejak November 2021 Rio Astamal bekerja di Amazon Web Services (AWS) sebagai Developer Advocate untuk Indonesia. Dia mengelola TeknoCerdas.com di waktu senggangnya sebagai salah satu sarana untuk ikut mencerdaskan pembaca dalam dunia IT. Apa itu PHP Swoole?Swoole 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.
Apa itu Node JS dan cara kerjanya?Node.js adalah software open-source yang bisa digunakan untuk membuat aplikasi jaringan dan aplikasi server-side yang real-time dan scalable (bisa dikembangkan sesuai kebutuhan). Pada dasarnya, Node.js adalah runtime environment lintas platform single-thread yang dibangun berdasarkan engine JavaScript V8 Chrome.
|