로드 및 스트레스 테스트
1) 이용 약관
로드 테스트-SLO에 대한 작업 범위 (대상 RPS/경쟁) (예: p95 <200 ms, 오류율 <0) 에서 테스트합니다. 5%).
스트레스 테스트-( CPU/DB/네트워크의 채도 전/오버 포화) 를 넘어 열화 및 복구 메커니즘을 관찰합니다.
스파이크 테스트-날카로운 하중 버스트 (× N 분).
흡수/내구성-누출, GC 드리프트, 조각화, 대기열 성장을 찾기위한 장기 (시간/일).
용량 테스트-처리량 (포화 점) 및 매장량의 고원 계산.
목표: SLO 확인, 고원 수정, 병목 현상 이해, 자동 스케일링 및 한계 교정.
2) 교통 모델: 개방형 vs 폐쇄
폐쇄 모델 (동시성 중심): 답변 후 각각 생각 시간이되는 고정 된 수의 가상 사용자 (VU).
공개 모델 (도착률): 응답에 관계없이 고정 요청률 (RPS).
작은 법칙: 'L = λW'
'L' 은 동시에 서비스 요청의 평균 수입니다
'λ' - 강도 (RPS),
'W' 는 평균 응답 시간입니다.
따라서 생성기의 필요한 경쟁력 평가: '동시 대상 _ RPS p95 _ latency'.
3) 지표: 우리가 측정하는 것
지연 SLI: p50/p90/p95/p99 및 p99 꼬리. 9; "핫" 및 "콜드" 경로는 별도입니다.
오류: '5xx', '4xx' (유효/유효하지 않음), 타임 아웃, 중단됨.
처리량: 지속적인 RPS, 처리량 스트림/바이트.
리소스: CPU, RAM/heap, GC 일시 중지, 디스크 IOPS/lat, 네트워크 대역폭, 연결 수/FD.
대기열 및 백프레서: 깊이, 대기 시간, 창고/제한 요청 수.
캐시 효율: 히트/미스, 워밍업 폭풍.
DB/캐시/대기열: p95 요청, 잠금, 충돌, 수영장 활용.
4) 스탠드와 데이터
구성 동등성: 소프트웨어 버전, 한계 (uLimit, 연결 트랙), JVM/GC 설정, 풀.
토폴로지: LB, CNC, WAF, TLS, 동일한 네트워크 "홉".
데이터: 사실적인 분포 (객체 크기, "핫 "/" 콜드" 키, 지역).
차가운/따뜻한/핫 스타트: 개별 달리기; "차가운" 캐시를 테스트하십시오.
배경 격리: 관련없는 작업/크롬을 사용하지 않거나 그 효과를 설명합니다.
5) 시나리오 (로드 프로파일)
1. 기준: RPS를 목표로하는 단계 가속, 10-30 분 유지.
2. Ramp & Hold: 목표보다 X% 높은 부드러운 성장, 유지 → 꼬리 분석.
3. 스파이크: 1-5 분 동안 인스턴트 × 2 × 5 스플래시 한 다음 돌아옵니다.
4. 실패에 대한 스트레스: 실패의 단계; 첫 번째 SLO 실패 지점과 "중단" 지점을 수정합니다.
5. 담그기: 교통량이 다양한 (주야간) 6-24 시간, 얼굴/드리프트를 주시하십시오.
6. 혼합: 실제 분포 (Zipf/pareto) 에 의한 엔드 포인트의 혼합, 다른 가중치.
6) 단계별 프로세스
SLO를 정의하고 트래픽 프로파일을 타겟팅
로드 모델 (개방/폐쇄), 도착률 설정 또는 VU를 선택하십시오.
데이터 및 "핫 "/" 콜드" 모드를 준비하십시오.
테스트 실행과 상관 관계가있는 원격 측정 (트레일/메트릭/로그) 을 설정합니다.
워밍업 및 실행, 아티팩트 수집 (CPU/힙 프로파일, 화염 그래프, 설명/느린 로그 DB).
병목 현상 분석, 행동 항목의 형성.
수정 후 리프로곤, 기준 업데이트 및 용량 플레이 북.
7) 병목 현상 및 일반적인 수정
CPU 바운드 서비스: 핫 기능, 할당, 브랜치의 프로파일 링 → 제거; 벡터화, 캐시 친화적 인 구조.
네트워크/TLS: 계속 살아 있음, 상태를 유지하기 위해서/2/3, 연결 풀링, 정확한 타임 아웃, 채팅 감소.
DB: 색인, 배치, 준비된 쿼리, 연결 풀, R/W 분리, 결과 캐싱, 쿼리 중복 제거.
캐시: 크기, TTL, 통합 요청, 폭풍 방지, 온난화, 지역 공.
대기열/중개인: 수용 한계/병렬 처리, 배치 크기, 불완전한 소비자, DLQ 천장.
차고/일시 정지: GC 튜닝, 버퍼 렌탈, 합리적인 한계 내에서 객체 풀링.
I/O/디스크: 비동기식 I/O, 압축, 합리적인 수준의 응답 압축.
8) 한계 및 보호
예산 시간 초과: 계단식을 피하기 위해 위에서 아래로.
요율 제한/토큰 버킷: "긴 죽음" 대신 예측 가능한 열화.
회로 차단기 및 우선 순위가 낮은 채도 음영.
역압: 체인 깊이의 신호 및 제한 동시성.
벌크 헤드: 중요한 엔드 포인트를위한 격리 풀.
이념성: 반복되는 안전한 반복을위한 열쇠.
9) 도구와 도구 선택 시점
k6 - 간결한 JS, 도착률, 통합 및 그래프에 대한 탁월한 지원.
개틀링-Scala DSL, 고성능 생성기.
JMeter-유연하고 풍부한 생태계; 프로토콜/플러그인에 편리합니다.
메뚜기-파이썬 스크립트, 복잡한 사용자 흐름 로직에 편리합니다.
Vegeta/ey/wrk-마이크로 벤치 및 포인트는 HTTP에서 실행됩니다.
tc/netem, 독성 프록시-네트워크 분해 주입.
화염 그래프/프로파일 러-CPU/힙 핫스팟 검색.
10) 예 (스케치)
k6 (오픈 모델, 믹스 엔드 포인트)
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);
}
개틀링 (단계 및 스파이크)
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) 자동화 및 수명주기
각 PR의 퍼프 스모크 (주요 엔드 포인트의 단기 실행).
야간 "용량" 은 보고서 및 프로필 아티팩트와 함께 무대에서 실행됩니다.
CI/CD의 게이트: 기준선 또는 오류율 증가의 p95/p99> X% 를 회귀 할 때 파일을 작성하십시오.
기준선의 수정 및 아티팩트로서 프로파일/플레임 그래프의 저장.
관련 태그: 어떤 서비스/엔드 포인트가 적용되고 어떤 트래픽 프로파일이 사용되는지.
12) 반 패턴
동일한 시스템의 생성기 및 테스트 서비스 → 결과가 왜곡되었습니다.
APIbacks → 언더 슈팅 및 오판에 대해서만 닫힌 모델 (VU).
콜드 스타트없이 빈 데이터베이스/캐시에서 실행됩니다.
사실적인 배포판이 없습니다 (모든 쿼리는 동일합니다).
원격 측정 없음 (발전기 측면에서만 RPS/대기 시간).
안정적인 기준선과 환경 제어가없는 비교.
원인을 수정하는 대신 증가 된 타임 아웃을 통한 "최적화".
13) 건축가 점검표
1. SLO 및 일반/피크로드가 정의 되었습니까?
2. 올바른 모델 (개방/폐쇄) 이 선택되고 트래픽 프로파일이 설명됩니까?
3. 스탠드는 구성 및 토폴로지와 동일합니다. 콜드/핫 모드가 있습니까?
4. 원격 측정 및 프로파일 활성화, 상처 태그 테스트?
5. 실행: 기준선/램프/스파이크/스트레스/담그기-덮었습니까?
6. 채도 포인트가 고정되고 안전 마진이 계획되어 있습니
7. 구성된 한계, 차단기, 백 프레셔, demempotency, 음영 정책?
8. p95/p99 회귀 및 오류율에 대한 CI 게이트가 있습니까? 기준선이 다양합니까?
9. 수정 후-비난 및 플레이 북 전원 업데이트?
10. 자동 줌과 비상 계획이 문서화되어 있습니까
결론
로드 및 스트레스 테스트는 일회성 "레이스" 가 아니라 지속적인 엔지니어링 실습입니다. CI/CD의 사실적인 트래픽 모델, 올바른 스탠드, 원격 측정 및 자동화는 성능을 "비밀 매직" 에서 미터법 중심 기능으로 전환합니다. 천장의 위치, 재고의 안전 및 사용자 경험의 변화를 알고 있습니다.