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는 비어 있습니다.