私は自宅に置いているミニPCにProxmoxをインストールし、その上でUbuntu VMを動かしています。
主な用途としては、Misskeyの検証環境やバックアップデータ置き場です。
不定期にMisskeyのリストア試験を行っているのですが、pg_restoreを実行するとProxmox上でVMがio-errorとなり操作が効かなくなる事象に遭遇しました。
色々手を加えてみて、リストアが完了するようになったのでメモとして残します。
環境
- Proxmox VE 9.1
- CPU: Intel Core i5-8500T
- メモリ: 32GB
- SSD 500GB (ZFS RAID1)
PostgreSQLの設定見直し
先日のサーバー引越し作業で、autovacuumをオフにしたらリストアが早くなったことを思い出したので、オフにしました。
この環境はZFSを使っており、ChatGPT曰く書き込みの都度チェックが入る堅牢な分パフォーマンスが遅い環境であると指摘されたため、fsyncをオフにしています。
メモリへの書き出しも1時間に1回に減らしたり、full_page_writesもオフにします。
これはあくまで、リストア試験環境用の設定であり、これで本番運用はしません。
|
|
上記の設定を投入し、PostgreSQLのプロセスを再起動しリストアを実行しましたが、途中でio-errorとなりました。
ディスクキャッシュの有効化
Geminiにご意見を伺ったところ、Proxmoxのキャッシュ設定を見直したらどうかと言われ、みたところ既定のキャッシュなしでした。
ディスクに書き込みを完了するまで待つモードで、安全だが低速なモードです。
これをWrite backに変更すると、ホストのメモリを一時的なバッファとして利用するため、性能が上がるようです。(書き込み完了を待たなくなる)
常用する際は、Write throughという読み込みはキャッシュするが書き込みはディスクへの書き込み完了を待つモードが良いそうです。
停電でデータを失うリスクはありますが、今回はリストア試験の用途で用いるため問題無しです。
Proxmox VE
このサイト見ると、キャッシュなしがバランス良いと書いてあるけど本当でござるか。
結果的にこのキャッシュを追加したことで、io-errorは発生しなくなりました。
おそらくの原因
Gemini曰く以下のようです。
Proxmox(ZFS RAID1)上でVMが「IO Error」で停止するという現象は、多くの場合、ディスクの書き込み遅延が限界を超え、QEMUがタイムアウト(Disk FullまたはIO Hang)を起こしてVMを保護するために強制停止させた状態です。
で、確かにディスクの書き込み遅延が増えて気づいたらVMが止まっているため、おそらくこの事象なのだろうと思います。
PostgreSQLが「書き込んで」と依頼しても、OS側が「書き込んでるからちょっと待ってね」と書き込み待ちが発生し、遅延が増えていったのかなと想像しています。
キャッシュを利用することで、PostgreSQLが「書き込んで」と依頼した際にOS側が即座に「書き込んだよ」と嘘をつけるようになり改善したのかな。
ZFS(RAID1)ではなく、RAID1組まずext4で運用した方がスループットが必要な今回のケースでは良さそうでしたね。