HTTP servislerini yazdığımızda, yazılı servisleri yayına aldığımızda veya güncelleme yaptığımızda; bu ve benzer süreçlerin öncesinde, hatta bazen derleme aşamasında benchmark yaparak, ilgili servisin ne kadar isteğe cevap verdiğini ölçmek, olası performans problemlerinin veya bloklayan bir sorun varsa onun baştan tespit edilmesine yardımcı olacaktır. Bu amaçla geliştirilen birçok proje arasında özgür yazılım projeleri de çok sayıda bulunuyor. Bu yazıda, wrk aracından bahsedeceğiz.
Neden Kullanmalıyız?
Wrk aracı, tek veya çok çekirdekte çalışabilen, ciddi anlamda yüksek boyutlarda yük üretebilen bir HTTP benchmark aracıdır. C++ ile yazıldığı için oldukça performanslı çalışmakta ve bir son kullanıcı bilgisayarında yapılan yük testlerinde bile saniyede yüzbinlerce isteği kolaylıkla üretebilmektedir. Özellikleri geliştirilmek ve özel bazı senaryolara adapte edilmek istendiğinde Lua dilinde scriptler yazılarak istekler özelleştirilebilmekte veya farklı raporlama seçenekleri denenebilmektedir.
Kurulum ve Kullanım
Kurulum
Wrk, C++ ile yazıldığı için derleme gerektirmektedir. Kurulum aşamasında bu yüzden derlemeye bakacağız. Burada yazılı komutlar Ubuntu 18.04 (büyük olasılıkla 16.04 üzerinde de aynı şekilde) uygulanacakları düşünülerek hazırlanmıştır.
- Paket listesini güncelleyip gerekli olabilecek bazı paketleri kuruyoruz:
sudo apt install build-essential wget
- GitHub sayfası üzerinden wrk’yı indiriyoruz. Releases sayfasından zip veya tar.gz olarak indirebilirsiniz. 4.1.0 sürümü için örnek komut:
wget https://github.com/wg/wrk/archive/4.1.0.tar.gz
- İndirilen sıkıştırılmış arşiv dosyasını açıyoruz:
tar xzf 4.1.0.tar.gz
- Oluşan dizinin içerisine giriyoruz:
cd wrk-4.1.0/
- Derlemeyi başlatıyoruz:
make
- Derleme bittiğinde wrk isimli çalıştırılabilir bir dosya, bulunulan dizinde oluşacaktır. Kontrol etmek için:
./wrk
Kullanımı – Yük Testi Yapmak
Yük testi yapmak için, wrk’yi denerken site adresi dışında bir parametre vermemiz gerekmiyor. Mesela gurayyildirim.com.tr’nin yük testi için:
$ ./wrk https://www.gurayyildirim.com.tr
Running 10s test @ https://www.gurayyildirim.com.tr
2 threads and 10 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 15.55ms 8.38ms 80.82ms 74.49%
Req/Sec 328.02 64.84 464.00 72.16%
6361 requests in 10.04s, 156.89MB read
Requests/sec: 633.44
Transfer/sec: 15.62MB
Varsayılanda, bir parametre sağlanmadığında test 10 saniye süreyle çalışır. 2 thread ve 10 eşzamanlı bağlantı da sistemin varsayılan değerleri olarak yerini almıştır. Elde edilen sonuçlara göre, saniyede cevap verilen istek sayısı 633 civarında olmuş ve bu istekler ile cevapları için saniyede ortalama 15.62MB’lik bir trafik kullanımı gerçekleşmiştir. Ortalama cevap verme süresi 15.55ms iken, maksimum durumda bu süre 80.82ms değerine kadar çıkmış gözükmektedir. Bu sonuçlar, 10 saniye boyunca 2 thread üzerinden 10 bağlantı ile gerçekleştirilen 6361 istekten elde edilen çıktılardır.
wrk kullanırken istersek testin ne kadar süre ile yapılacağını(duration) belirtebiliriz. Bunu -d parametresi ile yapıyoruz. Mesela, yukarıdaki testi 10 yerine 30 saniye boyunca çalıştırmak için:
./wrk -d 30 https://www.gurayyildirim.com.tr
Running 30s test @ https://www.gurayyildirim.com.tr
2 threads and 10 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 16.03ms 9.35ms 141.35ms 79.45%
Req/Sec 324.19 60.07 460.00 74.16%
19170 requests in 30.09s, 472.76MB read
Requests/sec: 637.13
Transfer/sec: 15.71MB
Kullanılacak thread sayısı ve bağlantı sayısı da, sırayla -t ve -c parametreleri ile belirtilebilir. Örneğin 4 thread ve 100 eşzamanlı bağlantı için:
./wrk -t 4 -c 100 https://www.gurayyildirim.com.tr
Running 30s test @ https://www.gurayyildirim.com.tr
4 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 159.40ms 65.18ms 1.94s 87.84%
Req/Sec 159.55 42.73 280.00 73.50%
16800 requests in 30.09s, 414.33MB read
Socket errors: connect 0, read 0, write 0, timeout 1
Requests/sec: 558.31
Transfer/sec: 13.77MB
Bu örnekte, anlık bağlantı sayısı 100 ve 4 thread kullanımdayken istek cevaplama süresinin daha uzun olduğu, bir bağlantının da zaman aşımına girdiği görülüyor.
Özel Header Eklemek
Bazı durumlarda, karşı sunucuya göndermek üzere istek içerisine bazı headerları dahil etmek gerekebiliyor. Bu durumlarda -H parametresi kullanılabilir. Örnek:
./wrk -d 30 -t 4 -c 50 -H "User-Agent: wrk-test" https://www.gurayyildirim.com.tr
Running 30s test @ https://www.gurayyildirim.com.tr
…