CodeGym /행동 /SQL SELF /PostgreSQL 시스템 메트릭

PostgreSQL 시스템 메트릭

SQL SELF
레벨 46 , 레슨 0
사용 가능

네 PostgreSQL 서버를 레스토랑이라고 생각해봐, 그리고 우리는 감시관이야. 레스토랑이 안정적으로 돌아가려면, 얼마나 많은 재료(CPU, 메모리, 디스크)가 쓰이고 있는지, 얼마나 자주 부족해지는지, 그리고 누가 그걸 쓰는지 체크해야 해. 이걸 놓치면, 우리 "레스토랑"은 주문을 너무 많이 받아서 감당 못 하거나, 그냥 한낮에 뻗어버릴 수도 있어. 그래서 시스템 메트릭을 이해하는 게 진짜 중요해.

PostgreSQL 모니터링을 위한 핵심 메트릭:

  1. CPU: 쿼리 실행에 얼마나 많은 프로세서 시간이 쓰이는지 알려줘.
  2. 메모리 (RAM): PostgreSQL이 쿼리 캐싱을 포함해서 메모리를 어떻게 쓰는지 보여줘.
  3. 디스크 공간: 이건 좀 뻔하지. 디스크가 허락하는 것보다 더 많은 데이터를 저장할 순 없어.

우리 목표는 PostgreSQL 시스템 메트릭을 체크하고 해석하는 법을 익혀서, 성능 문제나 리소스 부족을 피하는 거야.

CPU 사용량 모니터링

CPU는 네 서버의 심장이야. PostgreSQL은 복잡한 쿼리 실행뿐만 아니라, autoanalyze나 autovacuum 같은 백그라운드 작업에도 CPU를 써. 만약 네 데이터베이스가 끝도 없이 CPU를 "먹어치우는" 대식가 같다면, 이제 개입할 때야.

  1. 시스템 도구 사용하기.
    먼저, PostgreSQL이 시스템 레벨에서 얼마나 CPU를 쓰는지 알아봐야 해. 리눅스에서는 top이나 htop 명령어를 쓸 수 있어.

PostgreSQL 프로세스를 찾아봐 (보통 네 데이터베이스 이름이 들어가 있어). 예를 들면, postgres: postgres [your_query] 이런 식이야.

%CPU 컬럼을 주목해봐. 이게 계속 높게 나오면, 뭔가 문제가 있다는 신호야.

  1. PostgreSQL에서 CPU 부하 분석하기.

PostgreSQL은 부하 모니터링을 위한 내장 뷰를 제공해. 여기서 제일 유용한 게 pg_stat_activity인데, 이건 현재 실행 중인 쿼리를 보여줘.

쿼리 예시:

SELECT pid, usename, query, state, now() - query_start AS duration
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY duration DESC;

여기서 중요한 건?

  • state = 'active'는 지금 실행 중인 쿼리만 보여줘.
  • duration은 쿼리가 얼마나 오래 CPU를 점유하고 있는지 보여줘.

실전 팁:

만약 오래 걸리는 쿼리가 있는데, 원래 그렇게 오래 걸릴 쿼리가 아니라면, 어떤 인덱스가 쓰이고 있는지 다시 확인해봐. 그리고 pg_terminate_backend로 문제 있는 프로세스를 종료할 수도 있어.

종료 예시:

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state = 'active' AND duration > interval '10 minutes';

메모리 사용량 모니터링

메모리는 PostgreSQL에서 두 번째로 중요한 리소스야, 특히 데이터 캐싱할 때. PostgreSQL은 work_mem이랑 shared_buffers 같은 파라미터를 통해 메모리를 적극적으로 써서 작업을 빠르게 해.

  1. PostgreSQL 메모리 사용을 위한 주요 파라미터:
  • shared_buffers: PostgreSQL이 작업할 때 쓰는 메인 메모리 블록이야. 보통 서버 전체 메모리의 25-40% 정도를 차지해.
  • work_mem: 한 쿼리에서 정렬이나 해시 작업을 할 때 쓰는 메모리야. 값이 클수록 임시 작업을 메모리에서 더 많이 처리할 수 있어(디스크 대신).
  1. 현재 메모리 설정 확인하기.

PostgreSQL에서 어떤 메모리 설정이 적용 중인지 보려면, 이 명령어를 실행해봐:

SHOW shared_buffers;
SHOW work_mem;

출력 예시:

1GB
4MB

이건 서버에서 shared_buffers에 1GB, 각 정렬/해시 작업마다 4MB가 할당됐다는 뜻이야.

  1. pg_stat_activity로 메모리 모니터링

현재 연결들이 얼마나 메모리를 쓰고 있는지 확인할 수 있어. 이 쿼리가 편해:

SELECT pid, usename, state, backend_start, pg_size_pretty(pg_backend_memory_contexts_size(pid)) AS memory_used
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY memory_used DESC;

이 쿼리는 각 활성 연결이 얼마나 메모리를 쓰는지 보여줘.

팁: 만약 어떤 연결이 너무 많은 메모리를 쓰고 있다면, 쿼리 안에 정렬이나 집계 작업이 있는지, 그리고 그걸 최적화할 수 있는지 확인해봐.

디스크 공간 모니터링

디스크는 PostgreSQL에서 마지막 리소스 저장소야. 메모리랑 CPU가 충분해도, PostgreSQL은 데이터, 트랜잭션 로그(WAL), 임시 파일 저장을 위해 디스크 공간이 필요해.

  1. 데이터베이스 크기 확인하기.

기본부터 시작하자: 데이터베이스 크기 확인.

SELECT pg_size_pretty(pg_database_size(current_database())) AS db_size;

이 쿼리가 하는 일?

현재 데이터베이스의 전체 크기를 보기 좋은 포맷(MB, GB)으로 보여줘.

  1. 테이블과 인덱스 크기 확인하기.

데이터베이스에서 "무거운 놈들"을 찾으려면, 이걸 써봐:

SELECT relname AS table_name, pg_size_pretty(pg_total_relation_size(relid)) AS total_size
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC;

출력 예시:

table_name total_size
orders 1 GB
customers 500 MB
transactions 300 MB
  1. WAL(트랜잭션 로그) 모니터링.

활발한 데이터베이스라면, 트랜잭션 로그가 금방 커질 수 있어. 크기를 이렇게 확인해봐:

SELECT pg_size_pretty(pg_xlog_location_diff(pg_current_wal_lsn(), '0/0')) AS wal_size;

정리

이제 PostgreSQL 시스템 메트릭을 모니터링할 수 있는 도구와 지식을 갖췄어:

  1. CPU 부하는 htop이나 pg_stat_activity로 체크해봐.
  2. shared_bufferswork_mem 파라미터를 잘 세팅해서 메모리를 최적화해.
  3. 데이터베이스, 테이블, 인덱스 크기를 정기적으로 확인해서 디스크 공간 부족을 피하자.

이런 스킬은 갑작스러운 장애를 피하고, PostgreSQL 서버를 항상 최상의 상태로 유지하는 데 꼭 필요해. 서버를 생각할 때, 리소스를 잘 관리하면 네 서비스가 사용자들한테 제일 인기 많은 "레스토랑"이 될 수 있다는 걸 기억해!

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION