Yük testi ve stres
Yük testi ve stres
1) Neden ihtiyacınız var
Hedefler:- Kapasiteyi onaylayın (sistemin verilen SLO'ya kaç RPS/rekabetçi oturuma dayanacağı).
- Darboğazları bulun (CPU/IO/DB/ağlar/kilitler/havuzlar).
- CI/CD'de performans bütçeleri ve kapıları oluşturun.
- Serbest bırakma riskini azaltın (p95/p99 regresyon, pik hata büyümesi).
- Plan kapasitesi/maliyeti (ölçek ve rezervler).
2) Perf testleri türleri
Yük: zirvelere yakın gerçekçi trafik; SLO doğrulaması.
Stres: sınırın üzerinde/üstünde büyüme - kırıldığı yerde bozulma davranışı.
Spike: hızlı yük atlaması - elastikiyet/autoscale.
Islak/Dayanıklılık: saat/gün - sızıntılar, parçalanma, gecikme sürüklenme.
Kapasite/Ölçeklenebilirlik: Ölçeklendirme ile iş hacmi/gecikme süresi nasıl değişir; Amdal/Gustafson yasası.
Smoke perf: Her sürümde kısa bir "duman" çalışması (performans saygınlığı).
3) Trafik oluşturma modelleri
Sabit VUs/eşzamanlılık: 'N' kullanıcıları, her biri istemci üzerinde> kuyruğa girme istekleri yapar. Aşırı yük gizleme riski.
Varış hızı: Gerçek hayatta olduğu gibi λ yoğunlukta (req/s) bir uygulama akışı. Genel API'ler için daha doğru.
Little Yasası: 'L = λ × W'.
Havuz/hizmet için minimum paralellik '≈ λ W' × (envanterin %20-50'sini ekleyin).
'λ' çıktısı olduğunda, 'W' ortalama servis süresidir.
4) Profilleri ve senaryoları yükleyin
Kullanıcı yolculuğu karışımı: komut dosyalarının paylaşımları (oturum açma, göz atma, para yatırma, ödeme...).
Düşünme zamanı: kullanıcı duraklamaları (dağılımlar: üstel/lognormal).
Veri profili: yanıtların boyutu, yük, parametrelerin değişkenliği.
Korelasyon: Gerçek bir akışta olduğu gibi bağlantı adımları (çerezler/belirteçler/ID).
Soğuk/sıcak/sıcak önbellek: bireysel çalışır.
Okuma vs Yazma: okuma/kayıt dengesi, retrays için idempotency.
Çok bölgeli: RTT, POP/ASN ile dağıtım.
5) Test ortamı
İzolasyon: Stand, topoloji/ayarlarda ürüne yakındır (ancak ürünü "dövmeyin").
Veriler: PII maskeleme, hacimler, satışlarda olduğu gibi endeksler.
Yük jeneratörleri: CPU/ağa karşı durmayın; Dağıtılmış koşucular, zaman senkronizasyonu.
Gözlemlenebilirlik: metrikler/izler/günlükler, çevre üzerinde sentetikler, CPU/yığın profillerinin dışa aktarılması.
6) Metrikler ve SLI
Verim: RPS/İşlemler/sn
Gecikme: p50/p95/p99, TTFB, sunucu süresi vs ağ.
Hatalar: 5xx/4xx/domain hatalarının paylaşımı.
Doygunluk: CPU, yük avg, GC, disk IOps/gecikme, ağ, havuz bekleme.
İş SLI: ≤ 5s mevduat başarısı, ≤ 2s sipariş onayı.
SLO'nun eşiklerini alın (örneğin, "99. 95 % ≤ 300 ms"), çalışma sırasında yanma oranını izleyin.
7) Darboğazları bulma (teknik)
1. Sistemi hedef yükün %60-80'i kadar sürekli olarak ısıtın.
2. Adımlarda artış (rampa) - p95/p99 ve hata oranının büyüdüğü yerlerde düzeltin.
- Havuzlarda kuyruklar (DB/HTTP),
- WAIT/kilitlerin (DB) büyümesi,
- GC-duraklatır/yığın,
- ağ yeniden iletimleri/paket kaybı,
- disk gecikmesi/önbellek özlüyor.
- 4. Lokalize: sorgu yolu ile ikili arama, profiller (CPU/alloc/lock-profile).
- 5. "Şişe'yi düzeltin - ayarlama - koşuyu tekrarlayın.
8) Stres altındaki davranışlar
Zarif bozulma: limitler, devre kesiciler, geri basınç kuyrukları, işleme için kabul edilir.
Retrays: maksimum 1, sadece idempotent; jitter; Yeniden ödeme bütçesi RPS'nin %10'unu ≤.
Fail-open/Fail-closed: kritik olmayan bağımlılıklar için fail-open'a izin ver (önbellek/taslaklar).
Basamaklı başarısızlık: havuzların/kotaların izolasyonu (bölme), hızlı zaman aşımları, işlevlerin "düzgün" devre dışı bırakılması (özellik bayrakları).
9) Araçlar (görev için seçim)
K6 (JavaScript, açık/açık model, hızlı, kullanışlı CI).
JMeter (ekosistem açısından zengin, GUI/CLI, eklentiler, ancak daha ağır).
Gatling (Scala DSL, yüksek performans).
Locust (Python, betik esnekliği).
Vegeta/hey/wrk (mikro banklar ve hızlı kontrol).
Kural: PR'de duman kalemi için bir'ana "araç + hafif CLI.
10) Örnekler (snippet'ler)
10. 1 k6 (varış oranı ile açık model)
js import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
scenarios: {
open_model: {
executor: 'ramping-arrival-rate',
startRate: 200, timeUnit: '1s',
preAllocatedVUs: 200, maxVUs: 2000,
stages: [
{ target: 500, duration: '5m' }, // до 500 rps
{ target: 800, duration: '5m' }, // стресс
{ target: 0, duration: '1m' }
]
}
},
thresholds: {
http_req_duration: ['p(95)<300', 'p(99)<800'],
http_req_failed: ['rate<0.005'],
},
};
export default function () {
const res = http.get(`${__ENV.BASE_URL}/api/catalog?limit=20`);
sleep(Math.random() 2); // think-time
}
10. 2 JMeter (profil fikri)
Thread Group + Basamak Thread или Eşzamanlılık Thread (open-like).
HTTP İstek Varsayılanları, Çerez Yöneticisi, CSV Veri Kümesi.
Arka Uç Dinleyici - AkınDB/Grafana; Zamana/koda göre iddialar.
10. 3 Çekirge (Python)
python from locust import HttpUser, task, between class WebUser(HttpUser):
wait_time = between(0.2, 2.0)
@task(5)
def browse(self): self.client.get("/api/catalog?limit=20")
@task(1)
def buy(self): self.client.post("/api/checkout", json={"sku":"A1","qty":1})
11) Veri, korelasyon, hazırlık
Tohum verileri: dizinler, kullanıcılar, bakiyeler, belirteçler - satışlarda olduğu gibi.
PII maskeleme/anonimleştirme; Gerçek dağılımların üstünde sentetikler üretmek.
Korelasyon: Yanıtlardan kimlikleri/belirteçleri çıkarın (RegExp/JSONPath) ve sonraki adımlarda kullanın.
12) Koşular sırasında gözlemlenebilirlik
Rotalar boyunca KIRMIZI panolar (Oran, Hatalar, Süre).
Örnekler - metriklerden izlere geçiş (trace_id).
Hata günlükleri: örnekleme + toplama, kopyalar/idempotans.
Sistem: CPU/GC/yığın, diskler/ağ, havuz bekleme.
DB: üst sorgular, kilitler, indeks taramaları, şişkinlik.
13) Otomasyon ve performans kapıları
CI: birleştirmede kısa koşular (örn. K6 2-3 dakika) eşikleri ile.
Gece/Haftalık: Ayrı bir ortamda uzun ıslatma/stres; Raporlar ve eğilimler.
Kanarya bültenleri: promosyonun "kapısı'olarak SLO'nun (hata oranı, p95) analizi.
Regresyonlar: taban çizgisi vs mevcut yapı; Bozulmada uyarı> % X.
14) Kapasite planlama ve maliyet
Eğriler iş hacmi - gecikme: diz noktasını tanımlayın - p99 keskin bir şekilde büyüdükten sonra.
Ölçeklendirme: Ölçekleme verimliliğini ölçün (RPS delta/düğüm deltası).
Maliyet: "$/saat başına RPS", zirve etkinlikleri + DR rezervi için rezerv.
15) Anti-desenler
Prod'u kontrol etmeden çırpın veya "boş'bir ortamda test edin, prod gibi değil.
Aşırı yükü gizleyen sabit VU'lu kapalı model.
Düşünme zamanı/veri eksikliği - gerçekçi olmayan önbellek isabetleri veya tam tersi - kaynağa fırtına.
Özel akış yerine bir "/ping "komut dosyası.
Gözlemlenebilirlik eksikliği: "Sadece RPS ve ortalama gecikme görüyoruz".
Kontrolsüz retrays - kendi kendine DDoS.
Hipotezleri/değişiklikleri düzeltmeden test ve optimizasyonları karıştırma.
16) Kontrol listesi (0-30 gün)
0-7 gün
SLI/SLO ve hedef trafik profillerini tanımlayın (mix, think-time, data).
Aracı seçin (k6/JMeter/Locust), RED panolarını kaldırın.
Stand ve tohum verilerini hazırlayın, üçüncü taraf limitlerini/captchalarını devre dışı bırakın.
8-20 gün
Senaryolar oluşturun: Açık model (varış oranı), soğuk/sıcak/sıcak önbellek.
Çalıştırın yük> stres> başak; Diz noktalarını ve darboğazları düzelt.
Performans kapılarını CI'da (mikro-run) uygulayın.
21-30 gün
Soak testi 4-24h: GC sızıntıları/sürüklenme, stabilizasyon.
Belge sınırları, kapasite planı, "RPS - p95/oshibki" çizimleri.
"Limitlerin/ölçeğin nasıl arttırılacağı've" nasıl bozulacağı "runbook hazırlayın.
17) Olgunluk metrikleri
Trafiğin ≥ %80'ini kapsayan gerçekçi profiller (mix, think-time, data) vardır.
KIRMIZI panolar + izleme tüm testler için bağlanır.
Performans kapıları p95/hataları geriletirken bültenleri engeller.
Kapasite ve diz noktası kilit hizmetler tarafından belgelenmiştir.
Aylık ıslatma/stres koşuları ve ilerleme raporları.
"Spike" direnci autoscale ve cascade-fail yokluğu ile doğrulanır.
18) Sonuç
Yük testi, bir kerelik bir ölçüm değil, düzenli bir mühendislik uygulamasıdır. Gerçek kullanıcıları modelleyin (açık model), müşterinin deneyimini (SLI/SLO) neyin yansıttığını ölçün, gözlemlenebilirliği ve kapıları CI/CD'de tutun, stres/başak/ıslatma koşuları yapın ve diz noktasını düzeltin. Ardından zirve olayları ve siyah kuğular yönetilebilir senaryolara dönüşür ve performans platformunuzun öngörülebilir ve ölçülebilir bir parametresine dönüşür.