事象
次の環境で停電発生。停電発生1分前程度からのDB更新データが残っていない事象が発生
・Postgres14.1
・Windows10
※OSクラッシュ時なども同様
原因
walバッファに溜め込まれたデータがディスクにフラッシュされていなかった
解決方法
wal_sync_methodが不適切な設定値になっていました。
pg_test_fsyncで診断します。
PostgreSQLの最も高速なwal_sync_methodを決定する。
診断結果ではopen_datasyncが最速でした。
※pg_test_fsyncはPostgres9.1で追加されています。
pg_test_fsync -f test.txt
テスト1件あたり5秒
このプラットフォームではopen_datasyncとopen_syncについてO_DIRECTが
サポートされています。
8kBの書込みを1回行ってファイル同期方法を比較します:
(Linuxのデフォルトであるfdatasyncを除きwal_sync_methodの優先順)
open_datasync 11517.116 操作/秒 87 μ秒/操作
fdatasync 利用不可
fsync 538.828 操作/秒 1856 μ秒/操作
fsync_writethrough 539.794 操作/秒 1853 μ秒/操作
open_sync 利用不可
8kBの書込みを2回行ってファイル同期方法を比較します:
(Linuxのデフォルトであるfdatasyncを除きwal_sync_methodの優先順)
open_datasync 5950.502 操作/秒 168 μ秒/操作
fdatasync 利用不可
fsync 316.530 操作/秒 3159 μ秒/操作
fsync_writethrough 315.669 操作/秒 3168 μ秒/操作
open_sync 利用不可
open_sync を異なった書込みサイズで比較します:
(これはopen_syncの書込みサイズを変えながら、16kBの書込みのコストを比較する
よう指定されています。)
1 * 16kB open_sync書込み 利用不可
2 * 8kB open_sync書込み 利用不可
4 * 4kB open_sync書込み 利用不可
8 * 2kB open_sync書込み 利用不可
16 * 1kB open_sync書込み 利用不可
書き込みのないのファイルディスクリプタ上のfsyncが無視されないかをテストします:
(もし実行時間が同等であれば、fsync()は異なったファイルディスクリプタ上で
データをsyncできることになります。)
write, fsync, close 107.541 操作/秒 9299 μ秒/操作
write, close, fsync 114.217 操作/秒 8755 μ秒/操作
8kBの同期なし書込み:
write 217051.499 操作/秒 5 μ秒/操作