Bir uç nokta gönderdiniz. Postman'de doğru JSON'ı döndürüyor. Peki 200 istemci aynı anda vurduğunda ne olur? Saniyede 500 isteği kaldırır mı, yoksa 50 eşzamanlı istekte gecikme süresi yükselmeye mi başlar? ApacheBench bu soruya tek komutla hızlı bir ilk yanıt verir.
ab olarak çağrılan ApacheBench, tek bir URL'ye belirlediğiniz sayıda HTTP isteği gönderen ve verim ile gecikme süresini raporlayan bir komut satırı aracıdır. Apache HTTP Sunucusu ile birlikte gelir, hızlı çalışır ve bir uç noktanın yük altında nasıl davrandığını görmek için pratik bir başlangıç noktasıdır.
Bu rehberde ab kurulumunu, GET ve POST testlerini, başlık eklemeyi, çıktıyı yorumlamayı ve ab yerine daha kapsamlı bir araç kullanmanız gereken durumları uygulamalı olarak göreceksiniz. Buradaki komutlar, resmi Apache ab referansında belgelenen seçeneklere dayanır.
ApacheBench nedir ve nereden gelir?
ab, Apache HTTP Sunucusu ile birlikte gelen bir kıyaslama istemcisidir. Tek bir URL'ye bağlantılar açar, eşzamanlılık ayarınızın izin verdiği kadar hızlı istek gönderir, her yanıtı zamanlar ve test sonunda özet metrikler üretir.
ab özellikle şu sorular için kullanışlıdır:
- Bu endpoint saniyede kaç istek işleyebiliyor?
- Eşzamanlılık arttığında ortalama yanıt süresi nasıl değişiyor?
- %95 ve %99 gecikme süreleri nerede bozuluyor?
- Yük altında 5xx veya 4xx hataları oluşuyor mu?
Ancak kapsamı dardır. ab:
- Yanıt gövdesinin doğru olup olmadığını doğrulamaz.
- JSON şeması kontrol etmez.
- Alan bazlı assertion çalıştırmaz.
- Login → veri alma → güncelleme gibi çok adımlı akışları modellemez.
- Aynı anda yalnızca tek URL test eder.
Bu yüzden ab'yi fonksiyonel test aracı değil, tek endpoint için hızlı yük probu olarak düşünün.
Daha geniş bağlam için API yük testinin ne olduğunu ve API yanıt süresinin neden önemli olduğunu inceleyebilirsiniz.
ab'yi kurmak
ab, Apache yardımcı araçlarıyla birlikte gelir. Kurulum komutu işletim sistemine göre değişir.
Debian ve Ubuntu
sudo apt-get update
sudo apt-get install -y apache2-utils
CentOS, RHEL ve Fedora
# CentOS 7
sudo yum install -y httpd-tools
# Fedora ve CentOS 8+
sudo dnf install -y httpd-tools
macOS
macOS genellikle Apache ile birlikte ab içerir. Kontrol edin:
ab -V
Version 2.3 benzeri bir çıktı görüyorsanız hazırsınız.
Komut yoksa Homebrew ile Apache paketini kurabilirsiniz. Kurulumdan sonra tekrar doğrulayın:
ab -V
Temel bir yük testi çalıştırma
ab ile en çok kullanacağınız iki seçenek şunlardır:
-
-n: Toplam istek sayısı -
-c: Aynı anda çalışacak eşzamanlı istek sayısı
Örnek:
ab -n 1000 -c 50 https://api.example.com/v1/users
Bu komut şunu yapar:
- Toplam
1000istek gönderir. - Aynı anda en fazla
50isteği açık tutar. - Testi
https://api.example.com/v1/usersendpoint'ine uygular.
Not:
abtam URL ister. Sadece host vermek yerine path de ekleyin. Kök endpoint'i test edecekseniz sondaki/karakterini kullanın:
ab -n 1000 -c 50 https://api.example.com/
KeepAlive ile daha gerçekçi test
Gerçek istemciler çoğu zaman her istek için yeni TCP bağlantısı açmaz; bağlantıları yeniden kullanır. Bunu -k ile simüle edebilirsiniz:
ab -n 1000 -c 50 -k https://api.example.com/v1/users
-k, HTTP KeepAlive kullanır. Bu sayede bağlantı kurma maliyeti azalır ve test, tarayıcı veya iyi yapılandırılmış API istemcilerine daha yakın davranır.
Karşılaştırma yapmak için iki testi ayrı ayrı çalıştırın:
# Her istekte yeni bağlantı
ab -n 1000 -c 50 https://api.example.com/v1/users
# KeepAlive ile bağlantı yeniden kullanımı
ab -n 1000 -c 50 -k https://api.example.com/v1/users
Aradaki fark, gecikmenizin ne kadarının bağlantı kurulumundan kaynaklandığını gösterir.
Sabit süreli test çalıştırma
Toplam istek sayısı yerine testi belirli süre çalıştırmak istiyorsanız -t kullanın:
ab -t 30 -c 50 -k https://api.example.com/v1/users
Bu komut:
- Testi en fazla
30saniye çalıştırır. - Eşzamanlılığı
50olarak ayarlar. - KeepAlive kullanır.
-t, dahili olarak yüksek bir -n değeri kullanır ve süre dolunca testi durdurur. Kısa smoke testleri için kullanışlıdır.
Bir POST uç noktasını test etme
Çoğu API testi sadece GET değildir. POST endpoint test etmek için istek gövdesini bir dosyaya koymanız ve -p ile geçirmeniz gerekir. Ayrıca Content-Type başlığını -T ile açıkça belirtmelisiniz.
1. Payload dosyasını oluşturun
cat > payload.json <<'EOF'
{"name": "Ada Lovelace", "email": "ada@example.com"}
EOF
2. POST yük testi çalıştırın
ab -n 500 -c 25 -k \
-p payload.json \
-T application/json \
https://api.example.com/v1/users
Burada:
-
-p payload.json: POST body olarak kullanılacak dosyayı belirtir. -
-T application/json:Content-Typebaşlığını ayarlar. -
-n 500: Toplam 500 istek gönderir. -
-c 25: Aynı anda 25 istek çalıştırır. -
-k: KeepAlive kullanır.
-T belirtmezseniz varsayılan içerik türü text/plain olur. JSON API testlerinde genellikle açıkça şunu kullanmalısınız:
-T application/json
Authorization header ekleme
Endpoint token gerektiriyorsa -H kullanın:
ab -n 500 -c 25 -k \
-p payload.json \
-T application/json \
-H "Authorization: Bearer YOUR_TOKEN" \
https://api.example.com/v1/users
Birden fazla header gerekiyorsa -H bayrağını tekrar edin:
ab -n 500 -c 25 -k \
-p payload.json \
-T application/json \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "X-Request-Source: load-test" \
https://api.example.com/v1/users
JSON gövdeleri hazırlama konusunda pratik bir hatırlatma için curl ile JSON verileri nasıl POST edilir başlıklı yazıya bakabilirsiniz. Aynı JSON dosyası ab payload'ı olarak da kullanılabilir.
Çıktıyı okuma
Örnek bir ab çıktısı şöyle görünür:
Concurrency Level: 50
Time taken for tests: 4.212 seconds
Complete requests: 1000
Failed requests: 0
Non-2xx responses: 0
Requests per second: 237.42 [#/sec] (mean)
Time per request: 210.598 [ms] (mean)
Time per request: 4.212 [ms] (mean, across all concurrent requests)
Transfer rate: 142.31 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 5 18 9.4 16 64
Processing: 22 189 41.2 182 310
Waiting: 21 177 39.8 171 295
Total: 31 207 42.7 201 338
Percentage of the requests served within a certain time (ms)
50% 201
66% 221
75% 236
90% 268
95% 291
99% 324
100% 338 (longest request)
İlk olarak şu alanlara bakın.
Requests per second
Requests per second: 237.42 [#/sec] (mean)
Bu, endpoint'in ortalama verimidir. Toplam istek sayısının toplam süreye bölünmesiyle hesaplanır.
Tek başına yeterli değildir. Yüksek RPS iyi görünür, ancak hata oranı artıyorsa sonuç güvenilir değildir.
Failed requests ve Non-2xx responses
Failed requests: 0
Non-2xx responses: 0
Bunları RPS'ten önce kontrol edin.
-
Failed requests:abtarafından başarısız sayılan isteklerdir. -
Non-2xx responses: 2xx dışında dönen HTTP yanıtlarıdır.
Eğer yanıtların önemli bir kısmı 500, 502, 503 veya 429 ise yüksek RPS değeri gerçek başarıyı temsil etmez.
Dinamik JSON yanıtlarında gövde uzunluğu değişiyorsa ab, bazı istekleri başarısız sayabilir. Bu durumda uzunluk farklılıklarını hata olarak saymamak için -l kullanabilirsiniz:
ab -n 1000 -c 50 -l https://api.example.com/v1/users
Yine de Non-2xx responses satırını kontrol etmeye devam edin.
Time per request
Çıktıda iki farklı Time per request satırı vardır:
Time per request: 210.598 [ms] (mean)
Time per request: 4.212 [ms] (mean, across all concurrent requests)
İlk satır, bir kullanıcının ortalama bekleme süresine daha yakındır. Kullanıcı deneyimi açısından öncelikle bunu takip edin.
İkinci satır, tüm eşzamanlı istekler üzerinden tamamlanma aralığını gösterir. Verim hesaplaması için faydalıdır, ancak kullanıcı gecikmesi olarak okunmamalıdır.
Percentile tablosu
En önemli bölüm genellikle burasıdır:
Percentage of the requests served within a certain time (ms)
50% 201
66% 221
75% 236
90% 268
95% 291
99% 324
100% 338 (longest request)
Bu tablo gecikme dağılımını gösterir.
-
50%: Medyan gecikme -
95%: İsteklerin %95'inin bu sürede veya daha kısa sürede tamamlandığı nokta -
99%: Yavaş kuyruk davranışını gösterir -
100%: En yavaş istek
Ortalama gecikme düşük olsa bile %95 veya %99 yükseliyorsa gerçek kullanıcılar yavaşlık yaşamaya başlar. Bu yüzden özellikle p95 ve p99 değerlerini izleyin.
CSV veya gnuplot çıktısı alma
Grafik çizmek için percentile verisini CSV olarak yazdırabilirsiniz:
ab -n 1000 -c 50 -e results.csv https://api.example.com/v1/users
Gnuplot uyumlu çıktı için:
ab -n 1000 -c 50 -g results.tsv https://api.example.com/v1/users
Pratik test stratejisi
Tek bir komutla karar vermek yerine eşzamanlılığı kademeli artırın.
Örneğin:
ab -n 1000 -c 10 -k https://api.example.com/v1/users
ab -n 1000 -c 25 -k https://api.example.com/v1/users
ab -n 1000 -c 50 -k https://api.example.com/v1/users
ab -n 1000 -c 100 -k https://api.example.com/v1/users
Her çalıştırmada şunları kaydedin:
| Eşzamanlılık | RPS | Ortalama süre | p95 | p99 | Failed | Non-2xx |
|---|---|---|---|---|---|---|
| 10 | ||||||
| 25 | ||||||
| 50 | ||||||
| 100 |
Doygunluk noktasını şu sinyallerden anlarsınız:
- RPS artık artmıyor.
- p95 ve p99 hızlı yükseliyor.
-
Failed requestsgörünmeye başlıyor. -
Non-2xx responsesartıyor. - Sunucuda CPU, bellek, DB bağlantısı veya kuyruk metrikleri tavan yapıyor.
Bu noktada endpoint kapasitesine yaklaşmışsınızdır.
ab'nin doğru araç olmaktan çıktığı yer
ab basit ve hızlıdır, ancak bilinçli kullanılmalıdır.
Her çalıştırmada tek URL test eder
ab, tek endpoint'e yük uygular. Şu tür akışları modelleyemez:
- Login ol
- Token al
- Kaynak oluştur
- Kaynağı oku
- Kaynağı güncelle
- Logout ol
Gerçek kullanıcı yolculukları çoğu zaman birden fazla endpoint içerir. Böyle bir senaryo için ab uygun değildir.
Yanıt doğruluğunu kontrol etmez
ab, durum kodlarını ve yanıt boyutlarını sayar. Ancak:
- JSON parse etmez.
- Şema doğrulamaz.
- Alan değerlerini kontrol etmez.
- İş kuralı doğrulaması yapmaz.
Bir endpoint hızlı yanıt verebilir ama yanlış veri döndürebilir. ab bunu yakalamaz.
HTTP/2 desteklemez
Resmi dokümantasyona göre ab, HTTP/1.x davranışını bile tam olarak uygulamaz ve yalnızca beklenen bazı yanıt biçimlerini kabul eder. HTTP/2 desteği yoktur.
Sunucunuz HTTP/2 altında farklı davranıyorsa ab sonucu bunu yansıtmaz.
Tek makineden yük üretir
ab, tek makineden ve tek işlemden çalışır. Belirli bir eşzamanlılıktan sonra test ettiğiniz şey sunucu değil, yük üreten istemci makineniz olabilir.
Yük üreten makinede şunları izleyin:
- CPU kullanımı
- Açık dosya limiti
- Ağ bant genişliği
- Socket limitleri
- DNS veya TLS overhead'i
Bunlar sınıra gelirse ab sonuçları sunucu kapasitesini doğru göstermez.
Bu sınırlamalar ab'yi kötü yapmaz. Onu belirli bir iş için iyi yapar: tek endpoint üzerinde hızlı verim ve gecikme ölçümü.
Senaryolu akışlara, dağıtılmış yüke veya HTTP/2 desteğine ihtiyacınız varsa farklı araçlara geçin. JMeter çok adımlı senaryoları ve dağıtılmış çalıştırmaları destekler. Alternatifleri değerlendirmek için yük testi araçlarının daha geniş derlemesine bakabilirsiniz.
Fonksiyonel testin yeri
Performans tek eksendir. Doğruluk başka bir eksendir. ab, doğruluk tarafını test etmez.
Bir endpoint'i yük testine sokmadan önce şu sorulara yanıt vermelisiniz:
- Doğru durum kodunu dönüyor mu?
- Yanıt şemaya uyuyor mu?
- Zorunlu alanlar var mı?
- Değerler beklenen formatta mı?
- Hata senaryoları doğru çalışıyor mu?
- Çok adımlı API akışı doğru tamamlanıyor mu?
Bunlar fonksiyonel test ve sözleşme testi kapsamındadır.
Apidog, görsel assertion'larla test senaryoları oluşturmanıza, istekleri çok adımlı akışlara bağlamanıza ve yanıtları şemanıza göre doğrulamanıza olanak tanır. Bunlar ab'nin tasarım gereği yapmadığı işlerdir.
CI içinde çalıştırmak için Apidog CLI kullanabilirsiniz.
Önce CLI'ı kurun:
npm install -g apidog-cli
Ardından kaydedilmiş bir senaryoyu veya paketi seçilen ortama karşı çalıştırın:
apidog run \
--access-token "$APIDOG_ACCESS_TOKEN" \
-t <scenarioOrSuiteId> \
-e <environmentId> \
-r cli,html,junit
Parametreler:
-
-t: Senaryo, klasör veya paket kimliği -
-e: Ortam kimliği -
-r: Raporlayıcılar (cli,html,json,junit) -
-dveya--iteration-data: Veri odaklı testler için veri dosyası yolu veya test verisi kimliği
Sağlıklı bir test akışı şöyle olabilir:
- Apidog ile fonksiyonel senaryoları çalıştırın.
- Yanıtların doğru olduğunu doğrulayın.
- Aynı endpoint için
abile yük testi çalıştırın. - RPS, p95, p99 ve hata oranını kaydedin.
- Sonuçları CI raporları ve izleme metrikleriyle birlikte değerlendirin.
Doğruluk ve performans tarafını birlikte düşünmek için Apidog performans testi rehberine ve genel API performans testi eğitimine bakabilirsiniz.
Sıkça Sorulan Sorular
ApacheBench sadece Apache sunucuları için mi geçerlidir?
Hayır. Adına rağmen ab, herhangi bir HTTP veya HTTPS sunucusuna istek gönderebilir. Nginx, Node.js, Go, Python veya başka bir stack ile çalışan API'leri test edebilirsiniz. Apache bağlantısı, aracın Apache HTTP Sunucusu ile birlikte gelmesinden kaynaklanır.
Hangi eşzamanlılığı ve istek sayısını kullanmalıyım?
Düşükten başlayıp kademeli artırın.
Örneğin:
ab -n 1000 -c 10 -k https://api.example.com/v1/users
ab -n 1000 -c 25 -k https://api.example.com/v1/users
ab -n 1000 -c 50 -k https://api.example.com/v1/users
ab -n 1000 -c 100 -k https://api.example.com/v1/users
RPS'in nerede artmayı bıraktığını, p95/p99 değerlerinin nerede yükseldiğini ve hataların nerede başladığını izleyin. Test eşzamanlılığını rastgele büyük bir sayı yerine beklenen gerçek trafiğe göre seçin.
API sorunsuz çalışırken neden başarısız isteklerim yüksek?
Dinamik JSON yanıtlarında gövde uzunluğu istekler arasında değişebilir. ab, varsayılan davranışında bu uzunluk farklarını başarısızlık olarak sayabilir.
Bunu engellemek için -l kullanın:
ab -n 1000 -c 50 -l https://api.example.com/v1/users
Ardından gerçek hata olup olmadığını görmek için Non-2xx responses satırını kontrol edin.
ab, oturum açma belirteci gerektiren bir uç noktayı test edebilir mi?
Evet, elinizde hazır bir token varsa header olarak geçebilirsiniz:
ab -n 500 -c 25 -k \
-H "Authorization: Bearer YOUR_TOKEN" \
https://api.example.com/v1/users
Ancak ab önce login olup token alma, sonra bu token ile başka endpoint çağırma akışını otomatikleştiremez. Bu çok adımlı bir senaryodur ve Apidog gibi senaryo tabanlı bir araç gerektirir.
ab, HTTP/2'yi destekliyor mu?
Hayır. ab, HTTP/1.x konuşur ve resmi dokümantasyona göre HTTP/1.x davranışını bile tam olarak uygulamaz. Sunucunuzun HTTP/2 altındaki performansı önemliyse HTTP/2 destekleyen bir yük testi aracı kullanın.

Top comments (0)