本文へスキップ

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_objectbooleantrueTop オブジェクトの情報収集有無を設定します。デフォルト値はtrueです。
pg_object_hourint5Top オブジェクトの情報を収集する時刻を設定します。デフォルト値は5で、午前5時に収集を開始します。

データ収集ソース

Vacuum分析画面のデータはPostgreSQLのシステムカタログと統計ビューから収集されます。

セクション主なソース備考
Dead Tuplespg_classpg_namespacepg_stat_get_live_tuples()pg_stat_get_dead_tuples()関数でTuple数を照会します。
Top Bloat Sizepg_classpg_statspg_stat_user_tablesカラム統計(null_fracavg_width)に基づいてBloatサイズを推定計算します。
Transaction Agepg_catalog.pg_databasepg_catalog.pg_settingsage(datfrozenxid)でデータベース別Transaction Ageを計算し、autovacuum_freeze_max_age設定と比較します。
Vacuum Execution Historypg_stat_progress_vacuumpg_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 TuplesWarning ≥警告レベルの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作業の詳細を確認できます。

カラム説明
TimeVacuum/Analyze実行時刻
Database対象データベース名
PhaseVacuum実行フェーズ(例:scanning heap、vacuuming indexesなど)
PIDVacuumを実行したプロセスID
Query実行されたVacuum/Analyzeクエリ
Heap ScannedスキャンしたHeapブロック数
Heap Total全Heapブロック数
Heap VacuumedVacuum処理したHeapブロック数
Index VacuumインデックスVacuum実行回数
Max Dead Tuples一度に処理できる最大Dead Tuple数
Dead Tuples発見されたDead Tuple数
RuntimeVacuum実行時間
Scanned %全Heapに対するスキャン割合
Vacuumed %全Heapに対するVacuum処理割合
Wait Event待ちイベント名
Wait Event Type待ちイベントタイプ

Configuration

現在のDBインスタンスに設定されているVacuum関連パラメータを参考用に表示します。PostgreSQLの様々なDBパラメータのうちVacuumに関連する項目のみを選別して表示するため、Autovacuumの動作やI/Oコスト設定をDB接続なしで直接確認できます。

AUTOVACUUM SETTINGS

パラメータ説明
autovacuumAutovacuumデーモンの有効化の有無
autovacuum_max_workers同時に実行できるAutovacuumワーカープロセスの最大数
autovacuum_naptimeAutovacuum実行間隔(単位:秒)
autovacuum_vacuum_thresholdVacuumをトリガーするための最小Dead Tuple数
autovacuum_vacuum_scale_factorVacuumトリガーのためのテーブルサイズに対するDead Tuple比率
autovacuum_vacuum_cost_delayAutovacuumのI/Oコスト遅延時間(単位:ミリ秒)
autovacuum_vacuum_cost_limitAutovacuumが一時停止する前までに蓄積できる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 Age5%以下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設定を確認

Top オブジェクトを活用した分析

Vacuum分析はTop オブジェクトで提供するBloatingDead TupleAge情報をVacuum観点で視覚的に再構成した画面です。両画面は同じデータ(pg_object_hour時刻に収集)を基にしていますが、分析目的に応じて異なる観点を提供します。

比較項目Vacuum分析Top オブジェクト
分析観点Vacuumメンテナンス中心オブジェクト(テーブル/インデックス)中心
データ範囲Bloating、Dead Tuple、Age + Vacuum実行履歴Bloating、Scan、DML、Analyze Time、Age、Dead Tupleなど6種類
表現方式Summaryカード + Top 5チャート + 時系列履歴ソート可能なテーブルリスト(Top N)
固有機能Vacuum Health Summary、Vacuum実行履歴、閾値アラート、DBパラメータ照会Scan/DML分析、Object Detail、インデックス分析

活用ガイド

Tips
  • 全体的なVacuum状態の把握が目的であれば → Vacuum分析画面でSummaryカードとTop 5チャートで素早く現状を確認してください。

  • 特定テーブルの詳細分析が必要であれば → Top オブジェクト画面でさまざまなタブとソート基準で細かく分析して���ださい。

  • Vacuumが必要なテーブルを識別した後の原因分析には、両画面を合わせて活用すると効果的です。