Բեռի և սթրեսի փորձարկում
1) Տերմիններ և նպատակներ
Load test-ը աշխատանքային միջակայքում (target RPS/մրցակցություն) SLO-ի դեմ (օրինակ, p95 <200 ms, error rate <0։ 5%).
Stress test-ը դուրս է գալիս (CPU/BD/ցանցից), դեգրադացիայի և վերականգնման մեխանիկայի դիտարկումը։
Spike test-ը ծանրության կտրուկ բարձրացումն է (N- ը րոպեում)։
Soak/Endurance-ը երկար պրոգոն է (ժամացույց/օր) արտահոսք գտնելու, GC dreaft, բեկորներ, հերթերի եղջյուրներ գտնելու համար։
Capacity test-ը էլեկտրականության սարահարթի հաշվարկն է (saturation point) և պաշարները։
Նպատակները 'հաստատել SLO-ն, արձանագրել սարահարթը, հասկանալ նեղ տեղերը, հեռացնել մեքենայի մասշտաբները և սահմանները։
2) Կոդավորման մոդելը 'բաց vs փակված
Փակված մոդել (concurrency-driven) 'վիրտուալ օգտագործողների ֆիքսված թիվը (VUs), յուրաքանչյուր պատասխան հետո անում է think time։
Բաց մոդել (arrival-rate) 'հարցումների ընդունման ֆիքսված ինտենսիվությունը (RPS), անկախ պատասխաններից։
Little’s Law: `L = λ W`
"L '-ը միաժամանակ սպասվող հարցումների միջին թիվն է,
'ը ինտենսիվությունն է (RPS),
«W» -ը պատասխանելու միջին ժամանակն է։
Այսպիսով, գեներատորի ճիշտ մրցակցության գնահատումը '«concurrency nottarget _ RPS p95 _ latency»։
3) Metriki: Ինչ չափում ենք
SLI ուշացումներ ՝ p50/p90/p95/p99 և պոչը p99։ 9; առանձին «տաք» և «սառը» ճանապարհների համար։
Սխալները ՝ «5xx», «4xx» (վիդային/ոչ որակավոր), timeouts, aborted։
Թողունակություն 'կայուն RPS, throughput հոսքեր/բայթ։
Ռեսուրսներ ՝ CPU, RAM/heap, GC դադար, IOPS/lat, ցանցային bandwidth, կոդերի/FD։
Հերթերը և backpresser 'խորությունը, սպասման ժամանակը, շեդ/limited հարցումների քանակը։
Քեշի արդյունավետությունը 'hit/miss, փոթորիկներ։
BD/kashi/հերթեր 'p95 հարցումներ, արգելափակումներ, հակամարտություններ, pool utilization։
4) Սթենդները և տվյալները
Միգրացիոն համարժեք ՝ ծրագրավորման, լիմիտների (uLimit, conntrack), JVM/GC, pool 'a։
Տեղաբանությունը ՝ LBs, CDN, WAF, TLS, նույն ցանցային «հոփները»։
Տվյալները ՝ իրական բաշխումներ (օբյեկտների չափսեր, «տաք «/» սառը »բանալիներ, օբյեկտիվություն)։
Սառը/տաք/տաք մեկնարկը 'առանձին անցքեր; պետք է փորձարկել «սառը» քեշները։
Ֆոնի մեկուսացումը 'անջատել ոչ ռեզլանտային ջոբները/նապաստակները կամ հաշվի առնել դրանց ազդեցությունը։
5) Սցենարներ (բեռի պրոֆիլներ)
1. Baseline: Քայլային արագացում մինչև RPS, 10-30 ռուբլիներ
2. Ramp & Hold: Լողացող աճը մինչև X տոկոսը ավելի բարձր է նպատակից, պահպանում է պոչերի վերլուծությունը։
3. Spike: ակնթարթային No. 2- 355 աճը 1-5 րոպե, ապա ՝ 108։
4. Stress to Failure 'քայլերը մինչև ձախողումները։ մենք արձանագրում ենք SLO-ի ձախողման առաջին կետը և «կոտրման» կետը։
5. Soak: 6-24 ժամ փոփոխականության հետ (օր/գիշեր), հետևում ենք դեմքերին/դրեյֆին։
6. Mixed 'էնդպոինտների խառնուրդը իրական բաշխման վրա (Zipf/pareto), տարբեր քաշներ։
6) Գայթակղիչ գործընթաց
Հայտնաբերել SLO-ը և ռուսական պրոֆիլները։
Ընտրել բեռի մոդել (բաց/փակ), տալ arrival-rate կամ VUs։
Պատրաստել տվյալները և «տաք «/» սառը »ռեժիմները։
Միացրեք հեռաչափությունը (treiss/metriks/loga), կորլացիա թեստային վերքի հետ։
Տաքացնելով և պրոգոնը, արտեֆակտների հավաքումը (CPU/heap, flame graphs, intain/slow-logs BD)։
Նեղ տեղերի վերլուծություն, action items ձևավորումը։
Reprogon-ից հետո, բազալինի նորարարությունը և capacity playbook-ը։
7) Նեղ վայրեր և տիպիկ ֆիքսներ
CPU-bound ծառայությւնը 'ավելացնելը տաք ֆունկցիաների, ալոկացիաների, ճյուղերի կոդավորումն է։ վեկտորիզացիա, քաշ-ֆրիդլի կառուցվածք։
Ցանցը/TMS: keep-alive, HTTP/2/3, connational pooling, ճիշտ թայմաուտներ, չաթվության նվազում։
ԲԴ ՝ ինդեքսներ, բատչինգներ, որոնք պատրաստվել են հարցումների, ձիերի փամփուշտների, R/W բաժանման, արդյունքների հավաքման, հարցումների դեդկլիկացիայի։
Քեշի 'չափը, TTL, request coalescing, պաշտպանություն փոթորիկներից, warming, տարածաշրջանային գնդակներից։
Հերթերը/բրոկերները 'լիմիտները' պրիմիտիվ/զուգահեռ, մարտերի չափը, idempotent consumers, DLQ առաստաղները։
Հարբաթ/դադար 'GC թյունինգը, ածխաջրածինների վարձույթը, խելացի սահմաններում object pooling։
I/O/սկավառակը 'ասինխրոն մուտքագրումը/եզրակացությունը, ագրեսիան, պատասխանների սեղմումը խելացի մակարդակի հետ։
8) Լիմիտներ և պաշտպանություն
Budget timauts 'վերևից ներքև, որպեսզի խուսափեն կասկադներից։
Rate limit/tocen-butets: կանխատեսելի դեգրադացիա «երկար մահվան» փոխարեն։
Circuit breaker-ը և ցածր գերակայությունը հագնելու ժամանակ։
Backpressure: ազդանշաններ և զուգահեռականության սահմանափակում շղթայի խորքում։
Bulkheads 'փամփուշտների մեկուսացումը կրիտիկական էնդպոինտների տակ։
Idempotency: բանալիներ անվտանգ խոհարարների համար ռելսերի տակ։
9) Գործիքներ և երբ ընտրել դրանք
K6 - laconical JS, հիանալի աջակցություն arrival-rate, կոմպոզիցիաներ և գրաֆիկներ։
Gatling-ը Scala DSL-ն է, բարձր արտադրողական գեներատոր։
JMeter-ը ճկուն, հարուստ էկոհամակարգ է։ հարմար է պարամետրերի/պլագինների համար։
Delust-ը Python-սցենարն է, հարմար է օգտագործողի ֆլոուի բարդ տրամաբանության համար։
Vegeta/hey/wrk - միկրոբենկներ և կետային բացիկներ HTTP-ում։
tc/netem, toxiproxy - ցանցային քայքայման միգրացիա։
Flamegraph/profiler-ը CPU/heap-ի «տաք տեղերի» որոնումն է։
10) Օրինակներ (սկետչիներ)
k6 (բաց մոդել, mix endpoints)
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 (աստիճաններ և սպայկ)
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"))
Բեռի պլանը (YAML կմախք)
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) Ավտոմատիզացիա և կյանքի ցիկլ
Perf-smoke-ը յուրաքանչյուր PR-ում (կարճ շեղում հիմնական էնդպոինտների)։
Գիշերային «capacity» -ը սայթաքում է զեկույցներով և արտեֆակտներով։
CI/CD խաղացողները 'p95/p99> X-ի ռեգրեսիայի տոմսերը կամ error rate-ի աճը։
Բազլայնների տարբերակումը և կոդավորման/ֆլեյմոգրաֆների պահպանումը որպես արտեֆակտներ։
Ռելեվանտության թեգերը 'ինչպիսի ծառայություն/էնդպոինտ ծածկված է, թե որ պրոֆիլն է օգտագործվում։
12) Anti-patterna
Գեներատորը և փորձարկվող ծառայությունը մեկ մեքենայի վրա աղավաղված արդյունքներ են տալիս։
Միայն փակված մոդել (VUs) API-back-ի համար պոչի թերագնահատումը և սխալ գնահատումը։
Դատարկ BD/kasha առանց սառը մեկնարկի։
Իրական բաշխումների բացակայությունը (բոլոր հարցումները նույնն են)։
Հեռուստատեսություն չկա (միայն RPS/latency գեներատորից)։
Համեմատություն առանց կայուն բազլինների և միջավայրի վերահսկման։
«Օպտիմիզացիան» ավելացված թայմաուտի միջոցով 'պատճառները շտկելու փոխարեն։
13) Ճարտարապետի չեկի թերթիկը
1. Որոշե՞ լ են SLO-ը և տիպիկ/պիցցա լուծումը։
2. Ընտրվել է ճիշտ մոդել (բաց/closed) և նկարված է պրոֆիլով։
3. Պատը համարժեք է գենդերային և տեղաբանությանը, կա սառը/տաք ռեժիմ։
4. Հեռուստաչափությունը և պրոֆիլները ներառում են, ռուսական թեստային վերքը տեղադրվում են։
5. Progons: baseline/ramp/spike/stress/soak - ծածկված։
6. Ամրագրված են հագեցման կետերը և պահեստները (safety margin)։
7. Լիմիտները, բրեյքերները, բեքսպրեսերը, idempotency, շեյդինգի պոլիսները։
8. Կան CI-գեյտներ p95/p99 և error rate-ի վրա, որոնք տարբերակված են։
9. Ֆիքսներից հետո 'reprogon և playbook հզորության նորարարություն։
10. Փաստարկվել է մեքենայի մեծացման և արտակարգ ռեժիմների պլանը։
Եզրակացություն
Բեռի և սթրեսի փորձարկումը տարբեր «մրցավազք» չէ, այլ շարունակական ինժեներական պրակտիկա։ Իրական մոդելը, ճիշտ ստենդները, հեռաչափությունը և ավտոմատացումը CI/CD-ում վերածում են «գաղտնի մոգության» արտադրողականության դեպի կառավարվող մեթոդ 'գիտեք, թե որտեղ է ձեր առաստաղը, որքան անվտանգ է պահուստը, և որ փոփոխությունները իրականում բարելավում են օգտագործողների փորձը։