본문 바로가기
C.W.K.
Stream
Lesson 01 of 10 · published

진짜 병목을 찾는 법

~14 min · operations, diagnosis

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

성능 문제는 숫자에서 시작해

느리다는 말만 듣고 색인이나 캐시부터 더하지 마. 어느 질의가 얼마나 자주, 언제, 얼마 동안 실행되는지 먼저 측정해.

질의와 대기를 나눠 봐

pg_stat_statements는 호출 수와 전체·평균 실행 시간으로 질의를 정렬하고, pg_stat_activity는 지금 실행 중인 질의와 lock·I/O 같은 대기를 보여줘.

의심 순서를 세워

진단 순서는 1) 빠진 색인, 2) 잠금 경쟁, 3) 죽은 튜플과 부풀림, 4) 캐시·디스크 I/O, 5) 네트워크·풀링이야. 이 순서로 증거를 좁혀. EXPLAIN 없이 바꾸는 건 도박이야.

Code

총 실행 시간이 큰 질의 찾기·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;
현재 실행 중인 작업 보기·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;
잠금 대기 관계 찾기·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

운영 환경과 비슷한 데이터베이스에 pg_stat_statements를 설치하고 1시간 동안 통계를 모아. total_exec_time이 큰 질의 5개를 찾고 각각 색인 누락이나 순차 탐색 같은 분명한 병목이 있는지 확인해.

Progress

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

댓글 0

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

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