슬기로운 개발자생활/Rust

&Axum SQLx를 활용한 데이터베이스 중급 - 성능 모니터링

개발자 소신 2024. 9. 24. 13:23
반응형

데이터베이스 성능 모니터링은 애플리케이션의 안정성과 효율성을 유지하는 데 필수적입니다. 데이터베이스의 성능 문제는 전체 시스템의 병목 현상을 초래할 수 있으므로, 적절한 모니터링을 통해 문제를 조기에 발견하고 해결하는 것이 중요합니다. 이번 글에서는 PostgreSQL의 성능 모니터링 도구를 소개하고, 실시간 쿼리 모니터링 및 분석 방법을 살펴보겠습니다.


5-1. PostgreSQL의 성능 모니터링 도구 소개

1. 성능 모니터링의 중요성

  • 문제 조기 발견: 성능 저하나 오류를 빠르게 감지하여 대응할 수 있습니다.
  • 자원 최적화: 시스템 자원의 효율적인 사용을 통해 비용 절감과 성능 향상을 도모합니다.
  • 사용자 경험 개선: 빠르고 안정적인 서비스를 제공하여 사용자 만족도를 높입니다.

2. PostgreSQL의 내장 성능 모니터링 도구

2.1. pg_stat_statements

  • 설명: PostgreSQL에서 제공하는 확장 모듈로, 데이터베이스에서 실행된 모든 SQL 문에 대한 통계를 수집합니다.
  • 주요 기능:
    • 각 쿼리의 실행 횟수, 총 실행 시간, 평균 실행 시간 등을 제공합니다.
    • 리소스 사용량이 많은 쿼리를 식별하여 성능 최적화에 활용할 수 있습니다.

2.2. pg_stat_activity

  • 설명: 현재 데이터베이스에서 실행 중인 모든 세션에 대한 정보를 제공합니다.
  • 주요 기능:
    • 세션 ID, 사용자, 클라이언트 주소, 실행 중인 쿼리 등을 확인할 수 있습니다.
    • 장시간 실행 중인 쿼리나 잠금 현상을 감지하는 데 유용합니다.

2.3. EXPLAINEXPLAIN ANALYZE

  • 설명: 쿼리의 실행 계획을 분석하여 성능 병목 지점을 파악할 수 있습니다.
  • 주요 기능:
    • 쿼리가 데이터를 어떻게 접근하고 처리하는지에 대한 정보를 제공합니다.
    • 인덱스 사용 여부, 조인 방법, 예상 실행 비용 등을 확인할 수 있습니다.

3. 외부 성능 모니터링 도구

3.1. pgAdmin

  • 설명: PostgreSQL을 위한 무료 그래픽 관리 도구로, 성능 모니터링 기능을 제공합니다.
  • 주요 기능:
    • 쿼리 편집기, 서버 모니터링, 통계 정보 조회 등을 지원합니다.
    • 사용자 친화적인 인터페이스로 쉽게 접근할 수 있습니다.

3.2. pgBadger

  • 설명: PostgreSQL의 로그 파일을 분석하여 HTML 형식의 성능 리포트를 생성합니다.
  • 주요 기능:
    • 슬로우 쿼리 분석, 오류 로그 추적, 리소스 사용량 통계 등을 제공합니다.
    • 시각화된 리포트를 통해 성능 이슈를 쉽게 파악할 수 있습니다.

3.3. pg_top

  • 설명: 리눅스의 top 명령어와 유사하게 PostgreSQL의 세션과 프로세스 정보를 실시간으로 모니터링합니다.
  • 주요 기능:
    • 세션별 CPU, 메모리 사용량, 실행 중인 쿼리 등을 확인할 수 있습니다.
    • 시스템 부하를 실시간으로 감지하고 대응할 수 있습니다.

5-2. 실시간 쿼리 모니터링 및 분석

1. pg_stat_statements 설정 및 사용

1.1. 확장 모듈 설치

pg_stat_statements는 PostgreSQL에 기본적으로 포함되어 있지만, 사용하기 위해서는 설정이 필요합니다.

postgresql.conf 파일 수정:

shared_preload_libraries = 'pg_stat_statements'
  • 설명: PostgreSQL을 재시작할 때 pg_stat_statements를 로드하도록 설정합니다.

1.2. 데이터베이스에서 확장 모듈 활성화

각 데이터베이스에서 확장 모듈을 활성화해야 합니다.

CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

1.3. 통계 정보 조회

실행된 쿼리의 통계 정보를 조회합니다.

SELECT
    queryid,
    query,
    calls,
    total_time,
    mean_time,
    rows
FROM
    pg_stat_statements
ORDER BY
    total_time DESC
LIMIT 10;
  • 설명: 총 실행 시간이 긴 상위 10개의 쿼리를 조회합니다.
  • 필드 설명:
    • queryid: 쿼리의 식별자입니다.
    • query: 쿼리 텍스트입니다.
    • calls: 쿼리 실행 횟수입니다.
    • total_time: 쿼리의 총 실행 시간입니다.
    • mean_time: 쿼리의 평균 실행 시간입니다.
    • rows: 반환된 행의 수입니다.

1.4. 통계 정보 초기화

통계 정보를 초기화하여 새로운 측정을 시작할 수 있습니다.

SELECT pg_stat_statements_reset();

2. pg_stat_activity를 통한 세션 모니터링

2.1. 현재 세션 조회

현재 데이터베이스에서 실행 중인 모든 세션을 조회합니다.

SELECT
    pid,
    usename,
    application_name,
    client_addr,
    state,
    query_start,
    query
FROM
    pg_stat_activity
WHERE
    state != 'idle';
  • 설명: 대기 상태가 아닌(active) 세션의 정보를 조회합니다.
  • 필드 설명:
    • pid: 프로세스 ID입니다.
    • usename: 데이터베이스 사용자 이름입니다.
    • application_name: 애플리케이션 이름입니다.
    • client_addr: 클라이언트 IP 주소입니다.
    • state: 세션 상태입니다. (active, idle 등)
    • query_start: 현재 쿼리가 시작된 시간입니다.
    • query: 실행 중인 쿼리 텍스트입니다.

2.2. 장시간 실행 중인 쿼리 감지

SELECT
    pid,
    now() - query_start AS duration,
    query
FROM
    pg_stat_activity
WHERE
    state = 'active'
    AND now() - query_start > interval '5 minutes';
  • 설명: 5분 이상 실행 중인 쿼리를 조회합니다.

2.3. 세션 종료

문제가 있는 세션을 강제로 종료할 수 있습니다.

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE pid = [문제가 있는 pid];
  • 주의: 세션을 종료하면 해당 세션에서 진행 중인 트랜잭션이 롤백되므로, 신중하게 사용해야 합니다.

3. 실시간 쿼리 모니터링 도구 활용

3.1. pg_top 사용

설치:

sudo apt-get install pgtop

실행:

pg_top -U [사용자명] -d [데이터베이스명]
  • 설명: 실시간으로 세션 정보를 모니터링하며, CPU, 메모리 사용량 등을 확인할 수 있습니다.

3.2. pgAdmin의 모니터링 기능 활용

  • 실시간 그래프: 서버의 활동을 그래프로 시각화하여 표시합니다.
  • 세션 정보 조회: 현재 연결된 세션과 실행 중인 쿼리를 확인할 수 있습니다.
  • 통계 정보: 테이블, 인덱스 등의 통계 정보를 제공합니다.

4. 슬로우 쿼리 로그 설정

4.1. 슬로우 쿼리 로그 활성화

postgresql.conf 파일 수정:

log_min_duration_statement = 1000
  • 설명: 1초(1000밀리초) 이상 걸리는 쿼리를 로그에 기록합니다.

4.2. 로그 파일 확인

로그 파일에서 슬로우 쿼리를 분석하여 성능 개선에 활용합니다.

5. 쿼리 성능 최적화

5.1. 인덱스 적용 여부 확인

실행 계획을 통해 인덱스 사용 여부를 확인합니다.

EXPLAIN SELECT * FROM tb_book WHERE name = '가계부1';
  • 결과 해석: Index Scan이 나타나면 인덱스를 사용하고 있는 것입니다.

5.2. 실행 계획 분석

EXPLAIN ANALYZE를 사용하여 실제 실행 시간을 확인합니다.

EXPLAIN ANALYZE SELECT * FROM tb_book WHERE name = '가계부1';
  • 주의: 개발 환경에서만 사용하며, 운영 환경에서는 사용을 지양합니다.

6. 시스템 자원 모니터링

6.1. OS 레벨 모니터링

  • top: CPU 및 메모리 사용량을 실시간으로 모니터링합니다.
  • vmstat: 메모리, 프로세스, I/O 상태를 확인합니다.
  • iostat: 디스크 I/O 상태를 모니터링합니다.

6.2. 모니터링 도구 활용

  • Prometheus & Grafana: 시간에 따른 메트릭 수집과 시각화를 통해 시스템 상태를 모니터링합니다.
  • pg_prometheus: PostgreSQL 메트릭을 Prometheus에 통합하여 모니터링할 수 있습니다.

결론

데이터베이스 성능 모니터링은 시스템의 안정성과 효율성을 유지하는 데 필수적입니다. PostgreSQL은 다양한 내장 모니터링 도구를 제공하며, 이를 활용하여 실시간으로 시스템 상태를 파악하고 성능 이슈를 조기에 발견할 수 있습니다. 또한, 외부 도구와 통합하여 보다 심층적인 분석과 시각화를 통해 문제를 해결할 수 있습니다.

성능 모니터링은 단순한 문제 발견을 넘어, 시스템 최적화와 사용자 경험 개선으로 이어집니다. 지속적인 모니터링과 성능 개선 노력을 통해 안정적이고 빠른 서비스를 제공하시기 바랍니다.


참고 자료


주의: 이 글은 학습 목적으로 작성되었으며, 실제 환경에서는 보안 및 성능에 대한 추가적인 고려가 필요합니다. 특히, 운영 환경에서의 설정 변경이나 도구 사용 시에는 사전에 충분한 검토와 테스트를 진행하시기 바랍니다.

반응형