로드 테스트 및 스트레스 프로
간략한 요약
로드 테스트는 현실적이고 극단적 인 시나리오에서 성능 및 복원력에 대한 시스템 테 성공의 기초: 올바른 트래픽 모델 (공개 대 폐쇄), 고정 SLO, 순수 메트릭 (대기 시간/처리량/오류/포화), 대표 데이터, 자동화 및 반복성. 결과는 "RPS 수치" 가 아니라 솔루션입니다. 병목 현상은 어디에 있으며 성능 비용은 얼마이며 실패 임계 값은 어디이며 이동 방법은 무엇입니까?
SLO/SLI 및 대상 메트릭
SLO (예제): p95 API 계정 250 ms, p99 계정 600 ms; 오류 제곱 0. 3 %/30 일.
SLI: 대기 시간 (p50/p95/p99), 처리량 (RPS/CPS/QPS), 채도 (CPU/heap/GC/FD/conn), о자리 (5xx, 타임 아웃), о자물쇠 (깊이/지연), DB (잠금 장치, 느린 쿼리),
오류 및 포화 트리거 (예: CPU> 75% 또는 큐 깊이> X → 저하).
테스트 유형
1. 기준/벤치 마크-단일 서비스/엔드 포인트, "이상적인" 조건.
2. 로드-사실적인 "작업 일" + 램프 업/램프 다운.
3. 스트레스-하중을 저하 및 중단 점 고정으로 증가시킵니다.
4. 스파이크-날카로운 점프 (초/분 단위로 x2-x10).
5. 흡수/내구성-장기 실행 (8-72 시간): 메모리 누출, 대기 시간 드리프트.
6. 용량-성능 곡선 및 용량 계획을위한 단계로드.
7. 분해/카오스 믹스-로드 + 부분 오류 (느린 데이터베이스, 캐시 드롭, "붕괴 된" 앱 링크).
교통 모델: 오픈 vs 폐쇄
개방형 모델 (인터넷에보다 사실적인): 사용자에게는 λ강도 (포아송 같은 스트림) 가 제공됩니다. 시스템 속도가 느려지면 "동결" 이 아닌 요청이 누적됩니다.
폐쇄 모델-생각 시간이있는 고정 된 수의 가상 사용자 (VU). 지연이 증가하면 RPS는 인위적으로 떨어집니다.
권장 사항: 프론트 엔드 API의 경우 내부 동기 스크립트의 경우 오픈 모델 (k6 '도착률') 을 사용하여 닫힌 상태와 결합하십시오.
로드 프로파일 (템플릿)
"정상적인 날": 기준 배경 + 일일 변동.
"피크 이벤트": 시작 10-30 분 전 (워밍업), 시작, 고원, 꼬리에서 급격한 스파이크.
"토너먼트/스트림": 사다리 단계, 반복 피크 간격.
"인프라 저하": 캐시의 절반이 비어 있고 한 영역이 꺼져 있으며 PSP 대기 시간이 증가합니다.
"실패": 1-5 분 안에 트래픽이 보호로 흐릅니다. 자동 스케일/HPA/재시도 폭풍 확인.
환경 데이터 및 준비
테스트 데이터: 실제 카디널리티 (공급자, 통화, 국가), 더러운 필드, 쿼리 분포 (Pareto/Zipf).
비밀/PII: 익명; 키/PSP-샌드 박스.
환경: 전용 perf 스탠드, 통합 (mock/stab) 으로부터의 격리, 고정 버전.
관찰 가능성: 메트릭 (Prometheus), 로그 (Loki/ELK), 추적 (OTel). 응답에서 빌드 ID를 기록하십시오.
폭풍 방지 리트레이와 이데올로기
dempotent 작업에 대해서만 Retrai; 재 시도 예산을 설정합니다 (예: 트래픽의 10%).
지수 백오프 + 지터; "붕괴" 동일한 GET.
지불에 대한-dempotent 키 및 명시 적 상태.
천둥 무리 방지: 캐시 잠금 장치, SWR, 지역 세마포어.
도구 및 패턴
k6 (스크립팅, 오픈 모델, 좋은보고), Locust (파이썬 스크립트), Gatling (Scala), JMeter (광범위한 프로토콜).
프로토콜: TH/1. 1/2/3, gRPC, 웹 소켓, 푸시 서버는 "GET" 로 테스트하지 않습니다.
트래픽 생성: 발전기의 수평 스케일링, 네트워크 병목 현상 제어.
프로파일 제거: 하중에서 pprof/async-profiler/ebpf, OTel 경로.
javascript import http from 'k6/http';
import {check, sleep} from 'k6';
export const options = {
scenarios: {
warmup: { executor: 'ramping-arrival-rate', startRate: 50, timeUnit: '1s',
preAllocatedVUs: 200, stages: [ { target: 200, duration: '5m' } ] },
spike: { executor: 'constant-arrival-rate', rate: 1200, timeUnit: '1s',
preAllocatedVUs: 2000, startTime: '6m', duration: '3m' }
},
thresholds: {
http_req_failed: ['rate<0. 3%'],
http_req_duration: ['p(95)<250', 'p(99)<600']
}
};
export default function () {
const res = http. get(`${__ENV. BASE_URL}/api/v1/catalog? c=${Math. floor(Math. random()1000)}`);
check(res, { 'status is 200': (r) => r. status === 200 });
sleep(Math. random()0. 9) ;//think time (for closed parts of the script)
}
절차
1. 가설 → 병목 현상 (CPU, DB, 캐시, 네트워크, TLS, GC) 일 가능성이 높습니다.
2. 프로필 → 시나리오/경로, 트래픽 공유, 모델 (공개/폐쇄), 데이터.
3. 워밍업 → 캐시/연결/SL/통역기.
4. → 스테이지가 목표 강도로 증가합니다.
5. 고원 → 안정적인 지표 및 흔적 수집.
6. 스트레스/감소 → 중단 점을 찾고 자동 스케일을 관찰하십시오.
7. 분석 → 메트릭, 화염 그래프, 보고서 및 변경 계획과 관련이 있습니다.
8. Repruf → CI (지역 Perf) 파이프 라인을 통해 반복됩니다.
결과 분석
로드 → 지연/오류 곡선: 팔꿈치 (용량) 를 찾습니다.
고장 대기 시간: 네트워크 (DNA/SL/연결), 프록시, 응용 프로그램, 데이터베이스, 외부 통화.
포화: CPU> 75-85%, GC 일시 정지> p95, I/O 대기, 작업 대기열.
탄성: 자동 스케일 반응 시간 (HPA/KEDA), 콜드 스타트, 캐시 예열.
비용: 목표 SLO에서 $/1000 RPS, 최고 예산 예측.
엔지니어링 실습
분해 지표: "꼬리" p99, 대기열 성장, 적중 비율 하락, 재시도 시도의 성장.
@ info: whatsthis
DB: 색인/계획/쿼리 캐시, 연결 풀, 배치 작업, 생산자에 대한 역압.
캐시: 크기/퇴거 정책, 핫 키, 복제.
네트워크/에지: TP/2/3, 재개 70% 이상, Brotli, CNC 캐시 키, 계층 캐시.
부하 관찰 가능
메트릭: 시스템 (CPU/mem/IO), 런타임 (GC/heap), 네트워크 (RTT/loss/ECN), L7 (p95/99, 5xx/429), 대기열, 데이터베이스 클러스터/캐시.
트레일: "테일" (테일 기반), 빌드 아이드/카나리아 마크 샘플링이 포함됩니다.
로그: 볼륨 제한이있는 오류 집계 ("forDOSor" 로그 파이프 라인이 아님).
실험: 기능 플래그 및 구성은 보고서에 기록해야합니다.
자동화 및 CI/CD
CI의 직업 (흡연 3-5 분, 야간 30-60 분, 매주 담그기).
관용 한계: 대기 시간/오류/리소스 → 회귀 "브레이크 빌드".
아티팩트: 그래프, 화염 그래프, 프로필, JSON 보고서 (k6/jtl).
데이터 및 스크립트의 수정, perf 스크립트의 PR 검토.
iGaming/fintech 특정
토너먼트/경기: 스파이크 + 고원; 온난화, 풀 제한 증가, 봇 용 회색 경로.
지불/PSP: 샌드 박스 제한, demempotency, 엄격한 타임 아웃; 저하 모드 (디렉토리 캐시, 대기열) 를 확인합니다.
잭팟/이벤트: 원자 성 및 일관성, 테이크 없음, RNG/리드 보드로드.
사기 방지/AML: 규칙/ML 점수, 역압, 이벤트 중복 제거에로드합니다.
규제: 정점에 로깅 메트릭 및 버전, 감사 보고서.
출시 점검표
- 고정 SLO/SLI 및 빨간색 선 (오류/대기 시간/채도).
- 로드 시나리오 및 프로파일이 승인되었습니다 (개방/폐쇄, 스파이크/흡수/응력).
- 데이터 사실적, PII 마스크, 통합 샌드 박스/모의.
- 관찰 가능성 준비: 메트릭/트레일/로그, 릴리스 태그.
- 시스템 구성 요소 (ulimite/sysctl/pool) 가 문서화되어 있습니다.
- 자동 스케일/캐시 예열 계획 및 롤백 기준.
- 임계 값 경고 및 통화 계획.
- 보고 템플릿 (차트, 결론, 조치) 이 준비되었습니다.
공통 오류
폐쇄 모델 테스트는 "녹색" 결과를 생성하고 제품이 떨어집니다 (개방형 모델을 무시할 수 없음).
대표 데이터 (하나의 통화/하나의 공급자) → 잘못된 결론.
제로 준비: 콜드 캐시/SL/연결 → 시작시 과도한 대기 시간.
한계가없는 배신자 → 폭풍과 폭포가 떨어집니다.
모든 서비스에 대해 동일한 프로필을 사용하여 실제 "핫스팟" 을 건너 뛰십시
담그기 실행이 없으면 → 메모리 누출 및 드리프트가 표시되지 않습니다.
불투명 한 결과: 흔적/불꽃이 없음 → 병목 현상을 찾을 수 없습니다.
미니 플레이 북
중단 점 정의
1. 5-10 분마다 부하의 10-20% 단계. 2) p95가 급격히 상승하고 오류가> SLO 인 순간을 수정하십시오. 3) CPU/DB/캐시 프로파일 제거. 4) 최적화 계획 및 반복.
다시 폭풍에 의존
1. 재 시도 예산을 제한하고 백오프 + 지터를 활성화하십시오. 2) 요청 붕괴/SWR을 입력하십시오. 3) "분해 모드" (제한된 기능) 를 허용합니다. 4) 이중 점검 demempotency.
피크 이벤트 (토너먼트) -사전 계획
1. CDN을 워밍업하십시오. 2) 목표 HPA를 늘리고 준비를 준비하십시오. 3) 봇에 대한 별도의 속도 제한. 4) 피크 모드 대시 보드, 통화 중 통신 브리지.
담그는 밤
1. 8-12 시간의 안정적인 하중. 2) 모니터 더미/FD/콘/GC- 일시 중지. 3) p95 델타 및 적중 비율을 확인하십시오. 4) 누출 및 드리프트 수정.
결과
로드 테스트는 "RPS 레이스" 가 아니라 엔지니어링 의사 결정 프로세스입니다. "실제 프로파일 (특히 오픈 모델) 을 모델링하고 SLO를 캡처하고 메트릭과 추적을 수행하며 성능 무릎을 찾고 성능 비용을 계산하십시오. 자동화 실행, 폭풍 방지 퇴각 유지 및 최고 이벤트 계획-이러한 방식으로 플랫폼은 가장 스트레스가 많은 순간에 예측 가능하고 안정적입니다.