다음을 통해 공유


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

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

이 문서에서는 CPU 사용률이 높은 근본 원인을 식별하는 방법을 설명합니다. 또한 Azure Database for PostgreSQL 유연한 서버를 사용할 때 CPU 사용량을 제어하기 위한 가능한 시정 조치를 제공합니다.

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

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

문제 해결 가이드

문제 해결 가이드를 사용하면 CPU 사용량이 높은 시나리오의 근본 원인을 파악하고 발견된 문제를 완화하기 위한 권장 사항을 읽어볼 수 있습니다.

문제 해결 가이드를 설정하고 사용하는 방법을 알아보려면 설정 문제 해결 가이드를 따릅니다.

높은 CPU 사용률 식별 도구

다음 도구 목록을 사용하여 높은 CPU 사용률을 파악하는 것이 좋습니다.

Azure 지표

Azure Metrics는 특정 기간 동안의 CPU 사용률을 확인하기 위한 좋은 시작점입니다. 메트릭은 CPU 사용률이 높은 기간 동안 사용된 리소스에 대한 정보를 제공합니다. 쓰기 IOPs, 읽기 IOPs, 읽기 처리량 바이트/초, 쓰기 처리량 바이트/초의 그래프를 CPU 백분율과 비교하여 워크로드로 인해 CPU 사용량이 높은 시간을 파악합니다.

사전 모니터링을 위해 Metrics에 경고를 구성할 수 있습니다. 단계별 지침은 Azure Metrics를 참조하세요.

쿼리 저장소

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

쿼리 저장소는 대기 이벤트 정보와 쿼리 런타임 통계의 상관 관계를 파악할 수 있습니다. 쿼리 저장소를 사용하여 관심 기간 동안 CPU 사용량이 높은 쿼리를 식별합니다.

자세한 내용은 쿼리 저장소를 참조하세요.

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 state
ORDER BY state ASC;

높은 CPU 사용률 해결

EXPLAIN ANALYZE를 사용하고, 기본 제공된 PgBouncer 연결 풀러를 사용하는 것을 고려하고, 장기 실행 트랜잭션을 종료하여 높은 CPU 사용률을 해결합니다.

분석 설명 사용

CPU를 더 많이 사용하는 쿼리를 알게 되면 EXPLAIN ANALYZE를 사용하여 해당 쿼리를 자세히 조사하고 조정합니다.

EXPLAIN ANALYZE 명령에 대한 자세한 내용은 해당 설명서를 검토합니다.

PgBouncer, 기본 제공된 연결 풀러

수명이 짧은 연결이 많거나 대부분의 기간 동안 유휴 상태로 남아 있는 연결이 많은 상황에서는 PgBouncer와 같은 연결 풀러를 사용하는 것이 좋습니다.

PgBouncer에 대한 자세한 내용은 연결 풀러PostgreSQL을 사용한 연결 처리 모범 사례를 참조하세요.

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>;