본문 바로가기
WIKI 기술 지식 베이스

Postgres Database Monitoring 고급 설정

원문 보기 위키 갱신

Postgres용 Database Monitoring을 더 세밀하게 튜닝하는 방법을 설명드릴게요. 이 페이지에서는 많은 relation 처리, 샘플링 비율, 컬럼 통계 수집 설정을 다룹니다.

출처: 문서

본문

relation이 많은 경우 처리하기

Postgres 데이터베이스에 relation이 아주 많다면 (수천 개 수준), 해당 데이터베이스의 인스턴스 구성에 collect_database_size_metrics: false를 추가하는 것을 권장합니다. 이 설정을 끄면 에이전트가 데이터베이스 크기 통계를 수집하기 위해 pg_database_size() 함수를 실행하지 않게 되는데, 이 함수는 테이블이 많은 인스턴스에서 성능이 더 나빠요.

instances:
  - dbm: true
    ...
    collect_database_size_metrics: false

추가로, 테이블 정의가 이름만 빼고 동일하도록 데이터를 여러 테이블로 분할하면 정규화된 쿼리가 대량으로 생성될 수 있어요.

SELECT * FROM daily_aggregates_001
SELECT * FROM daily_aggregates_002
SELECT * FROM daily_aggregates_003

이런 경우 replace_digits 옵션을 사용해 이러한 쿼리를 하나의 정규화된 쿼리로 추적하세요. 그러면 해당 쿼리들의 모든 메트릭이 하나의 쿼리로 합쳐집니다.

SELECT * FROM daily_aggregates_?

Datadog Agent의 데이터베이스 인스턴스 구성에 replace_digits 옵션을 추가하세요.

instances:
  - dbm: true
    ...
    obfuscator_options:
      replace_digits: true

파티셔닝은 스키마 수집에도 영향을 줘요. 네이티브 선언형 파티셔닝 (PARTITION BY)으로 분할된 테이블은 파티션 수와 관계없이 collect_schemas의 max_tables 제한에 대해 단일 테이블로 계산됩니다. 하지만 테이블 상속 (INHERITS)을 사용해 분할한 테이블(위의 daily_aggregates_* 테이블 등)은 각 파티션을 개별적으로 계산하므로, 이 패턴을 사용하는 데이터베이스는 전체 커버리지를 위해 더 높은 max_tables 제한이 필요할 수 있어요. 자세한 내용은 스키마 수집 튜닝을 참고하세요.

샘플링 비율 높이기

비교적 빈도가 낮거나 빠르게 실행되는 쿼리가 있다면 collection_interval 값을 낮춰 explain plan을 더 자주 수집함으로써 샘플링 비율을 높여 보세요.

Datadog Agent의 데이터베이스 인스턴스 구성에서 collection_interval을 설정하세요. 기본값은 1초이고, postgres/conf.yaml.example에서 확인할 수 있어요.

값을 더 작은 간격으로 낮춰 주세요.

instances:
  - dbm: true
    ...
    query_samples:
        collection_interval: 0.1

컬럼 통계 수집 설정하기

컬럼 통계 수집은 주기적인 일정에 따라 pg_stats에서 컬럼별 통계 (n_distinct, null_frac, avg_width, correlation, most_common_freqs)를 읽어옵니다. 이를 위해서는 모니터링하는 모든 데이터베이스에 datadog.column_statistics() 함수가 존재해야 해요 — 함수 정의는 자체 호스팅 Postgres Database Monitoring 설정하기 문서를 참고하세요.

함수가 준비되면 Postgres 인스턴스 구성에서 수집을 활성화하고 튜닝하세요.

instances:
  - dbm: true
    ...
    collect_column_statistics:
      enabled: true
      collection_interval: 3600   # 수집 실행 사이의 초 단위 간격; 기본 3600 (매시간)
      max_tables: 500              # 실행당 수집할 최대 테이블 수; 기본 500
옵션 기본값 변경 시점
enabled false 컬럼 통계 수집을 활성화하려면 true로 설정하세요.
collection_interval 3600 더 빠르게 응답하는 통계가 필요하면 낮추세요 (pg_stats에 대한 쿼리가 늘어나는 대가가 따릅니다). 아주 크거나 바쁜 클러스터에서는 쿼리 부하를 줄이기 위해 높이세요.
max_tables 500 테이블이 500개 이상인 데이터베이스를 모니터링하면서 전체 커버리지를 원하면 높이고, 수집 비용을 제한하려면 낮추세요. 이 제한은 기본값이 300인 collect_schemas의 max_tables 옵션과는 별개예요.

컬럼 통계가 채워지려면, 대상 테이블에 ANALYZE(또는 autoanalyze)가 최소 한 번은 실행되어야 해요 — 수집된 통계가 없는 테이블에 대해 pg_stats는 비어 있습니다.

더 알아보기 (Learn more)