Жүктемелік тестілеу және стресс
Жүктемелік тестілеу және стресс
1) Бұл не үшін қажет
Мақсаттары:- Сыйымдылықты растау (SLO берілген кезде жүйе қанша RPS/бәсекелес сессияны көтереді).
- Шөлмек мойындарын табу (CPU/IO/DD/желілер/блоктау/пулдар).
- CI/CD көрініс бюджеттері мен «гейттерді» баптау.
- Релиздер тәуекелін төмендету (регрессия p95/p99, пик кезінде қателердің өсуі).
- Сыйымдылықты/құнды жоспарлау (скейл-аут және резервтер).
2) Перф-тесттердің түрлері
Load (жұмыс жүктемесі): шыңға жақын шынайы трафик; SLO валидациясы.
Стресс (стресс): шектен жоғары/дейін өсу → бұзылған кездегі мінез-құлық.
Spike (импульс): жүктеменің тез секіруі → икемділік/автоскейл.
Soak/Endurance (ұзақ): сағат/тәулік → ағып кету, фрагментация, latency дрейфі.
Capacity/Scalability: scale-out кезінде throughput/latency қалай өзгереді; Амдал/Густафсон заңы.
Smoke perf: әрбір релизде қысқа «түтінді» жүгіру (спектакль-санитарлар).
3) Трафикті генерациялау модельдері
Жабық модель (fixed VUs/concurrency): 'N' пайдаланушылар, әрқайсысы сұрау салады → клиентке кезек. Артық жүктемені жасыру қаупі.
Ашық модель (arrival rate): нақты өмірдегі сияқты λ қарқындылығымен (req/s) өтінімдер ағыны. Көпшілік API үшін дұрыс.
Литтл заңы: 'L = λ × W'.
Пул/сервис үшін: ең аз параллелизм ≈ 'λ × W' (қордың 20-50% қосыңыз).
Мұнда 'λ' - throughput, 'W' - орташа қызмет көрсету уақыты.
4) Жүктеме профильдері және сценарийлер
User journey mix: сценарий үлестері (login, browse, deposit, checkout...).
Think-time: пайдаланушының үзілісі (бөлу: экспоненциалдық/логнормалдық).
Data profile: жауап өлшемі, payload, параметрлердің вариативтілігі.
Корреляция: қадамдарды (cookie/токендер/ID) нақты флоумен байланыстыру.
Суық/жылы/ыстық кеш: жеке прогондар.
Read vs Write: оқу/жазу теңгерімі, ретраға арналған теңсіздік.
Көп аймақ: RTT, POP/ASN бойынша бөлу.
5) Тестілеу ортасы
Оқшаулау: стенд топология/баптаулар бойынша сынамаға жақын (бірақ сынаманы «соқпаймыз»).
Деректер: PII бүркемелеу, көлемдер, индекстер өнімдегідей.
Жүктеме генераторлары: CPU/желіге сүйенбейді; таратылған раннерлер, уақытты үндестіру.
Бақылау қабілеті: метрика/трейс/логи, периметрдегі синтетика, CPU/heap профильдерінің экспорты.
6) Метрика және SLI
Throughput: RPS/секунд сайын транзакциялар.
Latency: p50/p95/p99, TTFB, server time vs network.
Errors: 5хх/4хх/домендік қателердің үлесі.
Saturation: CPU, load avg, GC, дискілік IOps/жасырындылық, network, pool wait.
Бизнес-SLI: 5s ≤ депозитінің табысы, 2s ≤ тапсырысты растау.
Шекті мәндерді SLO-дан алыңыз (мысалы, "99. 95% ≤ 300 ms"), айдап өту кезінде burn-rate-ті бақылаңыз.
7) Тар жерлерді іздеу (әдістеме)
1. Жүйені мақсатты жүктеменің 60-80% -ға тұрақты жылытыңыз.
2. (ramp) → p95/p99 және error-rate өсетін жерді белгілеңіз.
- пулдағы кезектермен (DB/HTTP),
- WAIT/lock (ДБ) өсуімен
- GC-үзілістер/heap,
- желілік retransmits/packet loss,
- дискілік латенттілік/кэш-қателер.
- 4. Мыналарды оқшаулаңыз: сұрау жолы бойынша бинарлық іздеу, профильдер (CPU/alloc/lock-profile).
- 5. «Бөтелкені» бекітіңіз → тюнинг → қайталау.
8) Стресстегі мінез-құлық
Graceful degradation: лимиттер, circuit-breakers, backpressure кезектері, «өңдеуге қабылданды» режимі.
Ретраялар: ең көп дегенде 1, тек демпотентті; джиттер; ретрайлардың бюджеті RPS-тен 10% ≤.
Fail-open/Fail-closed: сыни емес тәуелділіктер үшін fail-open (кэш/бітеуіштер) рұқсат етіңіз.
Cascading failure: пулдарды/квоталарды оқшаулау (bulkhead), жылдам таймауттар, функцияларды «бірқалыпты» ажырату (feature flags).
9) Құралдар (тапсырманы таңдау)
k6 (JavaScript, ашық/ашық-модель, жылдам, CI үшін ыңғайлы).
JMeter (экожүйеге бай, GUI/CLI, плагиндер, бірақ ауыр).
Gatling (Scala DSL, жоғары өнімділік).
Locust (Python, сценарий икемділігі).
Vegeta/hey/wrk (микро-бенчілер және жылдам тексеру).
Ереже: бір «негізгі» құрал + PR-дағы smoke-перф үшін жеңіл CLI.
10) Мысалдар (сниппеттер)
10. 1 k6 (arrival rate бар ашық үлгі)
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 (профиль идеясы)
Thread Group + Stepping Thread или Concurrency Thread (open-like).
HTTP Request Defaults, Cookie Manager, CSV Data Set.
Backend Listener → InfluxDB/Grafana; Assertions уақыт/код бойынша.
10. 3 Locust (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) Деректер, корреляция, дайындық
Seed-деректер: каталогтар, пайдаланушылар, баланстар, токендер - өнімдегідей.
PII бүркемелеу/анонимдеу; нақты бөлудің үстінен синтетиканы генерациялау.
Корреляция: жауаптардан ID/токендерді (RegExp/JSONPath) шығарып, келесі қадамдарда пайдаланыңыз.
12) Жүріп өту кезіндегі бақылау
Маршруттар бойынша RED-дашбордтар (Rate, Errors, Duration).
Exemplars: метрикадан трассаға өту (trace_id).
Қате логтары: сэмплинг + агрегация, телнұсқалар/сәйкестілік.
Жүйелік: CPU/GC/heap, дискілер/желі, pool wait.
БД: топ-сұраулар, блоктау, индекс-сканерлер, bloat.
13) Автоматтандыру және перформанс-гейттер
CI: табалдырықтармен merge (мысалы, k6 2-3 минут) қысқа аралықтар.
Nightly/Weekly: жеке ортада ұзын soak/стресс; есептер мен трендтер.
Канареялық релиздер: SLO (error-rate, p95) промоушеннің «гейт» ретінде талдау.
Регрессия: baseline vs ағымдағы билд; нашарлаған кездегі аллергия> X%.
14) Сыйымдылықты жоспарлау және құн
throughput → latency қисықтары: knee point (тізе) анықтаңыз - одан кейін p99 күрт өседі.
Скейл-аут: масштабтау тиімділігін өлшеңіз (RPS дельтасы/дельта түйіндері).
Құны: «$/сағатқа RPS», ең жоғары оқиғаларға арналған резерв + DR-резерв.
15) Қарсы үлгілер
Сынаманы бақылаусыз ұру немесе сынамаға ұқсамайтын «бос» ортада тестілеу.
Шамадан тыс жүктемені жасыратын VU тіркелген жабық модель.
think-time/деректердің жоқтығы → кэштің шындыққа жанаспайтын хиттері немесе керісінше - бастапқы деректерге дауыл.
Теңшелетін флоулардың орнына «/ping »скрипті.
Бақылаудың жоқтығы: «тек RPS және орташа кідірісті көреміз».
Бақылаусыз ретрациялар → өзі-DDoS.
Гипотезаларды/өзгерістерді бекітпей қамыр мен оңтайландыруды араластыру.
16) Чек-парақ (0-30 күн)
0-7 күн
SLI/SLO және мақсатты трафик профильдерін (mix, think-time, деректер) анықтаңыз.
Құралды таңдаңыз (k6/JMeter/Locust), RED дашбордтарын көтеріңіз.
Стенд пен seed-деректерді дайындаңыз, бөгде лимиттерді/каптчтарды өшіріңіз.
8-20 күн
Сценарийлер жасаңыз: open-model (arrival rate), суық/жылы/ыстық кэш.
load → stress → spike; knee point және тар жерлерді бекітіңіз.
CI (микро-прогон) бағдарламасына перформанс-гейттерді енгізіңіз.
21-30 күн
Soak-тест 4-24 сағ: ағу/дрейф GC, тұрақтандыру.
Шектерді, сыйымдылық жоспарын, «RPS → p95/қателер» иллюстрацияларын құжаттаңыз.
Runbook бағдарламасын «лимиттерді/скейлді қалай ұлғайтуға» және «деградациялауға» дайындаңыз.
17) Жетілу метрикасы
Трафиктің 80% ≥ қамтитын шынайы профильдер (mix, think-time, деректер) бар.
RED-дашбордтар + трассировка барлық тестілер үшін қосылған.
Перформанс-гейттер р95/қателер регрессиясы кезінде релиздерді бұғаттайды.
Сыйымдылық және knee point негізгі сервистер бойынша құжатталған.
Ай сайынғы soak/stress-прогондар және динамика бойынша есептер.
«spike» -ге төзімділік автоскейлмен және cascade-fail жоқтығымен расталған.
18) Қорытынды
Жүктемелік тестілеу - бұл бір реттік «өлшеу» емес, тұрақты инженерлік практика. Нақты пайдаланушыларды (open-model) моделдеңіз, клиенттің тәжірибесін көрсететін (SLI/SLO) өлшеңіз, бақылау мен «гейттерді» CI/CD-де ұстаңыз, stress/spike/soak-прогондарын жүргізіңіз және knee point-ті белгілеңіз. Сонда ең жоғары оқиғалар мен «қара аққулар» басқарылатын сценарийлерге, ал өнімділік - платформаңыздың болжамды және өлшемді параметріне айналады.