1. Yük Testi Motorlarının Mimari Farkları: k6 vs Locust vs JMeter
Performans mühendisliğinde en sık yapılan hata, yanlış test motoru seçerek test sunucusunun kaynaklarını tüketmek ve hedef sistem yavaşlamış gibi yanıltıcı raporlar almaktır.
- Grafana k6 (Go tabanlı): Go derleyicisinin eşzamanlılık mimarisi (goroutine) sayesinde işletim sistemi düzeyinde thread oluşturmaz. VU başına yalnızca 30-40 KB bellek kullanır ve çekirdek başına 3.000 - 4.000 RPS üretebilir.
- Locust (Python tabanlı): Python'da kodlama kolaylığı sunar ancak Python'un GIL (Global Interpreter Lock) mekanizması nedeniyle tek bir Python süreci yalnızca tek bir CPU çekirdeğini kullanabilir. Çok çekirdekli sistemlerde Master-Worker mimarisi zorunludur.
- Apache JMeter (Java tabanlı): Geleneksel iş parçacığı başına kullanıcı (Thread-per-VU) modelini kullanır. Binlerce eşzamanlı kullanıcıda yüksek JVM Heap bellek tüketimi ve CPU context-switch maliyeti yaratır.
2. 1 Gbps Ağ Darboğazı: Gizli Tuzak
Birçok geliştirici sadece CPU ve RAM kullanımına odaklanır ancak yüksek RPS testlerinde ilk darboğaz Gelen Ağ Bant Genişliğidir (Ingress Bandwidth).
Örneğin, web uygulamanızın ortalama yanıt boyutu 10 KB ise; 10.000 RPS seviyesinde test sunucunuza saniyede 100 MB veri akar. Bu değer 800 Mbps ağ trafiğine eşittir. Standart bir 1 Gbps VDS bağlantısında port doygunluğa ulaştığında paket kayıpları ve yapay gecikme (jitter) başlar. Bu senaryolarda testi tek bir VDS yerine 2-3 adet Worker VDS'e dağıtmak şarttır.
3. Linux Kernel Soket ve Port Optimizasyonları
Linux işletim sistemleri varsayılan olarak saniyede on binlerce yeni TCP soketi açmaya uygun yapılandırılmamıştır. Yük testi koşan bir VDS üzerinde mutlaka şu ayarlar uygulanmalıdır:
- ulimit -n 65535+: Açık dosya tanımlayıcı (file descriptor) sınırını artırarak "Too many open files" hatasını önler.
- net.ipv4.tcp_tw_reuse = 1: Kapanan TCP soketlerinin TIME_WAIT durumunda 60 saniye boyunca portu kilitlemesini engeller, portların hemen yeniden kullanılmasını sağlar.
- net.ipv4.ip_local_port_range: Port aralığını
1024 65535yaparak kullanılabilir geçici port sayısını 64.000'e çıkarır.