Vacuum分析
Vacuum分析は、Top オブジェクトで提供するBloating、Dead Tuple、Ageなどの情報をVacuum観点で視覚的に再構成した画面です。Summaryカード、Top 5チャート、Vacuum実行履歴などを通じて、インスタンスのVacuum状態を一目で把握できます。
-
Vacuum Health Summaryを通じて、インスタンスの全体的なVacuumの健全性を素早く把握できます。
-
Table Analysisで、Dead TupleとBloat Sizeを基準に管理が必要なテーブルを識別できます。
-
Vacuum Execution Historyを通じて、Vacuum実行パターンと履歴を時系列で確認できます。
Vacuumとは?
PostgreSQLはMVCC(Multi-Version Concurrency Control)方式を使用するため、UPDATEやDELETEを実行しても既存のRowは即座に削除されずDead Tupleとして残ります。VacuumはこのようなDead Tupleをクリーンアップして、ディスク空間を再利用できるようにするメンテナンス作業です。
Vacuumが適切なタイミングで実行されないと、以下の問題が発生する可能性があります。
-
テーブルBloatの増加: 不必要な空間が増え、ディスク使用量の増加とクエリパフォーマンスの低下が発生
-
Transaction ID Wraparound: Transaction Ageが限界に達すると、データ損傷防止のためDBが自動的に書き込みを停止するセーフガードが作動
事前設定
DB設定
エージェントがスキーマ情報を照会できるように、モニタリングアカウントに権限を付与します。
-- スキーマアクセス権限の付与
GRANT USAGE ON SCHEMA {schema_name} TO {DB_User};
-- 既存テーブルへの照会権限の付与
GRANT SELECT ON ALL TABLES IN SCHEMA {schema_name} TO {DB_User};
-- 今後作成されるテーブルへの照会権限の自動付与
ALTER DEFAULT PRIVILEGES FOR USER {owner_name} IN SCHEMA {schema_name} GRANT SELECT ON TABLES TO {DB_User};
| 構文 | 説明 |
|---|---|
GRANT USAGE ON SCHEMA | スキーマにアクセスできる権限を付与します。 |
GRANT SELECT ON ALL TABLES IN SCHEMA | スキーマ内の既存テーブルへの照会権限を付与します。 |
ALTER DEFAULT PRIVILEGES ... GRANT SELECT | 今後そのスキーマに新しく作成されるテーブルにも自動的に照会権限が付与されます。 |
エージェント設定
whatap.confで以下の設定を確認します。pg_objectのデフォルト値はtrueのため、別途設定なしで収集されます。
pg_object=true
| 設定項目 | タイプ | デフォルト値 | 説明 |
|---|---|---|---|
pg_object | boolean | true | Top オブジェクトの情報収集有無を設定します。デフォルト値はtrueです。 |
pg_object_hour | int | 5 | Top オブジェクトの情報を収集する時刻を設定します。デフォルト値は5で、午前5時に収集を開始します。 |
データ収集ソース
Vacuum分析画面のデータはPostgreSQLのシステムカタログと統計ビューから収集されます。
| セクション | 主なソース | 備考 |
|---|---|---|
| Dead Tuples | pg_class、pg_namespace | pg_stat_get_live_tuples()、pg_stat_get_dead_tuples()関数でTuple数を照会します。 |
| Top Bloat Size | pg_class、pg_stats、pg_stat_user_tables | カラム統計(null_frac、avg_width)に基づいてBloatサイズを推定計算します。 |
| Transaction Age | pg_catalog.pg_database、pg_catalog.pg_settings | age(datfrozenxid)でデータベース別Transaction Ageを計算し、autovacuum_freeze_max_age設定と比較します。 |
| Vacuum Execution History | pg_stat_progress_vacuum、pg_stat_activity | 実行中のVacuumの進行状態、待ちイベント、クエリ情報を照会します。 |
Vacuumを分析する
Vacuum関連指標に基づいてテーブルの状態とメンテナンスの必要性を分析できます。主な指標は以下の通りです。
基本オプション
上部フィルター領域で時間、対象インスタンスを設定できます。
-
時間: 照会する日付を選択します。
-
インスタンス: 照会対象のDBインスタンスを選択します。
Vacuum Health Summary
インスタンスのVacuum関連の重要指標を3つのSummaryカードで提供します。Dead TuplesとTop Bloat Sizeは1日に1回収集され(pg_object_hour設定時刻基準)、カードタイトル横の括弧内に収集時刻が表示されます。下部のTable Analysisデータも同じ時刻に収集されます。
| カード | 説明 |
|---|---|
| Dead Tuples | 全Dead Tuple数とデータベース別分布を表示します。 |
| Top Bloat Size | 最大のテーブルBloatサイズ(MB)とデータベース別分布を表示します。 |
| Transaction Age | 最も古いトランザクションのAgeと全体限界に対する割合(%)を表示します。データベース別の割合も確認できます。 |
Dead Tuples
Dead Tuple数が高い場合、Vacuumが適切なタイミングで実行されていない可能性があります。データベース名をクリックすると、下部のTable AnalysisのDead Tuple Top 5が該当データベースでフィルタリングされます。
Dead Tuplesが高い場合
-
VACUUM テーブル名;を実行 -
Dead Tuplesはクエリパフォーマンスの低下とディスク使用量増加の原因になります。
-
設定でAutovacuumの有効化の有無、閾値が高すぎないかを確認してください。
Top Bloat Size
Bloatとは、Dead Tupleなどによってテーブルが実際のデータに対して過度に大きい状態を意味します。Bloatが大きいと不必要なディスク空間を占め、シーケンシャルスキャンのパフォーマンスが低下します。データベース名をクリックすると、下部のTable AnalysisのBloat Size Top 5が該当データベースでフィルタリングされます。
Bloat Sizeが高い場合
-
VACUUM FULL テーブル名;を実行 -
VACUUM FULLはテーブルロックが発生するため、業務時間外での実行を推奨します。
-
Bloatがひどいとクエリパフォーマンスの低下、インデックス非効率、ディスク浪費が発生します。
-
Autovacuumの設定、UPDATE/DELETEパターン、HOT Update可能かどうかも合わせて確認してください。
-
pg_repackを使用するとテーブルロックなしで空間回収が可能です。
Transaction Age
PostgreSQLのTransaction IDは約20億(2 billion)個を使用できます。Transaction Ageがこの限界に近づくとXID Wraparoundが発生し、データ損傷防止のためDBが強制終了される可能性があります。
- エージェントバージョンv2.59.01以上が必要で、5秒間隔で収集されます。
Transaction Ageが高い場合
-
VACUUM FREEZE データベース名;を実行 -
Transaction IDが20億(2 billion)を超えるとXID wraparoundが発生し、データ損傷防止のためDBが強制終了される可能性があります。
-
必ず原因を把握して解決してください。
- 長時間実行されているトランザクション
- 未処理のReplication Slot
- Disabled autovacuumなど
閾値設定
画面右上の閾値設定ボタンをクリックすると、Dead TuplesとBloat Sizeの閾値を設定できます。閾値を設定すると、現在設定された値が上部に表示され、閾値を超えたカードは背景色が変更されて異常状態をすぐに認識できます。設定を解除するには、閾値設定ウィンドウで設定解除ボタンをクリックします。
| 指標 | 設定項目 | 説明 |
|---|---|---|
| Dead Tuples | Warning ≥ | 警告レベルのDead Tuple数 |
| Critical ≥ | 危険レベルのDead Tuple数 | |
| Bloat Size (GB) | Warning ≥ | 警告レベルのBloatサイズ(GB) |
| Critical ≥ | 危険レベルのBloatサイズ(GB) |
-
Warning超過時:カードの背景がオレンジ色に変更されます。
-
Critical超過時:カードの背景が赤色に変更されます。
Table Analysis
テーブル単位でVacuum関連指標を分析できるTop 5チャートを提供します。
Dead Tuple Top 5
Dead Tupleが最も多い上位5つのテーブルを水平棒グラフで表示します。テーブル名はdatabase.schema.table形式で表示されます。
-
Dead Tupleが多いテーブルはVacuumが必要な状態です。
-
フィルターおよびテーブルビュー切り替えボタンで詳細データを確認できます。
Bloat Size Top 5
Bloat Sizeが最も大きい上位5つのテーブルを水平棒グラフで表示します。単位はバイトです。
-
Bloat Sizeが大きいテーブルは
VACUUM FULLまたはpg_repackなどで空間を回収することを検討できます。 -
フィルターおよびテーブルビュー切り替えボタンで詳細データを確認できます。
Vacuum Execution History
選択した期間中のVacuum実行履歴を時系列チャートで表示します。
-
Vacuumが定期的に実行されているか、特定の時間帯に集中して実行されているかのパターンを把握できます。
-
Vacuum実行がない区間が長い場合は、Autovacuumの設定を確認する必要があります。
Vacuum & Analyze History
チャートで特定の時間帯をクリックすると下部にVacuum & Analyze Historyテーブルが表示され、該当時間帯(1時間単位)に実行されたVacuumおよびAnalyze作業の詳細を確認できます。
| カラム | 説明 |
|---|---|
Time | Vacuum/Analyze実行時刻 |
Database | 対象データベース名 |
Phase | Vacuum実行フェーズ(例:scanning heap、vacuuming indexesなど) |
PID | Vacuumを実行したプロセスID |
Query | 実行されたVacuum/Analyzeクエリ |
Heap Scanned | スキャンしたHeapブロック数 |
Heap Total | 全Heapブロック数 |
Heap Vacuumed | Vacuum処理したHeapブロック数 |
Index Vacuum | インデックスVacuum実行回数 |
Max Dead Tuples | 一度に処理できる最大Dead Tuple数 |
Dead Tuples | 発見されたDead Tuple数 |
Runtime | Vacuum実行時間 |
Scanned % | 全Heapに対するスキャン割合 |
Vacuumed % | 全Heapに対するVacuum処理割合 |
Wait Event | 待ちイベント名 |
Wait Event Type | 待ちイベントタイプ |
Configuration
現在のDBインスタンスに設定されているVacuum関連パラメータを参考用に表示します。PostgreSQLの様々なDBパラメータのうちVacuumに関連する項目のみを選別して表示するため、Autovacuumの動作やI/Oコスト設定をDB接続なしで直接確認できます。
AUTOVACUUM SETTINGS
| パラメータ | 説明 |
|---|---|
autovacuum | Autovacuumデーモンの有効化の有無 |
autovacuum_max_workers | 同時に実行できるAutovacuumワーカープロセスの最大数 |
autovacuum_naptime | Autovacuum実行間隔(単位:秒) |
autovacuum_vacuum_threshold | Vacuumをトリガーするための最小Dead Tuple数 |
autovacuum_vacuum_scale_factor | Vacuumトリガーのためのテーブルサイズに対するDead Tuple比率 |
autovacuum_vacuum_cost_delay | AutovacuumのI/Oコスト遅延時間(単位:ミリ秒) |
autovacuum_vacuum_cost_limit | Autovacuumが一時停止する前までに蓄積できるI/Oコストの上限 |
Autovacuumはautovacuum_vacuum_threshold + autovacuum_vacuum_scale_factor × テーブルRow数分のDead Tupleが発生すると、該当テーブルにVacuumを実行します。
I/O IMPACT SETTINGS
| パラメータ | 説明 |
|---|---|
vacuum_cost_page_hit | 共有バッファでページが見つかった場合のコスト |
vacuum_cost_page_miss | ディスクからページを読み取る必要がある場合のコスト |
vacuum_cost_page_dirty | ページを変更(dirty)する際のコスト |
データ解釈ガイド
主な指標の解釈
| 指標 | 正常 | 注意 | 危険 |
|---|---|---|---|
| Dead Tuples | テーブルに対して少量 | 継続的に増加傾向 | 大量蓄積、Vacuum未実行 |
| Bloat Size | テーブルサイズの20%以下 | テーブルサイズの20〜50% | テーブルサイズの50%超過 |
| Transaction Age | 5%以下 | 50%以上 | 80%以上 → 即時対応が必要 |
対処が必要な状況
-
Dead Tupleが継続的に増加
Autovacuumがワークロードに追いつけていない →
autovacuum_vacuum_scale_factorを下げる、autovacuum_max_workersを増やす -
Bloat Sizeが大きいテーブル
通常のVacuumでは空間がOSに返されない →
VACUUM FULLまたはpg_repackを検討(注意:VACUUM FULLはテーブルロックが発生) -
Transaction Age比率が高い
Vacuumが古いトランザクションをクリーンアップできていない → 長時間維持されているトランザクションを確認、手動
VACUUM FREEZEの実行を検討 -
Vacuum Execution Historyに空白区間
Autovacuumが無効化されているか、ワーカーが不足して実行されていない → Autovacuum設定を確認