Ana içeriğe atla

Özet

Eş-Zamanlı 2.000 Thread ile 1 CPU 8 Core sistem üzerinde, 15.000 reqs/sec karşılanmaktadır.
Bu sonuçlar çağrılan servisin yanıt süresine, network gecikmesine, gateway üzerine eklenen politikaların sistem gereksinimlerine göre değişiklik göstereceğinden yaptığımız yük testinin detaylarını aşağıdaki bölümde inceleyebilirsiniz.

Test Ortamı

Apinizer platformunun kolay kullanımı ve hızlı desteği nedeniyle yük testlerinin çalıştırılmasında altyapı olarak DigitalOcean platformu kullanılmıştır.

Yük Testi Topolojisi

Yük testi topolojisi aşağıdaki gibidir: Yük Testi Topolojisi

Yük Test Sunucusu

  • CPU-Optimized
  • Dedicated CPU
  • 8 vCPUs (Intel Xeon Scalable, 2.5 GHz)
  • 16 GB RAM
  • 100 GB Disk
  • CentOS 8.3 x64

Kubernetes Master & MongoDB

  • CPU-Optimized
  • Dedicated CPU
  • 4 vCPUs (Intel Xeon Scalable, 2.5 GHz)
  • 8 GB RAM
  • 50 GB Disk
  • CentOS 8.3 x64

Elasticsearch

  • CPU-Optimized
  • Dedicated CPU
  • 8 vCPUs (Intel Xeon Scalable, 2.5 GHz)
  • 16 GB RAM
  • 100 GB Disk
  • CentOS 8.3 x64

Kubernetes Worker

  • CPU-Optimized
  • Dedicated CPU
  • 16 vCPUs (Intel Xeon Scalable, 2.5 GHz)
  • 32 GB RAM
  • 200 GB Disk
  • CentOS 8.3 x64

Test Kurulumu

1. Yük Test Sunucusu Kurulumu ve JMeter Yapılandırması

Yük testi için JMeter kullanılmıştır. Kurulum adımları:
yum install java-1.8.0-openjdk -y
java -version
Kurulum Doğrulama:
openjdk version "1.8.0_275"
OpenJDK Runtime Environment (build 1.8.0_275-b01)
OpenJDK 64-Bit Server VM (build 25.275-b01, mixed mode)
yum install wget -y
wget http://apache.stu.edu.tw//jmeter/binaries/apache-jmeter-5.2.1.tgz
tar -xf apache-jmeter-5.2.1.tgz
Ortam Değişkenleri:
export JMETER_HOME=/root/apache-jmeter-5.2.1
export PATH=$JMETER_HOME/bin:$PATH
source ~/.bashrc
  • Thread sayısı parametrik yapılandırıldı
  • Test süresi parametrik yapılandırıldı
  • HTTP istekleri yapılandırıldı
  • Sonuç toplama mekanizması ayarlandı

2. NGINX Yapılandırması

NGINX, yük dengeleyici olarak kullanılmıştır:

NGINX Özellikleri

  • Load balancing
  • SSL termination
  • Reverse proxy
  • Health check

Yapılandırma

  • Upstream server tanımları
  • Proxy pass ayarları
  • Timeout ayarları
  • Connection pool ayarları

3. Apinizer ve Log Server Kurulumu

Kubernetes, MongoDB ve Elasticsearch kurulumları Apinizer kurulum dokümantasyonuna göre yapılmıştır.
Kubernetes master, worker, MongoDB, Elasticsearch ve Apinizer kurulumları Apinizer Kurulum Dokümantasyonu adresinde yer alan kurulum adımları takip edilerek yapılmıştır.

Yük Testinin Önemli Noktaları

Test ederken dikkat edilecek noktalar:

Asenkron Loglama

Apinizer, tüm istek & yanıt mesajlarını ve metriklerini Elasticsearch log veritabanında asenkron olarak saklar. Testler sırasında bu loglama işlemleri olması gerektiği gibi devam etti.

Ağ Gecikmesi

Tüm testlerimizde ağ gecikmesini azaltmak ve Apinizer’ın gerçek etkisini görmek için iç IP’ler kullanıldı.

Pod Yeniden Başlatma

Kubernetes’in çalışma zamanı sırasında pod’ları yeniden başlatmadığını özellikle gözlemledik. Yeniden başlatma sayısı, aşırı yük/tıkanma veya hatalı durumları yansıttığı için önemli bir parametredir.

JVM Monitoring

JVM performans metrikleri JConsole ile izlendi. JMX servisi Kubernetes üzerinden dış dünyaya açıldı.

Test Senaryoları

Test senaryoları farklı durumlar için yapılandırılmıştır:
  • Minimal konfigürasyon
  • Temel API Proxy
  • Politikasız test
  • Orta seviye konfigürasyon
  • Temel politikalar
  • Standart kullanım senaryosu
  • Gelişmiş konfigürasyon
  • Çoklu politika desteği
  • Yüksek performans senaryosu
  • Optimize edilmiş konfigürasyon
  • Performans optimizasyonları
  • Production-ready senaryo

Yük Testi Sonuçları

GET İstekleri Sonuçları

DurumThread CountThroughput (reqs/sec)Avg Response Time (ms)
A501,13343
1001,10090
2501,025242
500963516
B502,23222
1002,16945
2502,089119
5001,915259
1,0001,762564
1,5001,631915
2,0001,3791,441
C508,0906
1007,81612
2507,01135
5006,75973
1,0006,742147
1,5006,683223
2,0006,692297
4,0006,448617
D5015,4203
10015,8126
25015,61415
50015,66431
1,00015,45464
1,50015,02699
2,00014,839133
4,00014,356276
8,00011,603655

POST 5KB İstekleri Sonuçları

DurumThread CountThroughput (reqs/sec)Avg Response Time (ms)
A501,00249
100983101
250852292
B501,86826
1001,76856
2501,456170
5001,398355
1,0001,229809
1,5001,1991,245
C507,3536
1007,25713
2507,13834
5007,14169
1,0007,011141
1,5006,935215
D5013,3963
10013,4827
25013,58718
50013,61136
1,00013,56273
1,50013,208112
2,00013,179150
4,00012,792309
8,00011,115701

POST 50KB İstekleri Sonuçları

DurumThread CountThroughput (reqs/sec)Avg Response Time (ms)
A5067573
100653152
250554448
B501,43734
1001,40970
2501,223203
5001,149432
1,0008771,134
C504,67910
1004,67521
2504,02061
5003,221154
1,0002,962335
D504,68310
1004,67121
2504,38256
5003,496142
1,0003,046326
1,5002,853522
2,0002,794710

Sonuçların Yorumlanması

Eş Zamanlı Kullanıcı ve İstek Sayısı

Önemli: Sonuçları incelerken çok sık yapılan hata session sayısı ile anlık istek sayısının karıştırılmasıdır.
Throughput & Concurrent Users: Throughput ve Eş Zamanlı Kullanıcı Sayısı Ortalama Bellek Kullanımı: Ortalama Bellek Kullanımı

İstek

Belirli bir HTTP metodu ile belirli bir hedef için yapılan HTTP isteğidir

Session

Session başına sıfır veya daha fazla istek olabilir
Gateway’lerde session tutmak çok nadir görülür, genellikle servislere erişim stateless’dir. Bu yüzden eş zamanlı istek sayısını ve gecikmeyi (latency) ölçmek daha anlamlı hale gelir.

Ölçeklendirme

Dikey Ölçeklendirme

Eşzamanlı kullanıcı sayısı arttığında verim belirli bir sınıra kadar artar. Sonrasında düşüş yaşanmaya başlar. Bu doğal seyir dikey büyümenin bir sınırı olduğunu ifade eder.

Yatay Ölçeklendirme

Kabul edilebilir yanıt sürelerine sahip daha fazla eşzamanlı kullanıcıyı desteklemek için yatay veya dikey ölçeklendirmeyi beraber düşünmek gerekir. Apinizer’da Kubernetes altyapısı kullanıldığından bu işlem çok kolay ve hızlı şekilde yapılandırılabilir.

Mesaj Boyutu Etkisi

Mesaj boyutları arttığında işlem gücü artacağından verim azalır. Dolayısıyla yanıt süresi de uzar.
Genellikle gerçek yaşam senaryolarında istek boyutları 1KB ortalamasında olsa da testlerimizde 1KB POST ile GET isteklerimiz arasında çok küçük bir fark olduğundan 5KB ve 50KB POST isteklerini incelemeye değer bulduk.
Sonuçlar doğal olarak GET isteklerine göre daha düşük bir değerde seyretse de 10 kat artan veriye göre rakamların sadece 4’te birine düşmesi bizim adımıza sevindirici oldu.

Bellek Kullanımı

Yük testi boyunca harcanan RAM oranları çok tutarlıydı. İsteklerin boyutu on kat artsa da RAM kullanımında ciddi bir artış gözlenmedi. Bu da OpenJ9’un doğru bir tercih olduğunu ispatladı.

Politika Performans Etkisi

Gateway’e eklediğimiz her bir politika, gateway’de karmaşıklığına ve bağımlılıklarına göre performansı etkiler.

Basic Authentication Politika Testi

“Basic Authentication” politikası eklenerek test edilmiştir (Durum D):
Thread CountGET ThroughputGET Avg (ms)GET with Policy ThroughputGET with Policy Avg (ms)
5015,420314,7603
10015,812614,8436
25015,6141514,89116
50015,6643114,74833
1,00015,4546414,28568
1,50015,0269914,373102
2,00014,83913314,280136
4,00014,35627613,795279
8,00011,60365511,437672
Throughput & Concurrent Users: Throughput Karşılaştırması - Politika ile ve Politika Olmadan Ortalama Bellek Kullanımı: Ortalama Bellek Kullanımı - Politika ile ve Politika Olmadan
Gördüğümüz gibi performansa etkisi hissedilmeyecek derecede de olsa olmuş. Fakat örneğin “content filtering” gibi işlem gücü yüksek maliyetli bir politika eklenseydi ya da “LDAP Authentication” gibi dış bağlantı gerektiren ve araya bir de network latency ekleyen politika eklenseydi performans daha da hızlı bir şekilde düşecekti.

Politika Seçimi Best Practices

Politika Karmaşıklığı

Her bir politikanın ne kadar yük getireceğini bilmek ve tasarımı ona göre seçmek önemlidir.

Dış Bağlantılar

LDAP Authentication gibi dış bağlantı gerektiren politikalar network latency ekler ve performansı etkiler.

İşlem Gücü

Content filtering gibi işlem gücü yüksek maliyetli politikalar CPU kullanımını artırır.

Politika Sıralaması

Politikaların sıralaması ve koşullu çalıştırılması performansı etkiler.

Performans Metrikleri

Throughput (İşlem Hızı)

Throughput, saniyede işlenen istek sayısını gösterir. Durum D’de optimize edilmiş konfigürasyon ile:

GET İstekleri

15,000+ reqs/sec (2,000 thread)

POST 5KB İstekleri

13,000+ reqs/sec (2,000 thread)

POST 50KB İstekleri

2,700+ reqs/sec (2,000 thread)

Response Time (Yanıt Süresi)

Ortalama yanıt süreleri:

GET İstekleri

3-655 ms (thread sayısına göre)

POST 5KB İstekleri

3-701 ms

POST 50KB İstekleri

10-710 ms

Ölçeklenebilirlik

  • Tek node üzerinde 8,000 thread’e kadar test edilmiştir
  • 2,000 thread’de optimal performans gözlemlenmiştir
  • Daha yüksek thread sayılarında throughput düşmeye başlar
  • Kubernetes altyapısı ile kolay ölçeklendirme
  • Load balancer ile çoklu gateway desteği
  • Otomatik pod scaling

Sonuçlar ve Öneriler

Ana Bulgular

Yüksek Performans

Optimize edilmiş konfigürasyon ile 15,000+ reqs/sec throughput elde edilmiştir.

Düşük Latency

GET istekleri için 3ms’den başlayan yanıt süreleri gözlemlenmiştir.

Bellek Verimliliği

Mesaj boyutu 10 kat artsa bile RAM kullanımında ciddi artış gözlenmemiştir.

Politika Etkisi

Basic Authentication gibi basit politikaların performans etkisi minimaldir.

Öneriler

  • Durum D konfigürasyonunu kullanın
  • Kubernetes ile yatay ölçeklendirme yapın
  • Monitoring ve alerting yapılandırın
  • Politikaların performans etkisini değerlendirin
  • Gereksiz politikaları kaldırın
  • Politika sıralamasını optimize edin
  • Beklenen yükü hesaplayın
  • Thread sayısını optimize edin
  • Yatay ölçeklendirme planı yapın

Sonraki Adımlar