VACUUM - vacuum 파라미터 튜닝

yshjft·2024년 12월 3일
0

Postgresql

목록 보기
9/11

vacuum 파라미터 튜닝

vacuum 파라미터 튜닝의 필요성

보통 Vacuum 동작은 비용이나 부하가 많이 필요한 작업이기 때문에 ... 따라서 Vacuum 튜닝은 무작정 최대한 적게 혹은, 최대한 자주 돌도록 튜닝하는 게 아니라 Dead Tuple 정리와 Vacuum의 부하 간 적절한 균형을 찾는 것이 중요합니다. PostgreSQL Vacuum에 대한 거의 모든 것

주요 2가지

autovacuum_vacuum_scale_factor & autovacuum_vacuum_threshold

  • 큰 테이블일 수록 autovacuum으로 정리해야하는 Dead Tuple의 수가 많아집니다.
    ex) 10GB → 2GB, 1TB → 2000GB
  • 정리해야하는 Dead Tuple이 너무 많으면 부하가 너무 커지게 되므로 autovacuum이 조금 더 자주 일어날 수 있도록 변수 조정이 필요합니다.
    ex) autovacuum_vacuum_threshold = 0.2 → autovacuum_vacuum_threshold = 0.1

autovacuum_vacuum_cost_limit & autovacuum_vacuum_cost_delay

  • autovacuum_vacuum_cost_limit
    • autovacuum이 수행될 때 마다 해당 프로세스는 200의 credit을 가집니다.
    • 기본값 200
  • vacuum_cost_delay
    • autovacuum_vacuum_cost_limit만큼 프로세스가 완료되면 다음 autovacuum은 vacuum_cost_delay에 설정된 만큼 sleep 합니다.
    • 일종의 일시 중지 시간입니다.
    • 단위는 ms(밀리세컨즈)입니다.
    • 기본값 0
  • vacuum_cost_page_hit
    • shared buffer에 있는 데이터를 vacuum 할 때 마다 vacuum_cost_page_hit에 설정된 만큼 credit을 소모합니다.
    • 기본값 1
  • vacuum_cost_page_miss
    • disk에 있는 데이터를 vacuum 할 때 마다 vacuum_cost_page_miss의 credit을 소모합니다.
    • 기본값 10
  • vacuum_cost_page_dirt
    • dead tuple을 vacuum 할 때 마다 vacuum_cost_page_dirt의 credit을 소모합니다.
    • 기본값 20
  • autovacuum_vacuum_cost_limit이 너무 작으면 autovacuum이 dead tuple을 다 정리하지 못한 상태로 끝나 dead tuple이 누적되는 문제가 일어날 수 있습니다.
    • 테이블 크기가 굉장히 크면서 DELETE와 UPDATE가 빈번하게 발생하는 테이블인데 autovacuum_vacuum_cost_limit이 10이라면 dead tuple을 충분히 정리하기도 전에 새로운 dead tuple이 생겨나며 누적됩니다.
  • ※ "autovacuum_vacuum_cost_limit 만큼 vacuum → vacuum_cost_delay 만큼 sleep" 하는 패턴을 반복하여 하나의 autovacuum 프로세스가 수행되는 것으로 보입니다.

기타

autovacuum_naptime

  • autovacuum 프로세스 실행 사이의 최소 지연 시간입니다.
  • 프로세스 간 주기(간격)라고 보면될거 같습니다.
  • ex) 60s → 5s
  • ※ 주기적(autovacuum_naptime)으로 임계치를 넘었는지 확인하며 임계치를 초과한 경우 autovacuum을 수행한다고 이해하면될거 같습니다.

autovacuum_max_workers

  • 한 번에(병렬로) 실행할 수 있는 autovacuum 프로세스의 수입니다.
  • worker를 늘림으로서 높은 병렬성을 확보하여 좀 더 빠른 vacuum이 수행 가능하도록 합니다.
    • 다만 코어 수에 대한 고려가 필요합니다.

max_parallel_maintenance_workers

  • vacuum 작업의 병렬성을 높일 수 있는 또 다른 파라미터입니다.
    • index 생성 또는 vacuum 작업을 병렬로 수행할 수 있는 worker 수입니다.
    • 당연히 코어 수에 대한 고려가 필요합니다.

autovacuum_work_mem

  • 테이블을 스캔할 때 vacuum은 메모리에 Dead Tuple을 수집합니다. Dead Tuple 수는 autovacuum_work_mem (maintenance_work_mem)에 의해 결정됩니다. 해당 파라미터를 통해 한번에 더 많은 Dead Tuple이 수집될 수 있도록 할 수 있습니다.
    • 당연히 메모리를 고려하여 설정해야 합니다.
  • autovacuum_work_mem

    VACUUM, CREATE INDEX 및 ALTER TABLE ADD FOREIGN KEY 같은 유지보수 명령에서 사용되는 최대 메모리 양을 지정한다. ... autovacuum 실행 시 이 메모리에서 autovacuum_max_workers의 배수로 할당할 수 있으므로 기본값을 너무 높게 설정하지 않도록 해야 한다. autovacuum_work_mem을 별도 설정하여 이것을 관리하는 것이 유용할 수 있다.
    19.4 리소스 소비

정리

autovacuum이 너무 드물게 돈다...

  • autovacuum_vacuum_scale_factor & autovacuum_vacuum_scale_threshold
  • autovacuum_vacuum_insert_scale_factor & autovacuum_vacuum_scale_threshold

autovacuum이 너무 느리다...

  • autovacuum_vacuum_cost_delay
  • autovacuum_vacuum_cost_limit
  • autovacuum_naptime
  • autovacuum_max_workers
  • autovacuum_work_mem
  • max_parallel_maintenance_workers
profile
꾸준히 나아가자 🐢

0개의 댓글