[PostgreSQL] Parallel

배배·2024년 4월 30일

PostgreSQL

목록 보기
5/6

📌 About Parallel



🔍 Worker의 개념


Session

  • 클라이언트와 DB의 연결

Process

  • os 수준에서 생성되는 개별 프로세스
  • 세션이 생기면 postgresql에서 내부적으로 process를 할당
  • 실제 클라이언트의 작업을 수행

Worker

  • process 내에서 여러 작업(parallel)을 수행하기 위한 백그라운드 프로세스
  • work 프로세스 개수는 min_parallel_size 파라미터값을 기준으로 산정



🔍 Parallel 관련 파라미터


세션 관련 파라미터

  • max_worker_processes : 시스템이 지원할 수 있는 최대 백그라운드 프로세스의 수. Standby 서버에 해당 파라미터를 설정 시에는 Primary 서버보다 크거나 같은 값을 설정해주어야 함.

  • max_parallel_workers : 병렬 작업에 사용될 수 있는 최대 worker 수를 설정. 해당 값을 변경할 때에는 병렬 처리와 관련된 파라미터들을 같이 수정해주어야 함. (max_parallel_workers_per_gather 등)

  • max_parallel_workers_per_gather : 하나의 parallel 프로세스가 생성 할 수 있는 worker 수

  • max_parallel_maintenance_workers : vaccum, index 생성과 같은 작업을 내부적으로 parallel로 수행할 때 최대 worker 개수


성능 관련 파라미터

  • parallel_setup_cost : parallel worker process가 작업 할 때 사용하는 비용의 추정값

  • parallel_tuple_cost : 병렬 작업 프로세스가 다른 프로세스에게 하나의 튜플을 전송하는 플래너의 비용 추정치. (조건절 없을때 패러럴 처리할 경우 작게 해야 함)

  • min_parallel_table_scan_size : parallel scan을 위한 테이블 데이터 최소 양

  • min_parallel_table_scan_size : parallel scan을 위한 인덱스 데이터 최소 양

  • force_parallel_mode : parallel을 강제 (하지만 더 적은 코스트가 아니면 강제되지 않음)

  • 아래와 같은 paralle 시 발생하는 cost 및 최소 데이터를 0으로 설정하여 parallel을 유도

    
    SET parallel_setup_cost to 0 ;
    SET parallel_tuple_cost to 0 ;
    SET min_parallel_table_scan_size to 0 ;
    SET min_parallel_index_scan_size to 0 ;
    SET max_parallel_workers_per_gather to DEFAULT ;
  • parallel_leader_participation : 만약 Queue를 모두 순회했지만 모든 Parallel Worker가 결과물을 전달하지 않았다면 Leader Worker에게는 두 가지 선택이 주어집니다. 첫 번째는 Leader Worker 본인이 직접 자식 실행 계획을 수행하여 결과물을 만들어 내는 것입니다. 두 번째는 Parallel Worker 중 하나라도 먼저 끝내는 Worker가 생길 때까지 대기하는 방법

    
    set parallel_leader_participation TO 0;



    🔍 Parallel 설정 예시


	SET parallel_setup_cost = 100; -- 패러럴 시작 코스트 변경
	SET force_parallel_mode = on; -- 패러럴 강제(하지만 더 적은 코스트가 아니면 강제되지 않음)
	SET parallel_tuple_cost = 0.0001; -- 패러럴 튜플 코스트 변경(조건절 없을때 패러럴 처리할 경우 작게 해야 함)
	SET max_parallel_workers_per_gather = 32;
	SET max_parallel_maintenance_workers TO 16;
	SET maintenance_work_mem TO '30 GB';



🌟 REF

profile
데이터 엔지니어

0개의 댓글