Azure Database for PostgreSQL에서 높은 CPU 사용률 문제 해결 - 유연한 서버
적용 대상: Azure Database for PostgreSQL - 유연한 서버
이 문서에서는 높은 CPU 사용률의 근본 원인을 식별하는 방법을 설명합니다. 또한 Azure Database for PostgreSQL 유연한 서버를 사용할 때 CPU 사용률을 제어하는 가능한 수정 작업을 제공합니다.
이 문서에서는 다음에 대해 알아봅니다.
- 근본 원인을 완화하기 위한 권장 사항을 식별하고 가져오는 문제 해결 가이드에 대해 설명합니다.
- Azure 메트릭, 쿼리 저장소 및 pg_stat_statements 같은 높은 CPU 사용률을 식별하는 도구 정보입니다.
- 장기 실행 쿼리 및 총 연결 수와 같은 근본 원인을 식별하는 방법
- EXPLAIN ANALYZE, 연결 풀링 및 진공 테이블을 사용하여 높은 CPU 사용률을 해결하는 방법입니다.
문제 해결 가이드
문제 해결 가이드를 사용하여 높은 CPU 시나리오의 가능한 근본 원인을 식별하고 권장 사항을 읽어 찾은 문제를 완화할 수 있습니다.
문제 해결 가이드를 설정하고 사용하는 방법을 알아보려면 설치 문제 해결 가이드를 따르 세요.
높은 CPU 사용률 식별 도구
높은 CPU 사용률을 식별하기 위해 다음 도구 목록을 사용하는 것이 좋습니다.
Azure 메트릭
Azure 메트릭은 특정 기간 동안 CPU 사용률을 확인하는 좋은 시작점입니다. 메트릭은 CPU 사용률이 높은 기간 동안 사용된 리소스에 대한 정보를 제공합니다. 쓰기 IOP, 읽기 IOP, 읽기 처리량 바이트/초 및 쓰기 처리량 바이트/초의 그래프를 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 사용률을 해결하는 것이 좋습니다.
EXPLAIN ANALYZE 사용
더 많은 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;
(사용자 이름), (데이터베이스 이름) datname
등의 다른 속성 usename
으로 필터링할 수도 있습니다.
세션의 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_autovacuum
및 last_autoanalyze
열은 테이블이 마지막으로 자동 진공되었거나 분석된 날짜 및 시간을 제공합니다. 테이블을 정기적으로 진공 상태가 되지 않는 경우 자동 진공 단계를 수행합니다.
자동 진공 문제 해결 및 튜닝에 대한 자세한 내용은 자동 진공 문제 해결을 참조하세요.
단기 솔루션은 느린 쿼리가 발견된 테이블에 대해 수동 진공 분석을 수행하는 것입니다.
VACUUM ANALYZE <table>;
Azure Database for PostgreSQL 제품 팀과 제안 및 버그를 공유합니다.