다음을 통해 공유


Azure Database for PostgreSQL에서 높은 CPU 사용률 문제 해결 - 유연한 서버

적용 대상: Azure Database for PostgreSQL - 유연한 서버

이 문서에서는 높은 CPU 사용률의 근본 원인을 빠르게 식별하는 방법과 Azure Database for PostgreSQL 유연한 서버를 사용할 때 CPU 사용률을 제어할 수 있는 가능한 수정 작업을 보여 줍니다.

이 문서에서는 다음에 대해 알아봅니다.

  • 근본 원인을 완화하기 위한 권장 사항을 식별하고 가져오는 문제 해결 가이드에 대해 설명합니다.
  • Azure Metrics, 쿼리 데이터 저장소 및 pg_stat_statements와 같은 높은 CPU 사용률을 식별하기 위한 도구 관련 정보
  • 장기 실행 쿼리 및 총 연결 수와 같은 근본 원인을 식별하는 방법
  • 분석 설명, 연결 풀링 및 진공 테이블을 사용하여 높은 CPU 사용률을 해결하는 방법

문제 해결 가이드

Azure Database for PostgreSQL 유연한 서버 포털에서 사용할 수 있는 기능 문제 해결 가이드를 사용하여 높은 CPU 시나리오 완화에 대한 가능한 근본 원인 및 권장 사항을 찾을 수 있습니다. 이를 사용하도록 문제 해결 가이드를 설정하는 방법은 설정 문제 해결 가이드를 따르세요.

높은 CPU 사용률 식별 도구

높은 CPU 사용률을 식별하려면 이러한 도구를 고려하세요.

Azure Metrics

Azure Metrics는 한정된 날짜 및 기간에 CPU 사용률을 확인하기 위한 좋은 시작점입니다. Metrics는 CPU 사용률이 높은 기간 중 이에 대한 정보를 제공합니다. 쓰기 IOPs, 읽기 IOPs, 읽기 처리량 및 쓰기 처리량을 CPU 사용률과 비교하여 워크로드로 인해 CPU 사용이 높아진 경우를 파악합니다. 사전 모니터링을 위해 Metrics에 경고를 구성할 수 있습니다. 단계별 지침은 Azure Metrics를 참조하세요.

쿼리 저장소

쿼리 데이터 저장소는 쿼리 및 런타임 통계의 기록을 자동으로 캡처하고 검토를 위해 보존합니다. 시간별 사용 패턴을 볼 수 있도록 데이터를 시간별로 분할합니다. 모든 사용자, 데이터베이스 및 쿼리에 대한 데이터는 Azure Database for PostgreSQL 유연한 서버 인스턴스의 azure_sys라는 데이터베이스에 저장됩니다. 단계별 지침은 쿼리 저장소를 참조하세요.

pg_stat_statements

pg_stat_statements 확장은 서버 시간을 소비하는 쿼리를 식별하는 데 도움이 됩니다.

평균 실행 시간

Postgres 버전 13 이상의 경우 다음 문을 사용하여 평균 실행 시간 기준 상위 5개 SQL 문을 확인합니다.

SELECT userid::regrole, dbid, query, mean_exec_time
FROM pg_stat_statements
ORDER BY mean_exec_time
DESC LIMIT 5;

총 실행 시간

다음 문을 실행하여 총 실행 시간 기준 상위 5개 SQL 문을 확인합니다.

Postgres 버전 13 이상의 경우 다음 문을 사용하여 총 실행 시간 기준 상위 5개 SQL 문을 확인합니다.

SELECT userid::regrole, dbid, query
FROM pg_stat_statements
ORDER BY total_exec_time
DESC LIMIT 5;

근본 원인 식별

CPU 소비 수준이 전반적으로 높으면 다음과 같은 근본 원인이 있을 수 있습니다.

장기 실행 트랜잭션

장기 실행 트랜잭션은 CPU 리소스를 소비하여 높은 CPU 사용률로 이어질 수 있습니다.

다음 쿼리는 가장 오랫동안 실행 중인 연결을 식별하는 데 도움이 됩니다.

SELECT pid, usename, datname, query, now() - xact_start as duration
FROM pg_stat_activity
WHERE pid <> pg_backend_pid() and state IN ('idle in transaction', 'active')
ORDER BY duration DESC;

총 연결 수 및 상태별 연결 수

데이터베이스 연결 수가 많은 것도 CPU 및 메모리 사용률 증가로 이어질 수 있는 하나의 문제입니다.

다음 쿼리는 상태별 연결 수에 대한 정보를 제공합니다.

SELECT state, count(*)
FROM  pg_stat_activity
WHERE pid <> pg_backend_pid()
GROUP BY 1 ORDER BY 1;

높은 CPU 사용률 해결

분석 설명, PG 바운서, 연결 풀링을 사용하고 장기 실행 트랜잭션을 종료하여 높은 CPU 사용률을 해결합니다.

분석 설명 사용

장기 실행 쿼리가 확인된 다음에는 EXPLAIN을 사용해서 쿼리를 더 조사하고 튜닝합니다.
EXPLAIN 명령에 대한 자세한 내용은 계획 설명을 참조하세요.

PGBouncer 및 연결 풀링

유휴 연결이 많거나 CPU를 소비하는 연결이 많은 상황에서는 PgBouncer와 같은 연결 풀러를 사용하는 것이 좋습니다.

PgBouncer에 대한 자세한 내용은 다음을 검토하세요.

연결 풀러

최선의 구현 방법

Azure Database for PostgreSQL 유연한 서버는 기본 제공 연결 풀링 솔루션으로 PgBouncer를 제공합니다. 자세한 내용은 PgBouncer를 참조하세요.

장기 실행 트랜잭션 종료

선택적으로 장기 실행 트랜잭션을 종료하는 것도 고려할 수 있습니다.

세션 PID를 종료하려면 다음 쿼리를 사용하여 PID를 검색해야 합니다.

SELECT pid, usename, datname, query, now() - xact_start as duration
FROM pg_stat_activity
WHERE pid <> pg_backend_pid() and state IN ('idle in transaction', 'active')
ORDER BY duration DESC;

또한 usename(사용자 이름), datname(데이터베이스 이름) 등과 같은 다른 속성으로 필터링할 수 있습니다.

세션의 PID가 있으면 다음 쿼리를 사용하여 종료할 수 있습니다.

SELECT pg_terminate_backend(pid);

진공 및 테이블 통계 모니터링

테이블 통계를 최신 상태로 유지하면 쿼리 성능을 향상시키는 데 도움이 됩니다. 정기적인 자동 진공이 수행되는지 여부를 모니터링합니다.

다음 쿼리는 진공이 필요한 테이블을 식별하는 데 도움이 됩니다.

select schemaname,relname,n_dead_tup,n_live_tup,last_vacuum,last_analyze,last_autovacuum,last_autoanalyze
from pg_stat_all_tables where n_live_tup > 0;

last_autovacuumlast_autoanalyze 열은 테이블이 마지막으로 자동 진공되었거나 분석된 날짜 및 시간을 제공합니다. 테이블을 정기적으로 진공 상태가 되지 않는 경우 자동 진공 단계를 수행합니다. 자동 진공 문제 해결 및 튜닝에 대한 자세한 내용은 자동 진공 문제 해결을 참조하세요.

단기 솔루션은 느린 쿼리가 발견된 테이블에 대해 수동 진공 분석을 수행하는 것입니다.

vacuum analyze <table_name>;