Share This Post

Öne Çıkanlar / Open Source

wrk ile HTTP Benchmark Yapmak

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
…

Share This Post

Leave a Reply