C.W.K.
Stream
Lesson 01 of 10 · published

진짜 bottleneck 찾는 법

~14 min · operations, diagnosis

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

성능 디버깅이 데이터로 시작, 추측 아님

느린 시스템의 첫 본능이 인덱스 추가, 캐시 늘림, 쿼리 재작성. 프로 본능은 먼저 측정: 어느 쿼리가 느린지, 언제, 얼마나 자주, 얼마나. 숫자 없으면 모든 변경이 추측 + 대부분 추측이 더 나쁘게 만듦.

두 진단 차원

  • Query-level — 어느 쿼리가 범인? pg_stat_statements 가 모든 쿼리를 total time, mean time, call count 로 ranking.
  • Wait-level — DB 가 뭐 기다림? pg_stat_activity 가 live 쿼리와 뭐 기다리는지 (lock, IO, CPU) 보여줌.

의심 순서

(1) 누락 인덱스, (2) lock 경쟁, (3) bloat / dead tuple, (4) 캐시 압박 / 디스크 IO, (5) 네트워크 / pooling. 거의 모든 "DB 느려" 사고가 이 리스트 어디 있음.

Code

Total time 기준 top 쿼리·sql
-- CREATE EXTENSION pg_stat_statements + 재시작 필요
SELECT
    LEFT(query, 80)        AS query,
    calls,
    total_exec_time / 1000 AS total_seconds,
    mean_exec_time         AS mean_ms,
    rows
FROM   pg_stat_statements
ORDER  BY total_exec_time DESC
LIMIT  20;
Live activity — 지금 뭐 실행 중·sql
SELECT pid, state, wait_event_type, wait_event,
       now() - query_start AS runtime,
       LEFT(query, 80) AS query
FROM   pg_stat_activity
WHERE  state <> 'idle'
ORDER  BY runtime DESC NULLS LAST;
Lock 대기 — 누가 누구한테 막힘·sql
SELECT blocked.pid    AS blocked_pid,
       blocked.query  AS blocked_query,
       blocking.pid   AS blocking_pid,
       blocking.query AS blocking_query
FROM   pg_stat_activity blocked
JOIN   pg_locks blocked_locks   ON blocked_locks.pid = blocked.pid AND NOT blocked_locks.granted
JOIN   pg_locks blocking_locks  ON blocking_locks.locktype = blocked_locks.locktype
                                AND blocking_locks.database IS NOT DISTINCT FROM blocked_locks.database
                                AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
                                AND blocking_locks.granted
                                AND blocking_locks.pid <> blocked_locks.pid
JOIN   pg_stat_activity blocking ON blocking.pid = blocking_locks.pid;

External links

Exercise

프로덕션 같은 DB 에 pg_stat_statements 설치 + 1 시간 누적. total_exec_time 기준 top 5 쿼리 식별. 각각에 대해 명확한 bottleneck (누락 인덱스, sequential scan) 있는지 체크.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.