DBAtlas · 데이터베이스 운영 아틀라스

병렬 쿼리 용량 및 현재 worker 사용량 확인

PostgreSQL성능

명령어

-- Parallel worker pool settings
SELECT name, current_setting(name) AS value
FROM pg_settings
WHERE name IN ('max_worker_processes', 'max_parallel_workers', 'max_parallel_workers_per_gather',
               'max_parallel_maintenance_workers', 'parallel_setup_cost', 'parallel_tuple_cost',
               'min_parallel_table_scan_size', 'min_parallel_index_scan_size')
ORDER BY name;

-- Queries currently running in parallel and their worker counts
SELECT a.pid AS leader_pid,
       count(w.pid) AS workers_running,
       current_setting('max_parallel_workers')::int AS max_parallel_workers,
       now() - a.query_start AS runtime,
       left(a.query, 80) AS query
FROM pg_stat_activity a
JOIN pg_stat_activity w ON w.leader_pid = a.pid AND w.pid <> a.pid
GROUP BY a.pid, a.query_start, a.query
ORDER BY workers_running DESC;

-- Pin / reset the planned worker count for a single table
ALTER TABLE orders SET (parallel_workers = 4);
ALTER TABLE orders RESET (parallel_workers);

하는 일

병렬 쿼리 한도와 각 leader 프로세스가 현재 사용 중인 parallel worker 수를 보여 주고, 테이블별 worker 수 설정을 예시한다.

사용 시점

분석 쿼리가 예상보다 느리거나, 계획에 'Workers Planned' > 'Workers Launched'가 나타나거나, CPU 코어가 놀고 있을 때.

주의

max_parallel_workers는 max_worker_processes(재시작 필요)로 상한이 정해지며, 이 pool은 logical replication worker 및 기타 background worker와 공유된다. OLTP에서 max_parallel_workers_per_gather가 높으면 동시성 상황에서 CPU가 포화된다. 각 worker는 자체 work_mem도 사용한다. 데이터를 쓰거나 행을 잠그는 쿼리(CREATE TABLE AS / SELECT INTO 제외), 커서, PARALLEL UNSAFE 함수를 호출하는 쿼리는 병렬 계획을 받지 않는다. ALTER TABLE ... SET (parallel_workers)는 짧은 ShareUpdateExclusiveLock을 잡는다.

DBAtlas에서 열기 →

관련 항목