概要
PostgreSQL の track_io_timing はデータベースによる I/O 待機の記録を有効にし、各種統計(pg_stat_* 系)や EXPLAIN などで参照できるようにする設定です。ですが、プラットフォームによっては深刻な負荷の原因になるとし、デフォルトでは無効となっています。
pgsql-hackers でもデフォルトで有効にすることが議論されましたが、プラットフォーム依存のオーバーヘッド懸念が指摘され、少なくとも当該スレッドではデフォルト変更に至っていません。
PostgreSQL: track_io_timing default setting
そこで、track_io_timing がパフォーマンスにどれほど影響を与えるのか、Hyper-V 上の Rocky Linux + PostgreSQL 18.2 で測定した一例を示します。
検証環境
Windows 11 マシンの Hyper-V 環境で検証しました。
ホスト
| プロセッサ | Intel Core i5-14500 |
|---|---|
| メモリー | 32 GB |
| OS | Windows 11 Pro 25H2 |
Hyper-V
| プロセッサ | 10個の仮想プロセッサ |
|---|---|
| メモリー | 8 GB |
| OS | Rocky Linux release 9.7 |
| DB | PostgreSQL 18.2 |
検証
検証方針
track_io_timing パラメータの説明を抜粋します。
データベースによるI/O待機の記録を有効にします。 このパラメータはデフォルトで無効になっています。その理由は、現時点の時刻をオペレーティングシステムに繰り返し問い合わせるので、プラットフォームによっては深刻な負荷の原因になるからです。使用しているシステムにおける記録の負荷を計測するためpg_test_timingツールが使用できます。
19.9. 実行時統計情報
また、pg_test_timing の説明では、時間計測のオーバーヘッドやクロックソースによる影響が示されています。
pg_test_timing
これらを踏まえ、以下のように検証を進めることにします。
まずは利用可能なクロックソース毎に pg_test_timing で時間計測のオーバーヘッドを測定します。そして、最良と思われるクロックソースを選択します。
次に track_io_timing パラメータのパフォーマンス影響を計測します。ベンチマークとして pgbench の組み込みスクリプトである tpcb-like, select-only を用います。
クロックソース評価
# cat /sys/devices/system/clocksource/clocksource0/available_clocksource tsc hyperv_clocksource_tsc_page hyperv_clocksource_msr acpi_pm -- クロックソースを tsc に変更する場合 # echo tsc > /sys/devices/system/clocksource/clocksource0/current_clocksource # taskset -c 0 /usr/pgsql-18/bin/pg_test_timing -d 10
「オーバーヘッド込みのループ時間毎」の結果をクロックソース毎に示します。なお、ヒストグラムは割愛していますが、妥当なバラツキと判断しました。
| クロックソース | ループ時間 |
|---|---|
| tsc | 15.29 ns |
| hyperv_clocksource_tsc_page | 16.91 ns |
| hyperv_clocksource_msr | 519.59 ns |
| acpi_pm | 505.39 ns |
この結果を受けて、今回は "tsc" を採用することにしました。OSインストール直後のデフォルト設定であること、かつ測定結果が良好であったことを重視しました。
track_io_timing とベンチマーク
$ createdb bench $ pgbench -i -s 1000 bench -- track_io_timing 変更後はデータベースを再起動した # systemctl restart postgresql-18 -- select-only $ pgbench -S -c 8 -j 8 -T 300 bench -- tpcb-like $ pgbench -c 8 -j 8 -T 300 bench
各条件で 3 回計測し、"latency average" の中央値を採用します。結果を以下に示します。
| track_io_timing | select-only | tpcb-like |
|---|---|---|
| off | 0.385 ms | 3.958 ms |
| on | 0.402 ms | 3.913 ms |
select-only では track_io_timing の有効化で latency が 4.4 % 悪化しました。
一方、tpcb-like は 1.1 % 改善しましたが、差は小さいため、今回の条件では「有意差」と断定せず参考値として扱います。
まとめ
今回の検証シナリオだけ見る限り、良い性能のクロックソースであれば、track_io_timing 有効化の影響は限定的といえそうです。有効化によるパフォーマンス影響を否定できず、通常時の適用は難しくとも、検証のために限定的に利用することは検討の余地があります。
ですが、track_io_timing を有効化したい場面は I/O 負荷を疑っている状況と推測され、調査のための有効化は状況をさらに悪化させる可能性があります。有効化の前に最低限でも pg_test_timing でクロックソースを評価すること。そして、可能であれば事前検証とリカバリー計画を用意した上で適用するのが望ましいと考えます。