성능 측정과 병목 분석
성능 측정과 병목 분석
핵심 지표
| 지표 | 의미 | 기준 |
|---|---|---|
| Latency | 요청-응답 시간 | API < 200ms |
| Throughput | 초당 처리량 | 서비스에 따라 다름 |
| p99 | 상위 1% 응답 시간 | 평균보다 중요! |
| Error Rate | 에러 비율 | < 0.1% |
병목 찾기 순서
- 모니터링: 어떤 API가 느린지 확인
- DB 쿼리 분석: slow query log, EXPLAIN
- 애플리케이션 프로파일링: CPU, 메모리, 스레드
- 인프라: 네트워크, 디스크 I/O
재기 전에 고치면 대개 틀린다
성능 문제는 짐작이 잘 안 맞습니다. 코드를 읽고 느릴 것 같은 곳을 고치면, 그 구간이 전체의 몇 퍼센트였는지 모르고 고친 것이 됩니다.
| 짐작 | 실제로 흔한 것 |
|---|---|
| 반복문이 느리다 | DB 를 기다리는 시간이 대부분이다 |
| 직렬화가 느리다 | 같은 질의를 여러 번 부르고 있다 |
| 서버가 부족하다 | 연결 풀 자리를 기다리고 있다 |
기다리는 시간과 일하는 시간을 나눠 재는 것이 첫 걸음입니다. CPU 사용률이 낮은데 느리면 어딘가를 기다리는 것이고, 그것은 서버를 늘려도 줄지 않습니다.
무엇을 재나
| 지표 | 무엇을 알려 주나 |
|---|---|
| 구간별 시간 | 어디가 긴지 |
| 호출 횟수 | 한 번이 아니라 여러 번인지 |
| 상위 백분위 | 평균에 숨은 느린 요청 |
호출 횟수가 특히 값싼 발견을 줍니다. 한 번에 20ms 인 질의가 화면 하나에서 50번 돌면 1초입니다. 그 질의를 빠르게 하는 것보다 횟수를 줄이는 것이 훨씬 크게 듣습니다.
실무 포인트
- 평균보다 p99가 더 중요 (사용자 경험에 직접 영향)
- 대부분의 병목은 DB 쿼리 → EXPLAIN 먼저 확인
- 추측하지 말고 측정부터 시작
- Q.서비스 성능 병목을 어떤 순서로 찾나요?
- Q.프로파일러 결과에서 self time과 total time을 어떻게 구분해 읽나요?
- Q.APM 도구로는 무엇을 보고 병목을 판단하나요?