Bir uç nokta yayınladınız. Tarayıcıda çalışıyor; ancak 400 eşzamanlı istek geldiğinde ne olacağını bilmiyorsunuz. Gecikme sabit mi kalacak, p99 patlayacak mı, servis saniyede 1.000 isteği kaldıracak mı yoksa 300 RPS civarında mı çökecek?
wrk bu sorulara hızlı yanıt verir. Belirli bir URL'ye yüksek hacimli HTTP trafiği gönderir ve sunucunun yük altında ne kadar hızlı yanıt verdiğini raporlar.
wrk Nedir ve Ne Zaman Kullanılır
wrk, modern bir HTTP performans ölçüm aracıdır. Tek bir çok çekirdekli makineden yük üretir; sunucunun gecikmesini, istek oranını ve aktarım miktarını ölçer.
Linux'ta epoll, macOS'ta kqueue kullanan ölçeklenebilir bir olay döngüsü ve çoklu iş parçacığı modeliyle çalışır. Bu nedenle tek bir makineden ciddi miktarda trafik üretebilir.
wrk şu sorular için uygundur:
- Bu endpoint saniyede kaç isteği sürdürebiliyor?
- Ortalama gecikme ile p90/p99 gecikme arasında ne kadar fark var?
- Servis 30 saniye, 2 dakika veya daha uzun sürekli yük altında stabil kalıyor mu?
- Bağlantı sayısı arttıkça verimlilik nerede plato yapıyor?
Ancak önemli ayrım şu: wrk bir fonksiyonel test aracı değildir. Hızı ölçer; JSON gövdesinin doğru olup olmadığını, durum kodunun beklenen değer olup olmadığını veya API sözleşmesinin bozulup bozulmadığını doğrulamaz.
Yük testi kavramlarını daha geniş bağlamda görmek isterseniz bu API yük testi rehberi wrk ile ölçtüğünüz metriklerin ne anlama geldiğini açıklar.
wrk Kurulumu
macOS
Homebrew ile kurulum en pratik yoldur:
brew install wrk
Apple Silicon kullanıyorsanız Homebrew ikilisini tercih edin. Kaynaktan derleme sırasında LuaJIT ARM64 sorunlarıyla uğraşmanız gerekmez.
Kurulumu doğrulayın:
wrk --version
Linux
Resmi bir apt paketi olmadığı için kaynaktan derleyin.
Önce bağımlılıkları kurun:
sudo apt-get update
sudo apt-get install build-essential libssl-dev git -y
Ardından depoyu klonlayıp derleyin:
git clone https://github.com/wg/wrk.git
cd wrk
make
Oluşan ikiliyi PATH içine taşıyın:
sudo cp wrk /usr/local/bin
Kontrol edin:
wrk --version
İlk wrk Testinizi Çalıştırın
Temel komut yapısı şöyledir:
wrk -t12 -c400 -d30s http://127.0.0.1:8080/index.html
Bu komut şu anlama gelir:
-
-t12: 12 iş parçacığı kullan. -
-c400: Toplam 400 açık HTTP bağlantısı tut. -
-d30s: Testi 30 saniye çalıştır. - Son argüman: Test edilecek URL.
Daha pratik bir başlangıç komutu:
wrk -t8 -c200 -d30s --latency http://localhost:3000/api/users
Bu komut 8 thread, 200 bağlantı ve 30 saniyelik test kullanır. --latency bayrağı, yüzdelik gecikme dağılımını da yazdırır.
Önemli Bayraklar
Sık kullanacağınız bayraklar:
| Bayrak | Açıklama |
|---|---|
-t, --threads
|
wrk'nin kullanacağı OS thread sayısı |
-c, --connections
|
Toplam açık bağlantı sayısı |
-d, --duration
|
Test süresi |
--latency |
Gecikme yüzdeliklerini yazdırır |
--timeout |
Belirtilen sürede yanıt gelmezse isteği timeout sayar |
-H |
HTTP header ekler |
-s |
Lua betiği çalıştırır |
Örneğin timeout eklemek için:
wrk -t8 -c200 -d30s --latency --timeout 2s http://localhost:3000/api/users
--timeout kullanmak önemlidir. Aksi halde çok yavaş yanıtlar gecikme sayılarını şişirebilir ve testin davranışını yorumlamayı zorlaştırabilir.
Thread ve Bağlantı Sayısını Seçme
Başlangıç için pratik yaklaşım:
- Thread sayısını CPU çekirdeği sayısına yakın seçin.
- Bağlantı sayısını modellemek istediğiniz eşzamanlı kullanıcı sayısına göre ayarlayın.
- Bağlantı sayısını kademeli artırın.
- RPS artışı durduğunda veya p99 gecikme hızlı yükseldiğinde sınırı not edin.
Örnek:
wrk -t4 -c50 -d30s --latency http://localhost:3000/api/users
wrk -t4 -c100 -d30s --latency http://localhost:3000/api/users
wrk -t4 -c200 -d30s --latency http://localhost:3000/api/users
wrk -t4 -c400 -d30s --latency http://localhost:3000/api/users
Sadece sunucuyu değil, yük üreten makineyi de izleyin. Eğer wrk çalıştıran makine CPU limitine takılırsa ölçtüğünüz sınır sunucunun değil, istemcinin sınırı olur.
Çıktıyı Okuma
Örnek wrk çıktısı:
Running 5s test @ http://10.135.232.163:3000
2 threads and 5 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 3.82ms 2.64ms 26.68ms 85.81%
Req/Sec 550.90 202.40 0.98k 68.00%
5494 requests in 5.01s, 1.05MB read
Requests/sec: 1096.54
Transfer/sec: 215.24KB
Önce en alttaki iki satıra bakın.
Requests/sec
Requests/sec: 1096.54
Bu, sunucunun ortalama saniyede kaç isteği tamamladığını gösterir. Kod değişiklikleri, deployment ayarları veya altyapı değişiklikleri arasında karşılaştıracağınız ana metriklerden biridir.
Transfer/sec
Transfer/sec: 215.24KB
Saniye başına aktarılan veri miktarıdır. Büyük payload'larda veya ağ bant genişliği sınırından şüpheleniyorsanız önemlidir.
Latency
Latency 3.82ms 2.64ms 26.68ms 85.81%
Bu satır şunları gösterir:
- Ortalama gecikme:
3.82ms - Standart sapma:
2.64ms - Maksimum gecikme:
26.68ms - Örneklerin standart sapma içindeki oranı:
%85.81
Ortalama tek başına yeterli değildir. Maksimum ve yüzdelikler, kuyruk gecikmesini anlamak için daha değerlidir.
p50, p90 ve p99 Gecikmeyi Yorumlama
--latency eklediğinizde wrk şu tarz bir blok üretir:
Latency Distribution
50% 3.21ms
75% 4.86ms
90% 7.09ms
99% 14.13ms
Bu değerleri şöyle okuyun:
-
50%: İsteklerin yarısı bu süreden hızlı tamamlandı. -
90%: İsteklerin %90'ı bu süreden hızlı tamamlandı. -
99%: İsteklerin %99'u bu süreden hızlı tamamlandı.
Özellikle 99% değerini izleyin. Ortalama 3.82ms iken p99 14.13ms ise kullanıcıların küçük ama önemli bir kısmı ortalamanın çok üzerinde bekliyor demektir.
Performans analizinde çoğu zaman sorun ortalamada değil, kuyruktadır.
POST İstekleri Gönderme
Varsayılan olarak wrk GET isteği gönderir. POST, request body veya özel header kullanmak için Lua betiği yazabilirsiniz.
post.lua oluşturun:
wrk.method = "POST"
wrk.body = '{"name": "Ada", "role": "engineer"}'
wrk.headers["Content-Type"] = "application/json"
Çalıştırın:
wrk -t4 -c100 -d30s -s post.lua --latency http://localhost:3000/api/users
Bu komut:
-
POST /api/usersçağırır. - JSON gövdesi gönderir.
-
Content-Type: application/jsonheader'ı ekler. - 100 bağlantıyla 30 saniyelik yük uygular.
Form Data ile POST Gönderme
Form encoded body göndermek için:
wrk.method = "POST"
wrk.body = "foo=bar&baz=quux"
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"
Çalıştırma komutu aynıdır:
wrk -t4 -c100 -d30s -s post.lua --latency http://localhost:3000/api/form
Header Ekleme
Sadece header eklemeniz gerekiyorsa Lua betiği şart değildir. -H kullanabilirsiniz:
wrk -t4 -c100 -d30s \
-H "Authorization: Bearer TOKEN123" \
--latency \
http://localhost:3000/api/protected
Birden fazla header için:
wrk -t4 -c100 -d30s \
-H "Authorization: Bearer TOKEN123" \
-H "X-Client-Version: dev" \
--latency \
http://localhost:3000/api/protected
Kural basit:
- Sadece header gerekiyorsa
-Hkullanın. - Body, farklı HTTP metodu veya request başına dinamik mantık gerekiyorsa Lua betiği kullanın.
Basit Test Planı: Kademeli Yük Artırma
Tek bir komutla sonuca varmak yerine, yükü kademeli artırın.
Örnek plan:
wrk -t4 -c50 -d30s --latency http://localhost:3000/api/users
wrk -t4 -c100 -d30s --latency http://localhost:3000/api/users
wrk -t4 -c200 -d30s --latency http://localhost:3000/api/users
wrk -t4 -c400 -d30s --latency http://localhost:3000/api/users
Her çalıştırmada şunları kaydedin:
Requests/sec- p50
- p90
- p99
- timeout veya bağlantı hataları
- sunucu CPU/RAM kullanımı
- veritabanı bağlantı havuzu kullanımı
- uygulama log'larında hata oranı
Amaç sadece en yüksek RPS değerini bulmak değildir. Amaç, kabul edilebilir p99 gecikmeyle sürdürülebilir kapasiteyi bulmaktır.
Süreyi Nasıl Seçmelisiniz?
Hızlı smoke test için birkaç saniye yeterli olabilir:
wrk -t2 -c20 -d5s --latency http://localhost:3000/health
Daha güvenilir ölçüm için en az 30 saniye kullanın:
wrk -t8 -c200 -d30s --latency http://localhost:3000/api/users
Sızıntılar, cache davranışı, connection pool tükenmesi veya uzun süreli bozulmaları görmek için birkaç dakikaya çıkın:
wrk -t8 -c200 -d5m --latency http://localhost:3000/api/users
HTTPS Endpoint Test Etme
wrk HTTPS URL'lerini test edebilir:
wrk -t8 -c200 -d30s --latency https://api.example.com/users
TLS el sıkışması ve şifreleme CPU maliyeti ekler. Bu nedenle HTTPS altında ham RPS değerinin HTTP'ye göre daha düşük olması normaldir.
Linux'ta derleme sırasında libssl-dev gereksiniminin nedeni de budur.
Sınırlamalar: wrk Doğruluğu Kontrol Etmez
wrk yalnızca HTTP alışverişinin tamamlandığını ve ne kadar sürdüğünü ölçer. Şunları doğrulamaz:
- Durum kodu gerçekten
200mü? - Yanıt gövdesi beklenen JSON şemasına uyuyor mu?
- İş mantığı doğru çalışıyor mu?
- API sözleşmesi bozuldu mu?
- Yanıt hatalı ama hızlı mı dönüyor?
Örneğin endpoint her istekte 500 dönüyorsa wrk yine yüksek Requests/sec raporlayabilir. Çünkü hatalı yanıt da tamamlanmış bir HTTP yanıtıdır.
Bu yüzden wrk şu soruya yanıt verir:
Yük altında yeterince hızlı mı?
Ama şu soruya yanıt vermez:
Doğru çalışıyor mu?
Bu iki soruyu ayrı araçlarla çözmek gerekir. Bu nedenle ekipler genellikle performans ölçümünü bir fonksiyonel test paketiyle birlikte kullanır.
Apidog ve Fonksiyonel Test Katmanı
Sağlıklı iş akışı iki aşamalıdır.
1. Önce davranışı doğrulayın
Performans ölçmeden önce endpoint'in doğru çalıştığını kanıtlayın.
Apidog ile gerçek istekler gönderen test senaryoları oluşturabilirsiniz. Bu senaryolarda şunları doğrulayabilirsiniz:
- HTTP durum kodları
- JSON alanları
- Yanıt şeması
- İş mantığı beklentileri
- Ortam değişkenleri
- Zincirlenmiş istekler arası veri aktarımı
Bu katman, wrk'nin hızlı gibi gösterebileceği bozuk endpoint'leri yakalar.
2. Sonra verimliliği ölçün
Davranış doğrulandıktan sonra aynı endpoint'lere wrk ile yük uygulayın:
wrk -t8 -c200 -d30s --latency http://localhost:3000/api/users
Böylece performans sayılarınız anlamlı hale gelir. Çünkü ölçtüğünüz endpoint'in gerçekten doğru çalıştığını önceden doğrulamış olursunuz.
Apidog ayrıca fonksiyonel ve yük çalışmalarını tek yerde tutmak isteyen ekipler için yerleşik performans testi özelliği de sunar. wrk ise ham komut satırı performans ölçümü için iyi bir özel araçtır.
CI'da Apidog CLI ile Doğruluk Kapısı Eklemek
Fonksiyonel testleri yalnızca lokal makinede çalıştırmak yeterli değildir. CI pipeline içinde de çalıştırabilirsiniz.
Apidog CLI'ı kurun:
npm install -g apidog-cli
Kaydedilmiş bir senaryoyu veya test paketini çalıştırın:
apidog run \
--access-token "$APIDOG_ACCESS_TOKEN" \
-t <senaryoVeyaPaketId> \
-e <ortamId> \
-r cli,html,junit
Parametreler:
-
-t: Çalıştırılacak senaryo, klasör veya paket kimliği. -
-e: Ortam kimliği. -
-r: Rapor formatları.cli,html,json,junitkullanılabilir.
JUnit çıktısı çoğu CI sisteminde doğrudan test raporu olarak kullanılabilir.
Veri odaklı çalıştırmalar için:
apidog run \
--access-token "$APIDOG_ACCESS_TOKEN" \
-t <senaryoVeyaPaketId> \
-e <ortamId> \
-d ./test-data.csv \
-r cli,junit
-d veya --iteration-data, aynı senaryoyu farklı giriş verileriyle tekrar çalıştırmak için kullanılır.
Apidog CLI başsızdır. Etkileşimli istek gönderici veya yük üretici değildir. Pipeline içinde doğruluk kapısı olarak konumlandırın; performans ölçümü gerektiğinde wrk çalıştırın.
CI yapılandırması için şu kılavuzlara bakabilirsiniz:
Sıkça Sorulan Sorular
wrk ile ab (ApacheBench) arasındaki fark nedir?
İkisi de HTTP yükü gönderir ve saniyedeki istek sayısını raporlar. wrk çok iş parçacıklıdır ve olay döngüsü kullanır. Bu nedenle tek bir makineden daha yüksek yük üretebilir ve yüksek eşzamanlılığı daha iyi yönetir.
ab tek iş parçacıklıdır. Basit kontroller için kullanılabilir, ancak ağır yük üretiminde wrk genellikle daha iyi ölçeklenir.
İkisi de yanıt doğruluğunu kontrol etmez.
Kaç thread ve bağlantı kullanmalıyım?
CPU çekirdeği başına yaklaşık bir thread ile başlayın. Bağlantı sayısını simüle etmek istediğiniz eşzamanlılık düzeyine göre ayarlayın.
Örneğin 8 çekirdeğiniz ve 200 eşzamanlı istemci hedefiniz varsa:
wrk -t8 -c200 -d30s --latency http://localhost:3000/api/users
Sonra bağlantı sayısını artırarak RPS ve p99 davranışını izleyin.
wrk HTTPS endpoint'leri test edebilir mi?
Evet. URL'yi https:// ile verin:
wrk -t8 -c200 -d30s --latency https://api.example.com/users
TLS CPU maliyeti eklediği için HTTPS testlerinde RPS değeri HTTP'ye göre daha düşük olabilir.
wrk durum kodunu veya response body'yi doğrular mı?
Hayır. wrk tamamlanmış HTTP alışverişlerini sayar ve zamanlamayı ölçer. Durum kodu, JSON şeması veya response body doğrulaması yapmaz.
Bu nedenle önce Apidog CLI gibi bir fonksiyonel test katmanıyla doğruluğu test edin, ardından wrk ile verimliliği ölçün.
Bir yük testi ne kadar sürmeli?
Hızlı kontrol için 5-10 saniye yeterli olabilir. Daha güvenilir ölçüm için 30 saniye veya birkaç dakika kullanın.
Başlangıç varsayılanı olarak:
wrk -t8 -c200 -d30s --latency http://localhost:3000/api/users
Sadece uzun süreli yük altında ortaya çıkan sorunları arıyorsanız süreyi artırın:
wrk -t8 -c200 -d5m --latency http://localhost:3000/api/users
wrk sonucunda hangi metriğe bakmalıyım?
Öncelik sırası genellikle şöyledir:
Requests/sec- p99 gecikme
- p90 gecikme
- timeout veya bağlantı hataları
- sunucu CPU/RAM/veritabanı metrikleri
Yüksek RPS tek başına iyi sonuç değildir. Kabul edilebilir p99 gecikme ile sürdürülebilir RPS hedefleyin.
Top comments (0)