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. |
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. |
"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. |
"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. |
"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. |
"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. |
"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.
"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ğ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ı
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
- Editörde Senaryolar ve adımlar sekmesini açın ve üstteki düğmelerden scenario'yu seçin.
- Yük başlığının altındaki Yük modeli listesinden modeli seçin. Alanlar seçilen modele göre değişir.
- Alanları doldurun. Süreleri
30s,5mbiçiminde yazın. - Kademeli modellerde Aşama ekle ile aşamaları tanımlayın.
- Açık modellerde Önden ayrılan VU ve En çok VU'yu Sabit istek hızı bölümündeki hesapla belirleyin.
- 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)?
- Gerekirse Başlama gecikmesi ile scenario'nun koşu başından ne kadar sonra başlayacağını ayarlayın.
- Eşikler (N) sekmesinde threshold'ları tanımlayın (aşağıda).
- Kaydedin. İlk koşuyu Çalıştır penceresinde Yük ölçeği'ni örneğin
%10yaparak 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:
{
"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" }
]
}checkoutscenario'sustartTime: "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.scenariokullanı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-iterationsmodelinde 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:
- Çalıştır penceresinde Yük ölçeği'ni düşürün (ör.
%60); test değişmez. - 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:
- Eşikler (N) sekmesine tıklayın.
- Eşik ekle'ye tıklayın. Yeni satır
Yanıt süresi (ms)vep(95)<500ile gelir. - Soldaki Metrik listesinden metriği seçin. İfade kutusu o metrik için örnek bir ifadeyle dolar.
- İfade kutusuna ölçütü yazın (ör.
p(95)<300). - 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).
- 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.
- Kaydedin.
Eş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.
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.
"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_iterationsiçincount<1geç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."
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.
"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.
"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.
"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.
"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.
"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.
- Test sayfasında Çalıştır'a tıklayın.
- Pencerede Kırılma noktasını bul (kapasite testi) kutusunu işaretleyin.
- 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).
- 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.
- Başlat'a tıklayın.
Ç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."
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:
- 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. - Isınmayı ayrı bir scenario yapmak: düşük yüklü bir
warmupscenario'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:
{
"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.
