PostgreSQL DB에서 높은 CPU 사용률을 조사하기 위한 세 가지 쿼리
CPU 사용률은 PostgreSQL DB(데이터베이스) 인스턴스를 확인하는 중요한 메트릭 중 하나입니다. CPU 사용률을 확인하면 PostgreSQL DB에 성능 문제가 있는지 이해할 수 있습니다.
PostgreSQL DB 인스턴스의 CPU가 높으면 문제의 근본 원인을 찾는 것이 중요합니다. 잘못 작성되고, 너무 자주, 너무 무거운 쿼리, 많은 수의 연결 및 워크로드에 적합하지 않은 인프라가 있을 수 있습니다.
이 게시물에서는 높은 CPU 사용률을 조사하기 위해 PostgreSQL DB 인스턴스에서 실행할 수 있는 세 가지 SQL 쿼리에 대해 설명합니다. CPU 사용률에 영향을 미치는 데이터베이스 인스턴스에서 실행 중인 항목을 이해하는 데 도움이 될 수 있습니다.
쿼리 #1:
5초 이상 걸리는 활성 실행 PostgreSQL 세션을 런타임별로 내림차순으로 정렬하여 나열합니다.
select
now()-query_start as runtime,
pid as process_id,
datname,
client_addr,
client_hostname,
query
from pg_stat_activity
where state!='idle'
and now() - query_start > '5 seconds'::interval
order by 1 desc;
결과 집합에는 각 장기 실행 쿼리에 대한 해당 런타임, 프로세스 ID, 데이터베이스 이름, 클라이언트 주소 및 호스트 이름이 포함됩니다.
일부 시나리오에서는 장기 실행 쿼리로 인해 CPU 사용률이 높아질 수 있습니다. 이러한 경우 제대로 분석하고 조정해야 합니다.
다음 명령을 실행하여 세션을 종료하려면:
select pg_terminate_backend(<process_id);
쿼리 #2:
가장 빈번한 PostgreSQL 쿼리를 나열합니다.
with
a as (select dbid, queryid, query, calls s from pg_stat_statements),
b as (select dbid, queryid, query, calls s from pg_stat_statements, pg_sleep(1))
select
(select datname from pg_database where oid=a.dbid) db_name,
substr(a.query, 1, 400) as the_query,
sum(b.s-a.s) as runs_per_second
from a,b
where a.dbid= b.dbid and a.queryid = b.queryid
group by 1, 2
order by 3 desc;
이 결과 집합에는 쿼리 목록과 해당 빈도(각 쿼리가 초당 실행되는 횟수)가 포함됩니다. 오래 실행되는 쿼리는 아니지만 초당 수백/수천 번 실행되는 매우 빈번한 쿼리는 높은 CPU 사용률을 유발할 수 있습니다.
쿼리 #3:
이 쿼리는 각 데이터베이스의 각 쿼리가 차지하는 CPU 부분을 백분율로 확인합니다. 쿼리는 CPU를 가장 많이 사용하는 쿼리별로 정렬된 결과 집합을 제공합니다.
PostgreSQL 버전이 최대 12인 경우:
SELECT
userid,
dbid,
(select datname from pg_database where oid=dbid) db_name,
round(total_time::numeric, 2) AS total_time,
calls,
round(mean_time::numeric, 2) AS mean,
round((100 * total_time / sum(total_time::numeric) OVER ())::numeric, 2) AS cpu_portion_pctg,
query
FROM pg_stat_statements
ORDER BY total_time
DESC LIMIT 30;
13부터 시작하는 PostgreSQL 버전의 경우:
SELECT
userid,
dbid,
(select datname from pg_database where oid=dbid) db_name,
round((total_exec_time + total_plan_time)::numeric, 2) AS total_time,
calls,
round((mean_exec_time+mean_plan_time)::numeric, 2) AS mean,
round((100 * (total_exec_time + total_plan_time) / sum((total_exec_time + total_plan_time)::numeric) OVER ())::numeric, 2) AS cpu_portion_pctg,
query
FROM pg_stat_statements
ORDER BY (total_exec_time + total_plan_time)
DESC LIMIT 30;
쿼리 대신 "권한 부족"이 표시되는 경우 다음 명령을 실행해야 합니다.
GRANT pg_read_all_stats TO <db_user>;
쿼리 #2와 쿼리 #3은 PostgreSQL의 pg_stat_statements 확장을 기반으로 합니다. pg_stat_statements 확장을 사용하면 PostgreSQL DB 인스턴스에서 실행되는 상위/모든 SQL 문에 대한 통계를 추적할 수 있습니다. 쿼리를 실행하기 전에 PostgreSQL DB 인스턴스에 대해 pg_stat_statements를 활성화해야 합니다.
Reference
이 문제에 관하여(PostgreSQL DB에서 높은 CPU 사용률을 조사하기 위한 세 가지 쿼리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/dm8ry/the-three-queries-to-investigate-high-cpu-utilization-in-postgresql-dbs-28jb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)