- İlk web döneminde yaygın olarak kullanılan CGI programlarının, modern donanımda hâlâ yüksek performans verebildiği deneyle doğrulandı
- CGI, istekleri süreç başına işler; bu da bellek yönetiminin otomatik yapılması ve dağıtımın basit olması gibi avantajlar sağlar
- Benchmark sonuçları, sıradan bir 16 iş parçacıklı CPU sunucusunda bile saniyede 2400'den fazla, günde 200 milyondan fazla istek işlenebildiğini gösterdi
- Go dili ve SQLite ile yazılmış guestbook.cgi örnek kodu ile Dockerfile açık kaynak olarak paylaşıldı
- CGI bugün yaygın kullanılmasa da, hâlâ pratik ve modern bir alternatif olabileceğini gösteriyor
CGI programları ve çalışma mantığı
- 2000'lerin başında CGI (Common Gateway Interface) programları, dinamik web siteleri kurmanın başlıca yoluydu
- Çoğu Perl ya da C dili ile yazılıyordu; performansı artırmak için bazen C tercih ediliyordu
- CGI fikri basit ama güçlüdür
- Web sunucusu, istek metaverisini (HTTP başlıkları, query vb.) ortam değişkenlerine yerleştirir
- Ayrı bir süreç oluşturup CGI programını çalıştırır
- İstek gövdesini stdin üzerinden iletir
- Programın stdout çıktısını HTTP yanıtı olarak yakalar
- stderr çıktısını sunucu hata loguna gönderir
- Program isteği bitirdiğinde süreç sonlanır ve dosya tanımlayıcıları ile bellek otomatik olarak serbest bırakılır
- Geliştirici açısından yeni sürüm dağıtımı da çok basitti; yalnızca dosyayı
cgi-bin/ dizinine kopyalamak yeterliydi
Hug of death (trafik patlaması)
- 2000'lerin başında çoğu web sunucusunda 1-2 CPU ve 1-4 GB bellek yaygındı
- Apache web sunucusunun her bağlantı için bir
httpd süreci fork etmesi nedeniyle, çok sayıda bağlantıda bellek ihtiyacı artıyordu
- Eşzamanlı bağlantı sayısı çoğu zaman 100'ü aşmakta zorlanıyordu; ünlü bir siteden yalnızca bağlantı almak bile sunucuyu kolayca aşırı yükleyebiliyordu
- ( Slashdot Effect : O dönemde popüler olan Slashdot'ta bir bağlantı çıkınca trafik sel gibi akardı. Bugün Hacker News ana sayfasına çıkmaya benzer)
Modern sunucu ortamında CGI
- Günümüzde 384 CPU iş parçacığına sahip sunucular var; nispeten küçük VM'lerde bile 16 CPU bulunabiliyor
- CPU ve bellek performansı büyük ölçüde arttı
- CGI programları ayrı süreç tabanlı olduğu için çok çekirdeği doğal biçimde kullanabiliyor
- Bu nedenle, modern donanımda CGI programlarının ne kadar hızlı olduğunu görmek için doğrudan benchmark testi yapıldı
- Deney, AMD 3700X (16 iş parçacığı) sunucusunda gerçekleştirildi
Benchmark'ın başlıca sonuçları
- Basit bir CGI programı hem Apache hem de Go
net/http sunucusu ortamında test edildi
-
guestbook.cgi programının açıklaması
- HTTP yük üretim aracı
plow kullanılarak 16 bağlantı ile 100 bin isteklik testler yapıldı
- Sıradan donanımda bile saniyede 2.400'den fazla, yani günde 200 milyondan fazla istek işlenebildi
- CGI bugün ana akım olmasa da, gerçek servis işletiminde hâlâ kullanılabilir
-
Apache ortamında write benchmark'ı
- Saniyede yaklaşık 2468 istek işlendi, ortalama yanıt gecikmesi 6.47ms oldu
- 100 bin POST isteği yalnızca 40.5 saniyede işlendi
- İsteklerin çoğu 7ms içinde yanıtlandı, 100ms'yi aşanlar ise çok azdı
- Pratikte yüksek yazma performansı gösterildi
-
Apache ortamında read benchmark'ı
- Saniyede yaklaşık 1959 istek işlendi, ortalama yanıt gecikmesi 8.16ms oldu
- 100 bin GET isteği 51 saniyede işlendi
- İsteklerin yarıdan fazlası 8ms içinde tamamlandı, en yüksek gecikme bile 31ms ile sınırlı kaldı
- Okuma performansı da fazlasıyla yeterliydi
-
Go net/http ortamında write benchmark'ı
- Saniyede yaklaşık 2742 istek işlendi, ortalama yanıt gecikmesi 5.83ms oldu
- 100 bin POST isteği 36.4 saniyede işlendi
- İş hacmi ortalama 2,742 RPS, ortalama gecikme 5.8ms ile Apache'den sayısal olarak daha iyi performans verdi
- İsteklerin %95'inden fazlası 6ms içinde işlendi
- Go ortamındaki CGI da pratik kullanım için yeterli performansa sahip
-
Go net/http ortamında read benchmark'ı
- Saniyede yaklaşık 2469 istek işlendi, ortalama yanıt gecikmesi 6.47ms oldu
- 100 bin GET isteği 40.4 saniyede işlendi
- İsteklerin çoğu 7ms içinde sunulabildi
- Hem okuma iş hacmi hem de yanıt hızı Apache ile benzer ya da daha iyiydi
Sonuç ve bağlantı
- CGI programları, en yeni donanımda çok yüksek eşzamanlılık, basit dağıtım ve işletim sisteminin otomatik kaynak temizliği gibi avantajlara sahip
- Modern framework'lere kıyasla son derece basit olsa da, belli ölçekli servislerde bugün de pratik olarak kullanılabilir
- Ziyaretçi defteri örneği ve benchmark deney verileri aşağıdaki GitHub deposunda paylaşıldı
https://github.com/Jacob2161/cgi-bin
4 yorum
Vay be.. yeniden
cgikullanmaya mı başlayacağız?? hahaVay..
cgine zamandan kalma şey..7/7 tarihi itibarıyla güncellenmiş bir içerik varmış.
Serving a half billion requests per day with Rust + CGI
Günde 500 milyon istekmiş...
Hacker News görüşleri
1990'larda da C ile yazılmış CGI programlarının gerçekten çok hızlı olduğu ortamları hatırlıyorum, ancak çok hata üretmeleri ciddi bir dezavantajdı; yazıda anılan Go programları ya da Nim gibi modern diller ise veritabanı bağlantısı yapmadıkları sürece localhost'ta son derece hızlı ve düşük gecikmeli hissettiriyor, adeta bir CLI yardımcı programında
fork & execkullanıyormuşsunuz gibi; ağ gecikmesiyle kıyaslandığında maliyet neredeyse ihmal edilebilir düzeydeydiAncak belirli teknolojilere kolayca bağımlı hale gelen bir kültürden de söz ediliyor; örneğin Python interpreter'ı gibi başlangıç maliyeti yüksek dillere alışınca multi-shot ya da kalıcı bir modele ihtiyaç duyuluyor
İlk dönem HTTP'nin one-shot modeli, FTP sunucularının yüzlerce boşta oturum açmış oturumu uzun süre bellekte tutacak kadar hafızaya sahip olmaması sorunundan doğmuştu
CGI'da pre-forking (gecikmeyi gizleyebilir) ile Rust gibi güvenli bir dili birleştirince mükemmel sistem tasarımları mümkün olabilir; TLS sonlandırmasını çok iş parçacıklı bir web sunucusunda (veya CloudFront benzeri bir katmanda) yapmak da kullanım kolaylığı sağlıyor
fork()maliyetinden ve C'nin tehlikelerinden kaçınmak için uygulama sunucularına hızlı bir geçiş yaşandığı hatırlatılıyor; şimdi yeniden sadeliğe dönebiliriz deniyorCGI döneminden beri geliştirme yaptığım için kısa ömürlü alt süreçler çalıştırmaya karşı güçlü bir önyargım oluştu
PHP ve FastCGI'nin, her web isteği için yeni süreç oluşturmanın performans sorunundan kaçmak için ortaya çıktığı açıklanıyor
Son donanım gelişmeleri sayesinde süreç başlatma maliyetinin pratikte o kadar da büyük bir sorun olmadığını fark ettim
Bu benchmark'ın saniyede 2000 istek işleyebildiği, birkaç yüz istek bile işlese birden fazla instance'a kolayca ölçeklenebildiği gibi modern bir ortamdan söz ediliyor
AWS Lambda'nın CGI modelinin yeniden doğuşu olduğu görüşüne katılıyorum, bence oldukça yerinde bir benzetme
Eğer CGI script'lerini boyutuna da dikkat edilerek statik linklenmiş C binary'leri olarak dağıtsaydık, hayal kırıklığı daha az olurdu deniyor
CGI düşük yük ortamlarında para ve performans açısından çok büyük bir yük değildi
Go ortaya çıkmadan önce CGI programlarını C/C++ ile yazmak, 2000'lerde hem güvenlik hem de geliştirme zorluğu açısından zordu
Bugün sunucularda 384 CPU thread var, küçük bir VM bile 16 CPU ile gelebiliyor
Böyle bir donanımda Kestrel ile geliştirirseniz günde trilyonlarca isteği rahatlıkla işleyebilirsiniz
PHP'ye benzer bir geliştirme deneyimi string interpolation operatörleriyle sağlanabiliyor
LINQ ve String.Join() kullanarak HTML tabloları ve iç içe öğeleri kolayca şablonlaştırabilirsiniz
Asıl zor olan şey MVC/Blazor/EF gibi ekosistem mayın tarlalarında nasıl yol alınacağını bilmek
Tüm programı tek bir üst düzey dosya olarak CLI'dan çalıştırmak da mümkün, ancak "Minimal APIs" anahtar sözcüğünü bilmiyorsanız kendinizi yanlış dokümantasyon labirentinde bulmanız kolay
CGI'nin avantajı, çok kiracılı ortamlarda izolasyon primitive'lerini yeniden inşa etmek gerekmemesi
rlimitile uzun süren istekler zorla sonlandırılabilircgroupkullanılarak kiracı başına bellek, CPU, disk/ağ IO kullanımı adil biçimde paylaştırılabilirCGI script'leri sayesinde perl hızlı başlangıç süresi için optimize edilmişti
time perl -e ''komutunu çalıştırınca perl 5ms, python3 33ms, ruby 77ms sürüyor; bu da perl'in hızlı başlangıcını gösteriyor#!/bin/tcc -runtarzı script'lerin perl'den 1.3 kat daha hızlı olduğu belirtiliyorgetlinebile standart değildi; bu yüzden üçüncü taraf C kütüphaneleri yüzlerce hatta binlerce satır olabiliyorduapache tomcat 11 kullanınca .jsp dosyalarını ya da tüm java servlet uygulamasını (.war) ssh ile yüklemek yetiyor ve doğrudan çalışıyor
Tek bir paylaşımlı JVM ile en yüksek performans elde ediliyor
DB connection pool, cache vb. de uygulamalar arasında paylaşılabiliyor
Gerçekten etkileyici bir deneyim
Ama bu gerçek kullanım desenine bağlı
Büyük ölçekli servisler için harika, fakat her biri günde yalnızca birkaç yüz istek alan 50 küçük uygulamanız varsa Tomcat'in bellek ek yükü, CGI script tabanlı Apache/Nginx'e kıyasla fazla büyük olabilir
Dosyaları sadece kopyalayarak deploy ettiğimiz günleri özlüyorum
Deploy sürecinin neden bu kadar karmaşık hale geldiğine hayıflanılıyor
Hâlâ Jetty ile backend web uygulamalarını keyifle kullandığını paylaşan biri var
Tomcat/Jakarta EE/JSP yığınının beklenmedik derecede sağlam olduğu söyleniyor
PHP'deki gibi HTML ile kodu iç içe yazmak da mümkün, saf Java route'ları da
Websockets desteği var; tek süreçli çok iş parçacıklı model olduğu için gerçek zamanlı iletişimde de güçlü
Gerekirse istekler arasında veri paylaşılabiliyor, JSP kodu ise varsayılan olarak request scope ile sınırlı
Deploy gerçekten çok kolay;
webappsdizinine yeni dosya yüklendiğinde Tomcat yeni uygulamayı otomatik yüklüyor ve eskisini boşaltıyorDezavantajı ise classloader sızıntıları nedeniyle garbage collection'ın başarısız olabilmesi; bu da tek süreçli modelin kaderi
apache istekleri için görselleştirme aracı ibrahimdiallo.com/reqvis yapılmış
Son zamanlardaki karmaşık mimari yönelimine şüpheyle bakıyordum; iyi donanımla aslında eski teknolojilerin hâlâ yeterli olabileceği ihtimalinden söz ediliyor
Milyonlarca kişiye gerçek zamanlı hisse fiyatı gösterecek bir sistem tasarlama sorusunda önce Kafka, pubsub gibi karmaşık akış yapıları akla gelmiş ama sonunda sunucuya statik dosya koymak gibi basit bir yöntem de düşünülmüş
Bunun gerçek işletim maliyetinin ne olacağı merak ediliyor
Serverless mimariye benziyor, ama çok daha basit ve ucuz olduğu vurgulanıyor
Bu geleneksel yapıları yeniden değerlendirmek yerine sadece "serverless functions" diye yeni bir paradigma üretilmiş olmasına üzülenler var
cgi neyse de, jsp’ye verilen tepki gerçekten şaşırtıcı haha
jsp gerçekten de artık o kadar eski bir antika mı oldu acaba.