- Program CGI yang banyak digunakan pada era awal web terbukti lewat eksperimen masih dapat memberikan performa tinggi di hardware modern
- CGI memproses request per proses, sehingga pengelolaan memori berlangsung otomatis dan deployment menjadi sederhana
- Hasil benchmark membuktikan bahwa bahkan pada server biasa dengan CPU 16 thread, sistem ini mampu menangani lebih dari 2.400 request per detik, atau lebih dari 200 juta request per hari
- Contoh kode guestbook.cgi yang ditulis dengan Go dan SQLite beserta Dockerfile dirilis sebagai open source
- Meski CGI kini tidak lagi umum dipakai, hasil ini menunjukkan bahwa CGI masih bisa menjadi alternatif yang praktis dan modern
Program CGI dan Cara Kerjanya
- Pada awal 2000-an, program CGI (Common Gateway Interface) merupakan cara utama untuk membangun situs web dinamis
- Sebagian besar ditulis dengan Perl atau bahasa C, dan C kadang dipilih untuk meningkatkan performa
- Konsep CGI sederhana, tetapi kuat
- Web server menetapkan metadata request (header HTTP, query, dan sebagainya) dalam environment variable
- Membuat proses terpisah untuk menjalankan program CGI
- Mengirim body request melalui stdin
- Menangkap stdout program sebagai respons HTTP
- Meneruskan output stderr ke server error log
- Setelah program selesai menangani request, proses berakhir sehingga file descriptor dan memori dibebaskan secara otomatis
- Dari sudut pandang developer, deployment versi baru juga sangat mudah karena cukup menyalin file ke direktori
cgi-bin/
Hug of death (lonjakan trafik besar)
- Pada awal 2000-an, sebagian besar web server umumnya berjalan dengan 1–2 CPU dan memori 1–4GB
- Karena Apache web server menggunakan struktur yang melakukan fork proses
httpd untuk tiap koneksi, kebutuhan memori meningkat saat koneksi bertambah banyak
- Sulit menangani lebih dari 100 koneksi simultan, dan server sering mudah kewalahan hanya karena mendapat tautan dari situs terkenal
- ( Slashdot Effect : ketika tautan muncul di Slashdot yang saat itu sangat populer, trafik langsung membludak. Mirip seperti masuk ke puncak Hacker News sekarang)
CGI di Lingkungan Server Modern
- Kini sudah ada server dengan 384 thread CPU, dan bahkan VM yang relatif kecil pun bisa menyediakan 16 CPU
- Performa CPU dan memori meningkat sangat besar
- Karena program CGI berbasis proses terpisah, multicore dapat dimanfaatkan secara alami
- Karena itu dilakukan benchmark langsung untuk mengukur seberapa cepat program CGI di hardware modern
- Eksperimen dijalankan pada server AMD 3700X (16 thread)
Hasil Utama Benchmark
- Program CGI sederhana diuji baik di lingkungan Apache maupun server Go
net/http
-
Penjelasan program guestbook.cgi
- Diimplementasikan sebagai program buku tamu sederhana yang memungkinkan pengunjung meninggalkan komentar di bagian bawah situs web
- Menggunakan Go dan SQLite, dirancang sesederhana mungkin tetapi tetap realistis
- Source code dan Dockerfile dibuka di GitHub
- Menggunakan alat pembangkit beban HTTP
plow untuk menjalankan 100 ribu request dengan 16 koneksi
- Bahkan pada hardware biasa, sistem ini dapat menangani lebih dari 2.400 request per detik, yaitu lebih dari 200 juta request per hari
- Walau CGI bukan lagi arus utama saat ini, CGI tetap bisa dipakai untuk operasi layanan nyata
-
Benchmark write di lingkungan Apache
- Menangani sekitar 2468 request per detik, dengan latensi respons rata-rata 6.47ms
- Menyelesaikan 100 ribu request POST hanya dalam 40,5 detik
- Sebagian besar request direspons dalam 7ms, hanya sangat sedikit yang melampaui 100ms
- Membuktikan performa pemrosesan write yang tinggi secara praktis
-
Benchmark read di lingkungan Apache
- Menangani sekitar 1959 request per detik, dengan latensi respons rata-rata 8.16ms
- Menyelesaikan 100 ribu request GET dalam 51 detik
- Lebih dari separuh request selesai dalam 8ms, dan latensi maksimum hanya 31ms
- Performa baca juga sangat baik
-
Benchmark write di lingkungan Go net/http
- Menangani sekitar 2742 request per detik, dengan latensi respons rata-rata 5.83ms
- Menyelesaikan 100 ribu request POST dalam 36,4 detik
- Throughput rata-rata mencapai 2.742 RPS, dengan latensi rata-rata 5,8ms, secara angka lebih baik daripada Apache
- Lebih dari 95% request diproses dalam 6ms
- CGI di lingkungan Go juga memiliki performa yang cukup untuk penggunaan nyata
-
Benchmark read di lingkungan Go net/http
- Menangani sekitar 2469 request per detik, dengan latensi respons rata-rata 6.47ms
- Menyelesaikan 100 ribu request GET dalam 40,4 detik
- Sebagian besar request dapat dilayani dalam 7ms
- Baik throughput baca maupun kecepatan respons setara atau lebih baik dibanding Apache
Kesimpulan dan Tautan
- Program CGI memiliki kelebihan seperti konkurensi sangat tinggi di hardware terbaru, deployment sederhana, dan sistem operasi membebaskan resource secara otomatis
- Meski sangat sederhana dibanding framework modern, CGI masih bisa dipakai secara nyata untuk layanan dengan skala tertentu
- Contoh buku tamu dan data eksperimen benchmark dipublikasikan di GitHub berikut
https://github.com/Jacob2161/cgi-bin
4 komentar
Wah.. apakah kita jadi memakai CGI lagi?? haha
Wow.. sudah sejak kapan CGI itu..
Sepertinya ada pembaruan per tanggal 7/7.
Serving a half billion requests per day with Rust + CGI
Sampai 500 juta request...
Komentar Hacker News
Mengingat lingkungan pada tahun 1990-an ketika program CGI yang ditulis dalam C benar-benar menunjukkan kecepatan tinggi, tetapi diakui kelemahannya adalah sering terjadi error; program Go yang disebut di artikel atau bahasa modern seperti Nim, selama tidak melakukan koneksi database, terasa sangat cepat dan latensinya sangat rendah di localhost, seperti menggunakan fork & exec pada utilitas CLI; dibandingkan latensi jaringan, biayanya nyaris bisa diabaikan
Namun juga disebut adanya budaya yang mudah kecanduan pada teknologi tertentu; misalnya, setelah terbiasa dengan bahasa yang biaya start-up-nya besar seperti interpreter Python, orang jadi merasa perlu model multishot atau persisten
Model one-shot pada HTTP awal bermula dari masalah kurangnya memori sehingga server FTP tidak mampu mempertahankan ratusan sesi login idle dalam waktu lama
Disebut bahwa menggabungkan pre-forking pada CGI (yang bisa menyembunyikan latensi) dengan bahasa aman seperti Rust membuka kemungkinan desain sistem yang sangat baik; terminasi TLS bisa ditangani oleh web server multithreaded (atau lapisan seperti CloudFront), sehingga terasa praktis
Memulai pengembangan sejak era CGI membuat ada pengalaman memiliki penolakan yang kuat terhadap menjalankan subproses berumur pendek
Dijelaskan bahwa PHP dan FastCGI lahir untuk keluar dari masalah performa akibat membuat proses baru pada tiap request web
Berkat perkembangan hardware terbaru, kini disadari bahwa biaya memulai proses sebenarnya bukan masalah besar
Disebut bahwa benchmark ini dapat menangani 2000 request per detik, dan bahkan jika hanya perlu menangani beberapa ratus, lingkungan modern memudahkan scaling ke banyak instance
Setuju dengan pendapat yang menggambarkan AWS Lambda sebagai kelahiran kembali model CGI; dianggap analogi yang cukup tepat
Disebut bahwa jika skrip CGI didistribusikan sebagai binary C static-linked sambil memperhatikan ukurannya, kekecewaannya mungkin akan lebih kecil
CGI tidak terlalu membebani dari sisi biaya maupun performa di lingkungan beban rendah
Sebelum Go muncul, membuat program CGI dengan C/C++ pada era 2000-an memiliki tantangan besar baik dari sisi keamanan maupun tingkat kesulitan pengembangan
Kini kita hidup di zaman server dengan 384 thread CPU, dan bahkan VM kecil pun bisa punya 16 CPU
Dengan hardware seperti ini, jika dikembangkan dengan Kestrel, menangani triliunan request per hari pun terasa mudah
Pengalaman pengembangan yang mirip PHP bisa diberikan melalui operator string interpolation
Dengan LINQ dan String.Join(), tabel HTML dan elemen bertingkat bisa dengan mudah dibuat sebagai template
Hal yang benar-benar sulit adalah mengetahui cara menghindari ladang ranjau ekosistem seperti MVC/Blazor/EF
Bahkan seluruh program bisa dijalankan dari CLI sebagai satu file tingkat atas, tetapi jika tidak tahu kata kunci "Minimal APIs", mudah sekali tersesat ke labirin dokumentasi yang keliru
Kelebihan CGI adalah di lingkungan multitenant tidak perlu membangun ulang primitive isolasi
Berkat skrip CGI, perl dioptimalkan untuk waktu start yang cepat
Saat menjalankan perintah
time perl -e '', terlihat perl memerlukan 5ms, python3 33ms, dan ruby 77ms, yang menunjukkan cepatnya waktu start perl#!/bin/tcc -rundari branch tcc mob 1,3 kali lebih cepat daripada perlJika mencoba apache tomcat 11, cukup unggah file .jsp atau seluruh aplikasi java servlet (.war) lewat ssh dan semuanya langsung berjalan
Satu JVM bersama memberikan performa maksimum
Connection pool DB, cache, dan sebagainya juga bisa dibagi antar aplikasi
Pengalaman yang benar-benar mengesankan
Ini bergantung pada pola penggunaan nyata
Sangat bagus untuk layanan berskala besar, tetapi jika ada 50 aplikasi kecil yang masing-masing hanya menangani beberapa ratus request per hari, overhead memori Tomcat dianggap terlalu besar dibanding Apache/Nginx berbasis skrip CGI
Ada kesan rindu pada masa ketika deployment cukup dengan menyalin file
Keluhan tentang mengapa proses deployment menjadi serumit ini
Berbagi pengalaman bahwa sampai sekarang masih senang memakai Jetty untuk backend webapp
Kesan bahwa stack Tomcat/Jakarta EE/JSP ternyata cukup kokoh
Seperti PHP, HTML dan kode bisa dicampur, dan route Java murni juga dimungkinkan
Mendukung Websockets, dan karena modelnya single-process multithread, ada kelebihan untuk komunikasi real-time
Jika perlu, data bisa dibagi per request; kode JSP pada dasarnya dibatasi pada request scope
Deployment benar-benar mudah; cukup unggah file baru ke direktori webapps, lalu Tomcat otomatis memuat aplikasi baru dan membongkar aplikasi lama
Kekurangannya adalah kebocoran classloader dapat menyebabkan garbage collection gagal, takdir khas model single-process
Membuat alat visualisasi untuk request apache: ibrahimdiallo.com/reqvis
Ada kecurigaan terhadap situasi sekarang yang terus bergerak ke arsitektur rumit; disebut kemungkinan bahwa sebenarnya teknologi lama pun masih bisa dipakai dengan hardware yang bagus
Saat pertama kali memikirkan desain sistem untuk memberi informasi harga saham real-time kepada jutaan orang, yang terbayang adalah struktur stream kompleks seperti Kafka, pubsub, dan sebagainya; tetapi kemudian juga terpikir pendekatan sederhana dengan menaruh file statis di server
Penasaran dengan biaya operasional nyata dari pendekatan seperti ini
Ditekankan bahwa ini mirip arsitektur serverless, tetapi jauh lebih sederhana dan murah
Ada penyesalan bahwa tanpa benar-benar meninjau ulang struktur tradisional seperti ini, yang muncul malah sekadar paradigma baru bernama "serverless functions"
Kalau soal cgi sih masih bisa dimaklumi, tapi reaksi terhadap jsp cukup mengejutkan ya wkwk.
Apakah jsp memang sudah jadi peninggalan kuno sampai sejauh itu.