Yük və stress testi
1) Terminlər və məqsədlər
Load test - SLO-ya qarşı (məsələn, p95 <200 ms, error rate <0) iş diapazonunda (hədəf RPS/rəqabət) yoxlama. 5%).
Stress test - kənara çıxmaq (CPU/DB/şəbəkə doyması qədər/artıq), deqradasiya və bərpa mexanikası müşahidə.
Spike test - kəskin yük partlayışı (dəqiqə ərzində N ×).
Soak/Endurance - sızma, GC sürüklənməsi, parçalanma, növbələrin böyüməsi üçün uzun bir qaçış (saat/gün).
Capacity test - plato bant genişliyi (saturation point) və ehtiyatların hesablanması.
Məqsədlər: SLO-nu təsdiqləmək, yaylanı düzəltmək, dar yerləri başa düşmək, avtomatik ölçmə və limitləri kalibrləmək.
2) Trafik modeli: açıq vs qapalı
Qapalı model (concurrency-driven): sabit virtual istifadəçilərin sayı (VUs), hər cavab sonra think time edir.
Açıq model (arrival-rate): Cavablardan asılı olmayaraq, sorğuların qəbulunun sabit intensivliyi (RPS).
Little’s Law: `L = λ W`
'L' - eyni vaxtda xidmət olunan sorğuların orta sayı,
'λ' - intensivlik (RPS),
'W' ortalama cavab vaxtıdır.
Beləliklə, generatorun lazımi rəqabət qabiliyyətinin qiymətləndirilməsi: 'concurrency ≈ target_RPS p95_latency'.
3) Metrik: ölçmək
SLI gecikmələr: p50/p90/p95/p99 və p99 quyruq. 9; «isti» və «soyuq» yollar üçün ayrı.
Səhvlər: '5xx', '4xx' (valid/qeyri-valid), timeouts, aborted.
Bant genişliyi: sabit RPS, throughput/bayt.
Resurslar: CPU, RAM/heap, GC fasilələri, disk IOPS/lat, şəbəkə bandwidth, qoşulma sayı/FD.
Növbələr və backpresher: dərinlik, gözləmə vaxtı, sayı shed/məhdud sorğular.
Cache effektivliyi: hit/miss, istilik fırtınaları.
BD/caches/növbələr: p95 sorğular, kilidləmə, münaqişələr, pool utilization.
4) Stendlər və məlumatlar
Konfiqurasiya ekvivalentliyi: proqram versiyaları, limitlər (uLimit, conntrack), JVM/GC konfiqurasiya, pool's.
Topologiya: LBs, CDN, WAF, TLS, eyni şəbəkə «hopları».
Verilənlər: real paylama (obyektlərin ölçüsü, «isti «/» soyuq »açarlar, regionallıq).
Soyuq/isti/isti başlanğıc: ayrı-ayrı keçidlər; «soyuq» caches test edin.
Fon izolyasiyası: aktual olmayan jobları/kronomları söndürmək və ya onların təsirini nəzərə almaq.
5) Ssenarilər (yük profilləri)
1. Baseline: hədəf RPS pilləli sürətləndirmə, saxlama 10-30 dəq.
2. Ramp & Hold: X% hədəf yuxarıda hamar artım, saxlama → quyruq analizi.
3. Spike: ani × 2- × 5 1-5 dəqiqə sıçrayış, sonra geri.
4. Stress to Failure: uğursuzluğa qədər addımlar; SLO-nun ilk yerinə yetirilməməsi nöqtəsini və «qırılma» nöqtəsini qeyd edirik.
5. Soak: trafik dəyişkənliyi ilə 6-24 saat (gecə/gündüz), üzləri/sürüşməni izləyirik.
6. Mixed: real paylanması (Zipf/pareto), müxtəlif ağırlıqlar.
6) Addım-addım proses
SLO və hədəf trafik profillərini təyin edin.
Yükləmə modelini seçin (açıq/qapalı), arrival-rate və ya VU-ları təyin edin.
Məlumat və «isti «/» soyuq »rejimləri hazırlayın.
Telemetriyanı (treys/metrika/log), test yarası ilə korelyasiyanı konfiqurasiya edin.
Isınma və qaçış, artefaktların toplanması (CPU/heap profilləri, flame graphs, explain/slow-logs BD).
Dar yerlərin təhlili, action items formalaşması.
Fikslərdən sonra reproqon, baza yeniləmə və capacity playbook.
7) Dar yerlər və tipik fikslər
CPU-bound xidməti: profilləşdirmə → isti funksiyaların aradan qaldırılması, allokasiyalar, budaqlar; vektorizasiya, cash-friendly strukturu.
Network/TLS: keep-alive, HTTP/2/3, connection pooling, düzgün vaxt, chat azalması.
BD: indekslər, batchinglər, hazırlanmış sorğular, konnektlər hovuzu, R/W bölgüsü, nəticələrin keşi, sorğuların deduplikasiyası.
Caches: ölçüsü, TTL, request coalescing, fırtına qorunması, warming, regional toplar.
Növbələr/brokerlər: dostluq/paralellik limitləri, batches ölçüsü, idempotent consumers, DLQ tavanları.
Garbatage/Pauzes: GC tuning, tamponları icarəyə götürmək, ağlabatan həddə object pooling.
I/O/disk: asenkron giriş/çıxış, sıxılma, cavabların ağlabatan səviyyədə sıxılması.
8) Limitlər və müdafiə
Budget Taymaut: kaskadların qarşısını almaq üçün yuxarıdan aşağıya.
Rate limit/token-bakets: «uzun ölüm» əvəzinə proqnozlaşdırıla bilən deqradasiya.
Circuit breaker və doyma aşağı prioritet shading.
Backpressure: siqnallar və zəncirin dərinliklərinə paralelliyin məhdudlaşdırılması.
Bulkheads: kritik end nöqtələri altında hovuz izolyasiyası.
Idempotency: retras altında təhlükəsiz təkrarlama üçün açarlar.
9) Alətlər və onları seçmək zaman
k6 - lakonik JS, əla arrival-rate, inteqrasiya və qrafik dəstək.
Gatling - Scala DSL, yüksək performanslı generator.
JMeter - çevik, zəngin ekosistem; protokollar/plugins üçün əlverişlidir.
Locust - Python ssenariləri, xüsusi flow mürəkkəb məntiq üçün əlverişlidir.
Vegeta/hey/wrk - HTTP-də mikrobençi və nöqtəli keçidlər.
tc/netem, toxiproxy - şəbəkə deqradasiyalarının inyeksiyası.
Flamegraph/profiler - «qaynar yerlər» CPU/heap axtarış.
10) Nümunələr (eskizlər)
k6 (açıq model, end nöqtələrinin qarışığı)
javascript import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
scenarios: {
open_model: {
executor: 'constant-arrival-rate',
rate: 800, timeUnit: '1s', duration: '20m',
preAllocatedVUs: 500, maxVUs: 2000
}
},
thresholds: {
'http_req_duration{kind:hot}': ['p(95)<200'],
'http_req_failed': ['rate<0. 005']
}
};
export default function () {
const r = Math. random();
let res;
if (r < 0. 6) {
res = http. get('https://svc/api/hot', { tags: { kind: 'hot' }});
} else if (r < 0. 9) {
res = http. get('https://svc/api/warm', { tags: { kind: 'warm' }});
} else {
res = http. post('https://svc/api/heavy', JSON. stringify({ n: 1000 }), { headers: { 'Content-Type': 'application/json' }});
}
check(res, { 'status is 2xx': (r) => r. status >= 200 && r. status < 300 });
sleep(0. 2);
}
Gatling (pillələr və spike)
scala setUp(
scn. inject(
rampUsersPerSec(50) to 500 during (10 minutes),
constantUsersPerSec(500) during (20 minutes),
spikeUsers(2000). during(30. seconds)
)
). protocols(http. baseUrl("https://svc"))
Yük planı (YAML-skelet)
yaml profile: "mix-traffic"
targets:
- endpoint: GET /api/hot weight: 0. 6
- endpoint: GET /api/warm weight: 0. 3
- endpoint: POST /api/heavy weight: 0. 1 schedule:
- step: { rps: 300, hold: 10m }
- step: { rps: 600, hold: 10m }
- step: { rps: 900, hold: 10m }
guardrails:
slo:
p95_ms: 200 error_rate: 0. 5%
abort_if:
- metric: error_rate op: ">"
value: 2%
window: 2m
11) Avtomatlaşdırma və həyat dövrü
Perf-smoke hər PR (qısa keçid açar end-point).
Hesabatlar və profil artefaktları ilə steyjdə gecə «capacity» qaçışları.
CI/CD-də geytlər: p95/p99 reqressiyası və ya error rate artımının X% -i.
Bazlinlərin versiyalaşdırılması və artefaktlar kimi profillərin/fleymqrafların saxlanması.
Müvafiq etiketlər: hansı xidmət/end point, hansı trafik profili istifadə olunur.
12) Anti-nümunələr
Generator və bir maşın test xidmət → təhrif nəticələr.
API-lər üçün yalnız qapalı model (VUs) → quyruqların aşağı salınması və səhv qiymətləndirmə.
Boş BD/cache ilə soyuq başlanğıc olmadan qaçır.
Real paylama yoxdur (bütün sorğular eynidir).
Telemetriya yoxdur (yalnız generator tərəfdən RPS/latency).
Sabit baza və mühit nəzarəti olmadan müqayisə.
Səbəbini düzəltmək əvəzinə artırılmış vaxt vasitəsilə «optimallaşdırma».
13) Memarın yoxlama siyahısı
1. SLO və tipik/pik yük müəyyən?
2. Düzgün model seçilib (open/closed) və trafik profili çəkilib?
3. Stend konfiqurasiya və topologiyaya bərabərdir, soyuq/isti rejim varmı?
4. Telemetri və profillər daxildir, test yarası işarələri qoyulur?
5. Purs: baseline/ramp/spike/stress/soak - örtülmüş?
6. Doyma nöqtələri sabitlənir və ehtiyat planlaşdırılır (safety margin)?
7. Limitlər, brakerlər, backpresher, idempotency, sheiding siyasəti?
8. Regress p95/p99 və error rate üçün CI-geytlər var, bazalar versiya olunur?
9. Fikslərdən sonra - playbook gücünə görə reproqon və yeniləmə?
10. Avtomatik miqyaslı və qəza rejimləri planı sənədləşdirilib?
Nəticə
Yük və stress testi birdəfəlik «yarış» deyil, davamlı mühəndislik təcrübəsidir. Real trafik modeli, düzgün stendlər, telemetriya və CI/CD-də avtomatlaşdırma performansı «gizli sehrdən» metrik idarə olunan qabiliyyətə çevirir: tavanınızın harada olduğunu, ehtiyatın nə qədər təhlükəsiz olduğunu və hansı dəyişikliklərin istifadəçi təcrübəsini həqiqətən yaxşılaşdırdığını bilirsiniz.