Spitfire

Sürüm: 0.21.0Bu dokümantasyon Spitfire 0.21.0 içindir.

Yük modeli ve threshold ayarları

Test editörü sayfası testin ne yapacağını anlatır. Bu sayfa ne kadar yük uygulanacağını ve koşunun ne zaman geçti ya da kaldı sayılacağını anlatır: yük modelleri (executor'lar), aşamalar (stages), birden çok scenario, yükün runner ve lokasyonlara bölünmesi, lisans limitleri, threshold'lar ve smoke, load, stress, spike, soak ve kırılma noktası (breakpoint) testleri için hazır kalıplar.

Ne işe yarar

  • Her scenario için kaç VU'nun ya da saniyede kaç iteration'ın çalışacağını ve bunun zamanla nasıl değişeceğini belirler.
  • Editörde girdiğiniz değerlerden bir plan grafiği çizer: koşunun süresini, en çok VU sayısını ve (açık modellerde) toplam iteration sayısını koşmadan önce görürsünüz.
  • Threshold'lar koşunun sonunda (ve istenirse koşu sırasında) sonucu belirler: Geçti ya da Eşik aşıldı. CI'da eşik aşılırsa çıkış kodu 99'dur.

Ne zaman kullanılır

  • Yeni bir testin yükünü ilk kez ayarlarken.
  • Aynı testi farklı amaçlarla (hızlı bir smoke test, uzun bir soak test, kapasite ölçümü) koşturmak istediğinizde.
  • Koşu sonuçları "çok yavaş" ya da "çok hata" gösterdiğinde, testin yükünün gerçekten istediğiniz yük olduğundan emin olmak için (ör. açık modelde Düşen iterasyon varsa yük hedefe ulaşmamıştır).

Temel kavramlar

Kavram Anlamı
VU (virtual user, sanal kullanıcı) Scenario'nun step'lerini sırayla çalıştıran bir kullanıcı. Her VU'nun kendi variable'ları ve (varsayılan olarak) kendi cookie'leri vardır.
Iteration Bir VU'nun scenario'nun bütün step'lerini baştan sona bir kez çalıştırması.
Kapalı model (constant-vus, ramping-vus) VU sayısı sabittir; her VU bir iteration'ı bitirince hemen (think time'dan sonra) yenisine başlar. Hedef yavaşlarsa daha az iteration başlar, yani yük kendiliğinden azalır.
Açık model (constant-arrival-rate, ramping-arrival-rate) Iteration'lar bir zaman çizelgesiyle başlar, hedef ne kadar yavaş olursa olsun. Boşta VU yoksa iteration düşer (dropped_iterations); kuyruğa girmez, gecikme gizlenmez.
İterasyon sayılı modeller (shared-iterations, per-vu-iterations) Belirli sayıda iteration bitince test biter (en geç En uzun süre dolunca).
RPS Saniyedeki request sayısı. Her iteration'da N step varsa RPS ≈ iteration/sn × N.
İpucu

Kapalı model "aynı anda N kullanıcı" sorusunu, açık model "saniyede N istek geldiğinde ne olur" sorusunu yanıtlar. Gerçek trafikte kullanıcılar sistemin yavaşladığını beklemeden gelmeye devam ettiği için kapasite ve gecikme hedefleri (SLA) için açık model daha doğru sonuç verir.

Yük modelleri

Yük modeli, Senaryolar ve adımlar sekmesinde her scenario'nun Yük başlığı altındaki Yük modeli listesinden seçilir. Listenin altındaki yardım metni seçilen modeli tek cümleyle anlatır. Süre alanlarına 30s, 2m, 1m30s, 500ms gibi değerler yazılır; geçersiz bir süre "Örnek: 30s, 2m, 1m30s, 500ms" uyarısı verir.

Sabit VU

Sabit VU (constant-vus): sabit sayıda VU, süre boyunca art arda iteration koşar.

Alan JSON Açıklama
VU sayısı vus 1 veya daha büyük.
Süre duration Örneğin 5m.
json
"executor": { "type": "constant-vus", "vus": 50, "duration": "10m" }

Kademeli VU

Kademeli VU (ramping-vus): VU sayısı aşamalarla değişir. Yeni testlerin varsayılanıdır.

Alan JSON Açıklama
Başlangıç VU startVUs Koşu başındaki VU sayısı (genelde 0).
Düşüşte bekleme (gracefulRampDown) gracefulRampDown VU sayısı azalırken fazla VU'ların süren iteration'larını bitirmesi için verilen süre. Varsayılan 30s.
Aşamalar stages Her satır: "Süre içinde Hedef VU hedefine". Hedef tam sayı olmalıdır.
json
"executor": {
  "type": "ramping-vus",
  "startVUs": 0,
  "stages": [
    { "duration": "2m", "target": 100 },
    { "duration": "10m", "target": 100 },
    { "duration": "1m", "target": 0 }
  ]
}

Sabit istek hızı

Sabit istek hızı (constant-arrival-rate): her timeUnit'te belirtilen sayıda iteration başlar.

Alan JSON Açıklama
İterasyon rate Her timeUnit'te başlayacak iteration sayısı (ondalık olabilir).
her (timeUnit) timeUnit Varsayılan 1s. rate: 30, timeUnit: "1m" = dakikada 30 iteration.
Süre duration Örneğin 10m.
Önden ayrılan VU preAllocatedVUs Koşu başında hazırlanan VU sayısı; 1 veya daha büyük.
En çok VU maxVUs Gerekirse açılabilecek en çok VU; önden ayrılan VU'dan küçük olamaz.
json
"executor": {
  "type": "constant-arrival-rate",
  "rate": 200,
  "timeUnit": "1s",
  "duration": "10m",
  "preAllocatedVUs": 100,
  "maxVUs": 400
}

Formdaki ipucu VU sayısının nasıl hesaplanacağını söyler: "Hedef yanıt süresi × istek hızı kadar VU gerekir (ör. 200 ms × 100/s ≈ 20 VU). Yetmezse iterasyonlar düşer." Daha doğrusu: gereken VU ≈ saniyedeki iteration × bir iteration'ın saniye cinsinden süresi (bütün step'ler ve think time'lar dahil). Iteration'ınız 3 step'ten ve toplam 1,5 saniyeden oluşuyorsa saniyede 200 iteration için yaklaşık 300 VU gerekir; hedef yavaşladığında daha fazlası. En çok VU'yu bu sayının iki-üç katı tutun.

Kademeli istek hızı

Kademeli istek hızı (ramping-arrival-rate): iteration hızı aşamalarla değişir. Kapasite ve stress testleri için uygundur.

Alan JSON Açıklama
Başlangıç hızı startRate Koşu başındaki hız (timeUnit başına iteration).
Hız birimi (timeUnit) timeUnit Varsayılan 1s.
Aşamalar stages Her satır: "Süre içinde Hedef iterasyon/birim hedefine".
Önden ayrılan VU, En çok VU preAllocatedVUs, maxVUs Sabit istek hızındaki gibi.
json
"executor": {
  "type": "ramping-arrival-rate",
  "startRate": 10,
  "timeUnit": "1s",
  "preAllocatedVUs": 50,
  "maxVUs": 500,
  "stages": [
    { "duration": "2m", "target": 100 },
    { "duration": "5m", "target": 100 },
    { "duration": "2m", "target": 300 },
    { "duration": "5m", "target": 300 }
  ]
}

Toplam iterasyon

Toplam iterasyon (shared-iterations): belirli sayıda iteration VU'lar arasında paylaşılır; hızlı VU daha çok koşar. İş bitince ya da En uzun süre dolunca test biter. Veri yükleme, smoke test ve tek seferlik işler için.

Alan JSON Açıklama
VU sayısı vus 1 veya daha büyük.
Toplam iterasyon iterations VU sayısından küçük olamaz.
En uzun süre (maxDuration) maxDuration Varsayılan 10m. Iteration'lar bitmese de bu sürede durur.
json
"executor": { "type": "shared-iterations", "vus": 10, "iterations": 1000, "maxDuration": "15m" }

VU başına iterasyon

VU başına iterasyon (per-vu-iterations): her VU tam olarak belirtilen sayıda iteration koşar; bitince test biter (en geç En uzun süre'de). Her kullanıcının aynı akışı eşit kez yaptığı scenario'lar için.

json
"executor": { "type": "per-vu-iterations", "vus": 20, "iterations": 5, "maxDuration": "10m" }

Bu örnek toplam 20 × 5 = 100 iteration yapar.

Yük modeli formu ve plan grafiğiYük modeli formu ve plan grafiği

Aşamalar nasıl çalışır

ramping-vus ve ramping-arrival-rate modellerinde Aşamalar listesi yükün zaman içindeki şeklini verir:

  • Her aşama bir Süre ve bir Hedef'ten oluşur. Yük, aşamanın başındaki değerden hedefe bu süre boyunca doğrusal olarak değişir.
  • İlk aşama Başlangıç VU'dan (ya da Başlangıç hızı'ndan) başlar; sonraki her aşama bir öncekinin hedefinden başlar.
  • Hedefi bir öncekiyle aynı olan aşama yükü sabit tutar (plato).
  • Hedefi 0 olan son aşama yükü indirir (ramp-down).
  • Aşama ekle yeni bir satır ekler (varsayılan süre 30s, hedef bir öncekiyle aynı); satırın sağındaki çarpı satırı siler.

Örnek: startVUs: 0, aşamalar 2m → 100, 10m → 100, 1m → 0: 2 dakikada 0'dan 100 VU'ya ramp-up, 10 dakika 100 VU, 1 dakikada 0'a ramp-down. Toplam 13 dakika.

Plan grafiği

Değerleri girdiğiniz anda formun altında Plan: VU (kapalı ve iterasyon sayılı modeller) ya da Plan: iterasyon/s (açık modeller) başlıklı bir grafik çizilir. Altında özet satırı vardır, örneğin "13m · en çok 100 VU" ya da açık modellerde "… · toplam 126.000 iterasyon". İterasyon sayılı modellerde süre bir üst sınırdır: "en çok 10m · 20 VU".

Test sayfasındaki Yük profili kartı aynı bilgiyi kaydedilmiş test için gösterir: her scenario'nun modeli, en çok VU sayısı ve süresi, Toplam süre ve threshold sayısı.

Test sayfasında Yük profili kartıTest sayfasında Yük profili kartı

Hangi yük modelini seçmeliyim

Amacınız Model Neden
"Aynı anda 200 kullanıcı" gibi bir hedef Sabit VU ya da plato aşamalı Kademeli VU Eşzamanlı kullanıcı sayısını doğrudan verir.
"Saniyede 500 istek" gibi bir SLA/kapasite hedefi Sabit istek hızı Hız, hedef yavaşlasa da korunur; düşen iteration'lar açıkça görünür.
Yükü kademeli artırıp sistemin nerede bozulduğunu görmek Kademeli istek hızı ya da Çalıştır penceresindeki Kırılma noktasını bul Açık modelde yük hedefin yavaşlamasıyla azalmaz.
Ani trafik sıçraması (kampanya, bildirim) Kısa aşamalı Kademeli VU ya da Kademeli istek hızı Birkaç saniyelik aşamayla ani artış verilir.
Saatlerce süren dayanıklılık (soak) testi Sabit VU ya da Sabit istek hızı, uzun süre Bellek sızıntısı, bağlantı havuzu tükenmesi gibi yavaş sorunlar.
Hızlı bir doğrulama (smoke test) Toplam iterasyon (ör. 1 VU, 10 iteration) ya da 1–2 VU Sabit VU Sistem ve test çalışıyor mu, kısa sürede görürsünüz.
10.000 kaydı bir kez yüklemek Toplam iterasyon İş bitince biter. Unique data dosyasıyla birlikte kullanın (bkz. Veri).
Her kullanıcının akışı N kez yapması VU başına iterasyon Her VU eşit sayıda iteration yapar.

Adım adım yük modelini ayarlamak

  1. Editörde Senaryolar ve adımlar sekmesini açın ve üstteki düğmelerden scenario'yu seçin.
  2. Yük başlığının altındaki Yük modeli listesinden modeli seçin. Alanlar seçilen modele göre değişir.
  3. Alanları doldurun. Süreleri 30s, 5m biçiminde yazın.
  4. Kademeli modellerde Aşama ekle ile aşamaları tanımlayın.
  5. Açık modellerde Önden ayrılan VU ve En çok VU'yu Sabit istek hızı bölümündeki hesapla belirleyin.
  6. Formun altındaki plan grafiğine ve özet satırına bakın: süre ve en çok VU beklediğiniz gibi mi? Lisans limitlerinin içinde mi (bkz. Lisans limitleri)?
  7. Gerekirse Başlama gecikmesi ile scenario'nun koşu başından ne kadar sonra başlayacağını ayarlayın.
  8. Eşikler (N) sekmesinde threshold'ları tanımlayın (aşağıda).
  9. Kaydedin. İlk koşuyu Çalıştır penceresinde Yük ölçeği'ni örneğin %10 yaparak küçük başlatabilirsiniz; test değişmez (bkz. Koşu ve sonuçlar).

Birden çok scenario

Bir testteki bütün scenario'lar aynı anda koşar ve her birinin kendi yük modeli vardır. Gerçek trafik karışımını böyle kurarsınız:

json
{
  "version": 1,
  "name": "Mağaza trafiği",
  "variables": { "base": "https://shop.example.com" },
  "options": {},
  "scenarios": [
    {
      "name": "browse",
      "executor": { "type": "constant-arrival-rate", "rate": 150, "timeUnit": "1s", "duration": "15m", "preAllocatedVUs": 100, "maxVUs": 400 },
      "steps": [
        { "id": "home", "name": "Ana sayfa", "protocol": "http", "request": { "method": "GET", "url": "{{base}}/" },
          "checks": [ { "type": "status", "op": "eq", "value": 200 } ] }
      ]
    },
    {
      "name": "checkout",
      "startTime": "1m",
      "executor": { "type": "constant-arrival-rate", "rate": 10, "timeUnit": "1s", "duration": "14m", "preAllocatedVUs": 20, "maxVUs": 100 },
      "steps": [
        { "id": "cart", "name": "Sepet", "protocol": "http", "request": { "method": "GET", "url": "{{base}}/api/cart" },
          "checks": [ { "type": "status", "op": "eq", "value": 200 } ] }
      ]
    }
  ],
  "thresholds": [
    { "metric": "req_duration", "filter": { "scenario": "checkout" }, "expr": "p(95)<800" },
    { "metric": "req_failed", "expr": "rate<0.01" }
  ]
}
  • checkout scenario'su startTime: "1m" ile koşu başladıktan 1 dakika sonra başlar (editörde Başlama gecikmesi).
  • Koşunun toplam süresi en uzun scenario'nun bitişidir (burada 15 dakika).
  • Plan grafiği her scenario için ayrı çizilir; test sayfasındaki Yük profili kartı da her scenario'yu ayrı satırda gösterir.
  • Threshold'u tek bir scenario'ya uygulamak için filter.scenario kullanılır; bu filtre formda yoktur, JSON sekmesinden yazılır.

Runner ve lokasyonlara bölme

Testte yazdığınız VU sayıları ve hızlar koşunun toplamıdır. Koşu birden çok runner'a ya da lokasyona dağıtıldığında Spitfire bu toplamı runner'lar arasında böler: "Yük seçilen runner'lara bölünür; VU sayıları ve istek hızları toplamda tanımdakiyle birebir aynı kalır." Testi runner sayısına göre değiştirmeniz gerekmez.

  • Lokasyonla modunda her lokasyonun payını yüzdeyle verirsiniz (toplam %100); bir lokasyonun payı oradaki runner'lara eşit bölünür.
  • shared-iterations modelinde her runner'ın iteration payı VU payıyla orantılıdır; toplam yine tam olarak testteki sayıdır.
  • Unique ve sequential data dosyaları da runner'lar arasında bölünür; iki runner aynı satırı kullanmaz (bkz. Veri).
  • Seçenekler → Runner kaybında: Koşuyu durdur (varsayılan) ya da Kalanlarla devam et (yük azalır).

Runner seçimi ve lokasyon dağılımı Çalıştır penceresinde yapılır; bkz. Koşu ve sonuçlar.

Lisans limitleri

Lisans, bir koşunun en çok VU sayısını, saniyedeki request sayısını, süresini, runner ve lokasyon sayısını sınırlar. Ücretsiz sürümde bu limitler Çalıştır penceresinin üstünde yazar: bir koşuda en fazla 100 VU, saniyede 500 istek, 15 dakika, 1 runner, 1 lokasyon; aynı anda bir koşu. Ücretli planların limitleri Lisans sayfasında görünür.

Koşu limitleri aşıyorsa başlatılmaz ve neden yazılır, örneğin: "Bu koşu 150 eşzamanlı VU istiyor; ücretsiz sürüm en fazla 100 VU'ya izin veriyor." Yapabilecekleriniz:

  1. Çalıştır penceresinde Yük ölçeği'ni düşürün (ör. %60); test değişmez.
  2. Ya da editörde VU/hız/süre değerlerini azaltın.

Limitler koşu başlamadan, plan üzerinden şöyle hesaplanır:

  • VU: aynı anda çalışan scenario'ların en çok VU'larının toplamı. Açık modellerde bu, En çok VU (maxVUs) değeridir; onu gereğinden çok büyük yazmak VU limitine takılmanıza yol açabilir.
  • İstek hızı: açık modellerde hedef iteration hızı × scenario'nun (VU başına bir kez olmayan) step sayısı. Kapalı modellerde hız önceden bilinemediği için koşu sırasında runner'lar request'leri limitin altında tutacak şekilde yavaşlatır.
  • Süre: plan grafiğindeki süre (en uzun scenario'nun bitişi).

Threshold tanımlamak

Threshold, koşunun geçti/kaldı ölçütüdür. Editörün Eşikler (N) sekmesinde tanımlanır. Sekmedeki yardım metni: "Eşik aşılırsa koşu "eşik aşıldı" sonucuyla biter (CI'da çıkış kodu 99). "Aşılınca durdur" işaretliyse koşu erken kesilir."

Adım adım:

  1. Eşikler (N) sekmesine tıklayın.
  2. Eşik ekle'ye tıklayın. Yeni satır Yanıt süresi (ms) ve p(95)<500 ile gelir.
  3. Soldaki Metrik listesinden metriği seçin. İfade kutusu o metrik için örnek bir ifadeyle dolar.
  4. İfade kutusuna ölçütü yazın (ör. p(95)<300).
  5. Kapsam listesinden ölçütün nereye uygulanacağını seçin: Tüm istekler, bir step (Adım: senaryo / step adı) ya da bir lokasyon (Lokasyon: ad).
  6. Koşunun ölçüt aşılır aşılmaz durmasını istiyorsanız Aşılınca durdur'u işaretleyin ve yanındaki bekle (30s) kutusuna ısınma süresini yazın.
  7. Kaydedin.

Eşikler sekmesi: metrik, ifade, kapsam ve Aşılınca durdurEşikler sekmesi: metrik, ifade, kapsam ve Aşılınca durdur

Metrikler

Formdaki ad Metrik Türü Örnek ifade
Yanıt süresi (ms) req_duration trend p(95)<500
Hatalı istek oranı req_failed rate rate<0.01
Check başarı oranı checks rate rate>0.99
İstek sayısı / hızı reqs counter rate>100 (sn başına), count>10000
İterasyon süresi (ms) iteration_duration trend p(95)<2000
Düşen iterasyon dropped_iterations counter count<1
Dönen/etkilenen satır (SQL/Mongo) rows trend avg>0
İlk bayt süresi (HTTP, ms) http_req_waiting trend p(95)<300
Bağlantı kurma (HTTP, ms) http_req_connecting trend p(95)<50
İterasyon sayısı / hızı iterations counter count>100
Aktif VU vus gauge value<500
WebSocket bağlanma (ms) ws_connecting trend p(95)<200
SSE ilk olaya kadar (ms) sse_time_to_first_event trend p(95)<1000

Listede ayrıca gRPC stream metrikleri (grpc_time_to_first_message, grpc_message_latency, grpc_message_gap, grpc_messages_received, grpc_messages_sent) ve Kafka metrikleri (kafka_e2e_latency, kafka_consumer_lag) vardır.

İfadeler

İfade <istatistik> <operatör> <sayı> biçimindedir. Operatörler: <, <=, >, >=, ==, !=.

İstatistik Anlamı Hangi metrik türünde
p(95), p(99), p(99.9) Yüzdelik (0'dan büyük, en çok 100) trend
avg, min, max, med Ortalama, en küçük, en büyük, medyan trend (min/max gauge'da da)
count Toplam sayı trend, counter
rate Oran (0–1) ya da counter için saniyedeki sayı rate, counter
value Son değer gauge

Süreler milisaniye, oranlar 0 ile 1 arası yazılır: %1 hata oranı rate<0.01 demektir, rate<1 değil.

İpucu

Ortalama (avg) yavaş isteklerin küçük bir bölümünü gizler. Kullanıcının yaşadığı gecikme için p(95) ya da p(99) kullanın.

Kapsam ve filtreler

Kapsam JSON Ne ölçer
Tüm istekler filtre yok Bütün scenario ve step'lerin toplamı
Adım: … "filter": { "step": "create_order" } Yalnız o step (step kimliği)
Lokasyon: … "filter": { "location": "frankfurt" } Yalnız o lokasyonun runner'ları
(yalnız JSON) "filter": { "scenario": "checkout" } Yalnız o scenario
(yalnız JSON) "filter": { "check": "status == 200" } checks metriğinde yalnız o adlı check

Filtreler birleştirilebilir (scenario + step + check), ama lokasyon filtresi tek başına kullanılır.

json
"thresholds": [
  { "metric": "req_duration", "expr": "p(95)<500" },
  { "metric": "req_failed", "expr": "rate<0.01", "abortOnFail": true, "delayAbortEval": "1m" },
  { "metric": "req_duration", "filter": { "step": "create_order" }, "expr": "p(99)<1500" },
  { "metric": "checks", "filter": { "check": "status == 200" }, "expr": "rate>0.995" },
  { "metric": "req_duration", "filter": { "location": "frankfurt" }, "expr": "p(95)<800" },
  { "metric": "dropped_iterations", "expr": "count<1" }
]

Aşılınca durdur ve ısınma

  • Aşılınca durdur (abortOnFail) işaretli bir threshold, koşu sırasında aşıldığı an koşuyu durdurur. Koşu sayfasında bu threshold'un yanında "durdurur" rozeti, koşuyu durdurduysa "koşuyu durdurdu" rozeti çıkar.
  • bekle (30s) (delayAbortEval): "Isınma: bu süre dolmadan durdurmaz". Koşunun ilk saniyelerinde bağlantılar ve önbellekler ısınırken gecikme yüksek olabilir; bu süre dolmadan durdurma kararı verilmez.
  • Threshold'lar koşunun başından o ana kadarki toplam üzerinden hesaplanır. Isınma süresi yalnız durdurma kararını erteler; koşu sonundaki değerlendirmede ısınma dönemindeki request'ler de sayılır. Isınmayı sonuçtan tamamen çıkarmak için Isınma kalıbına bakın.

Threshold sonucunu okumak

  • Koşu sırasında henüz verisi olmayan bir threshold geçiyor sayılır. Koşu sonunda ölçecek verisi olmayan threshold (filtrelediği step hiç çalışmadıysa) kaldı sayılır ve "veri yok" yazar: ölçmediği bir şey için yeşil yanmaz.
  • Counter'lar istisnadır: hiç iteration düşmediyse dropped_iterations için count<1 geçer.
  • Koşu sayfasının Eşikler kartında her threshold'un ölçülen değeri ve sonucu görünür; aşılan threshold'lar sayfanın üstünde de listelenir ("N eşik aşıldı:").
  • Threshold tanımlanmamışsa "Eşik tanımlı değil; koşu her zaman "geçti" sayılır."

Koşu sayfasında Eşikler kartıKoşu sayfasında Eşikler kartı

Test kalıpları

Aşağıdaki kalıplar aynı test üzerinde yalnız yük modelini değiştirerek kurulur.

Smoke test

Amaç: test ve sistem çalışıyor mu? 1 VU, birkaç iteration.

json
"executor": { "type": "shared-iterations", "vus": 1, "iterations": 10, "maxDuration": "2m" }

Load test

Amaç: beklenen normal yükte gecikme ve hata oranı. Ramp-up, uzun plato, ramp-down.

json
"executor": {
  "type": "ramping-vus", "startVUs": 0,
  "stages": [ { "duration": "3m", "target": 200 }, { "duration": "20m", "target": 200 }, { "duration": "2m", "target": 0 } ]
}

Stress test

Amaç: beklenen yükün üstünde ne olur? Açık modelde hızı kademeli artırın ve her basamakta bekleyin.

json
"executor": {
  "type": "ramping-arrival-rate", "startRate": 50, "timeUnit": "1s",
  "preAllocatedVUs": 100, "maxVUs": 1000,
  "stages": [
    { "duration": "2m", "target": 100 }, { "duration": "5m", "target": 100 },
    { "duration": "2m", "target": 200 }, { "duration": "5m", "target": 200 },
    { "duration": "2m", "target": 400 }, { "duration": "5m", "target": 400 }
  ]
}

Spike test

Amaç: ani sıçramaya dayanıklılık ve sonrasında toparlanma.

json
"executor": {
  "type": "ramping-vus", "startVUs": 10,
  "stages": [
    { "duration": "2m", "target": 10 },
    { "duration": "10s", "target": 500 },
    { "duration": "2m", "target": 500 },
    { "duration": "10s", "target": 10 },
    { "duration": "3m", "target": 10 }
  ]
}

Soak test

Amaç: saatler içinde ortaya çıkan sorunlar (bellek, bağlantı havuzu, disk). Normal yükte uzun süre. Lisanstaki koşu süresi limitine dikkat edin.

json
"executor": { "type": "constant-arrival-rate", "rate": 100, "timeUnit": "1s", "duration": "4h", "preAllocatedVUs": 100, "maxVUs": 300 }

Kırılma noktasını bulmak

Sistemin kaldırabildiği en yüksek hızı bulmak için testi değiştirmenize gerek yoktur: Çalıştır penceresindeki Kırılma noktasını bul (kapasite testi) seçeneği seçtiğiniz scenario'nun yükünü basamak basamak artırır ve her basamağı p95 ve hata oranı ölçütüyle değerlendirir; ilk geçemeyen basamak koşuyu durdurur.

  1. Test sayfasında Çalıştır'a tıklayın.
  2. Pencerede Kırılma noktasını bul (kapasite testi) kutusunu işaretleyin.
  3. Alanları doldurun (varsayılanlar parantez içinde):
    • Senaryo: yükü artırılacak scenario (diğerleri bu koşuda çalışmaz).
    • Başlangıç (10), Artış (10), En çok (200): iterasyon/sn.
    • Basamak süresi (60 sn): her basamağın ölçülen kısmı; en az 10 saniye. Basamaklar arasında ayrıca 10 sn geçiş vardır (ölçülmez).
    • p95 sınırı (500 ms) ve Hata oranı sınırı (%1).
    • VU sınırı (otomatik).
  4. Formun altındaki satır planı yazar: "20 basamak, en çok yaklaşık 24 dakika (basamaklar arası 10 sn geçiş)." En çok 60 basamak olabilir.
  5. Başlat'a tıklayın.

Çalıştır penceresinde Kırılma noktasını bul formuÇalıştır penceresinde Kırılma noktasını bul formu

Bu koşuda testin threshold'ları uygulanmaz (aksi halde aradığınız kırılma noktasında koşuyu kendileri durdururlardı) ve test tanımı değişmez. Koşu sayfasındaki Kapasite testi kartı sonucu yazar, örneğin: "Sistem 200 iterasyon/sn (200 istek/sn) yükte ölçütleri karşıladı; 230 iterasyon/sn basamağında karşılayamadı." Basamak durduysa ama gecikme iyiyse ve iteration'ları başlatacak VU yetmediyse bunu açıkça söyler: "…ama bu sistemin sınırı değil: iterasyonları başlatacak sanal kullanıcı yetmedi. VU sınırını artırıp tekrar deneyin."

Dikkat

Basamakların toplam süresi ve en yüksek hızı da lisans limitlerine tabidir. Varsayılan ayarlar (20 basamak, yaklaşık 24 dakika) ücretsiz sürümün 15 dakikalık süre limitini aşar; En çok'u düşürün ya da Artış'ı büyütün.

Isınma

Önbellekleri, bağlantı havuzlarını ve JIT'i ısıtan ilk dakikaları sonuçtan ayırmanın iki yolu vardır:

  1. Durdurma kararını ertelemek: Aşılınca durdur işaretli threshold'larda bekle süresini (ör. 2m) ısınma kadar tutun. Sonuç değerlendirmesi yine bütün koşuyu kapsar.
  2. Isınmayı ayrı bir scenario yapmak: düşük yüklü bir warmup scenario'su koşunun başında çalışır, asıl scenario Başlama gecikmesi ile sonra başlar ve threshold'lar yalnız asıl scenario'ya filtrelenir:
json
{
  "version": 1,
  "name": "Ödeme yük testi (ısınmalı)",
  "variables": { "base": "https://shop.example.com" },
  "options": {},
  "scenarios": [
    {
      "name": "warmup",
      "executor": { "type": "constant-vus", "vus": 5, "duration": "2m" },
      "steps": [
        { "id": "warmup_home", "name": "Isınma", "protocol": "http", "request": { "method": "GET", "url": "{{base}}/" } }
      ]
    },
    {
      "name": "main",
      "startTime": "2m",
      "executor": { "type": "constant-arrival-rate", "rate": 100, "timeUnit": "1s", "duration": "10m", "preAllocatedVUs": 50, "maxVUs": 300 },
      "steps": [
        { "id": "main_home", "name": "Ana sayfa", "protocol": "http", "request": { "method": "GET", "url": "{{base}}/" },
          "checks": [ { "type": "status", "op": "eq", "value": 200 } ] }
      ]
    }
  ],
  "thresholds": [
    { "metric": "req_duration", "filter": { "scenario": "main" }, "expr": "p(95)<400" },
    { "metric": "req_failed", "filter": { "scenario": "main" }, "expr": "rate<0.01" }
  ]
}

Sık karşılaşılan sorunlar

Belirti Neden Çözüm
...executor.maxVUs: önden ayrılan VU sayısından küçük olamaz En çok VU < Önden ayrılan VU. En çok VU'yu en az önden ayrılan kadar yapın.
...executor.preAllocatedVUs: pozitif olmalı Açık modelde Önden ayrılan VU 0. En az 1 yazın; hesap için Sabit istek hızı.
...executor.stages: en az bir aşama gerekli Kademeli modelde aşama yok. Aşama ekle ile en az bir aşama ekleyin.
...stages[1].target: tam sayı olmalı Kademeli VU'da hedef ondalık (12.5). VU hedefi tam sayı olmalı. Ondalık hız yalnız arrival-rate modellerinde geçerlidir.
...stages[0].duration: pozitif olmalı Aşama süresi boş ya da 0s. 30s, 2m gibi bir süre yazın.
...executor.iterations: VU sayısından küçük olamaz Toplam iterasyon < VU sayısı. Iteration sayısını artırın ya da VU'yu azaltın.
Koşu sayfasında "N düştü" (Düşen iterasyon) Açık modelde boşta VU kalmadı; hedef yavaşladı ya da En çok VU düşük. En çok VU'yu artırın; gecikme yükseldiyse bu sistemin sınırına yaklaşıldığının işaretidir. dropped_iterations için count<1 threshold'u koyun.
RPS beklenenden düşük (kapalı model) Hedef yavaşladıkça VU'lar daha az iteration başlatır; think time da RPS'i düşürür. Hız hedefiniz varsa açık modele geçin.
geçersiz eşik (örnekler: p(95)<500, rate<0.01, avg<=200) İfade sözdizimi hatalı (p95<500, < 500ms). p(95)<500 yazın; birim yazmayın.
req_failed bir rate metriği; şunlardan birini kullanın: rate Metrik türüyle uyumsuz istatistik (p(95) hata oranında). Tablodaki istatistiklerden birini kullanın.
bilinmeyen adım … Threshold filtresindeki step kimliği testte yok (step silinmiş ya da adı yazılmış). Kapsam listesinden step'i yeniden seçin; JSON'da step adını değil id'sini yazın.
hiçbir adımda … adlı kontrol yok check filtresi var olmayan bir check adını gösteriyor. Check adını koşu sayfasındaki Check'ler kartında ya da JSON'da kontrol edin.
lokasyon filtresi senaryo, adım veya kontrol filtresiyle birlikte kullanılamaz location başka filtreyle birleştirilmiş. Lokasyon threshold'unu ayrı bir satır yapın.
Threshold "veri yok" ile kaldı Filtrelenen step koşuda hiç çalışmadı ya da hep bağlantı hatasında kaldı. Step'in kimliğini ve koşunun Adımlar tablosunu kontrol edin.
"Bu koşu … istiyor; ücretsiz sürüm en fazla … izin veriyor" Lisans limiti. Lisans limitleri bölümündeki adımlar.

İlgili sayfalar

  • Test editörü: scenario, step, extract ve check tanımlama.
  • Veri: data dosyalarının runner'lar arasında bölünmesi.
  • Koşu ve sonuçlar: Çalıştır penceresi, canlı izleme, sonuçları okuma.