コンシューマーSSDを守るProxmox VE最適化ガイド:Write Amplificationの防止とZFS TRIMの設定

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

問題:Proxmox実行時にSSDが「すぐ死ぬ」理由とは?

コンシューマーSSD(Samsung EVO、Crucial MX、Kingstonなど)でProxmox VEのHome Labを構築している方は、数ヶ月後にWearout値を確認して驚くかもしれません。実際に私も、新品の500GB SSDが半年の運用でわずか15%ものWearoutが進んだケースを経験しました。

原因はドライブの品質ではなく、ProxmoxとZFSファイルシステムの動作方式にあります。デフォルトではProxmoxは絶えずログを書き込み、ZFSはFlashチップの書き込みサイクル(P/Eサイクル)を大量に消費する仕組みになっています。これをWrite Amplification(書き込み増幅)と呼び、OSが要求するデータ量よりも実際にメモリチップへ書き込まれるデータ量が何倍にも膨れ上がる現象です。

私は12台のVMとコンテナを管理するProxmox VEのホームラボを運用しており、本番環境に移行する前にあらゆるものをテストするためのプレイグラウンドとして活用しています。何度もドライブ交換で「痛い出費」を経験した末に、か弱いコンシューマーSSDを守るための最適化手順をまとめました。

Quick Start:5分でできる高速最適化

詳細を読む時間がない方は、以下の3つのコマンドをすぐに実行してSSDの負荷を軽減しましょう。

1. ZFS PoolのAutotrimを有効化する

ZFSは古いバージョンやデフォルト設定ではTRIMコマンドを自動実行しません。TRIMにより、SSDは不使用ブロックを把握して効率的に回収できるようになります。

# プール名を確認する(通常はrpool)
zpool list

# autotrim機能を有効化する
zpool set autotrim=on rpool

2. クラスターステータスの更新頻度を下げる

pve-ha-lrmcorosyncサービスは、/var/lib/pve-clusterへステータスログを絶えず書き込み続けます。シングルノード環境で運用している場合は、この負荷を軽減しましょう。

# シングルノードの場合はHAサービスを無効化する
systemctl stop pve-ha-lrm
systemctl disable pve-ha-lrm
systemctl stop pve-ha-crm
systemctl disable pve-ha-crm

3. SSDの残余寿命を確認する

smartmontoolsをインストールして、ドライブの寿命消耗度を確認しましょう

apt update && apt install smartmontools -y
smartctl -a /dev/sda | grep Wear

詳細解説:SSDの静かな敵

Write Amplificationとは?

SSDでは、データを直接上書きすることができず、書き込み前にブロックを消去する必要があります。ZFSはCopy-on-Write(CoW)ファイルシステムです。小さな変更が生じるたびに既存の場所に上書きせず、全く新しいブロックに書き込みます。これはデータ安全性の観点では非常に優れていますが、TBW(Total Bytes Written)が低いコンシューマーSSDにとっては致命的です。

なぜZFSはSSDを消耗させるのか?

  • ZFS Intent Log(ZIL):すべての同期書き込み(synchronous writes)が2回書き込まれます。
  • メタデータ:ZFSはファイル構造の整合性を保つためにメタデータを絶えず更新します。
  • スモールブロック:VMにデフォルトのvolblocksize=8kを設定していても、内部のアプリケーションが4kのデータ断片を書き込む場合、SSDは壊滅的な書き込み増幅を被ることになります。

応用編:ドライブ保護のための詳細設定

1. システムログをRAMに移動する

Proxmoxは/var/logへ大量のログを書き込みます。SSDを痛めつけるのを防ぐため、すべてのログをRAMに移動します。注意:ログは再起動時に消えますが、Home Labであれば通常は問題ありません。

ツールfolder2ramを使用します:

# folder2ramをダウンロードしてインストールする
git clone https://github.com/bobafetthotmail/folder2ram.git
cd folder2ram
./install.sh

# /var/logを設定する
folder2ram -enablesystemd /var/log

2. Swappinessを調整する

デフォルトでは、LinuxはRAMの空き容量が約40%になるとSwapを使い始めます(swappiness=60)。Swapへの書き込みはSSDへの書き込みを意味します。本当に必要な時だけSwapを使うよう設定しましょう。

# 現在の値を確認する
cat /proc/sys/vm/swappiness

# 10に変更する(RAMの空き容量が10%以下の時だけswapする)
sysctl vm.swappiness=10

# 永続的に保存する
echo "vm.swappiness=10" >> /etc/sysctl.conf

3. VM向けZFS Recordsizeを最適化する

VM用のディスク(Zvol)を作成する際はblocksizeに注意しましょう。Database(MySQL、Postgresなど)を実行する場合は、DBのページサイズ(通常16k)に合わせてblocksizeを設定してください。ファイルサーバーを実行する場合は、メタデータの書き込み回数を減らすために64kまたは128kに増やしましょう。

# データセットの現在の設定を確認する
zfs get volblocksize rpool/data/vm-100-disk-0

実体験から得た実践的なTips

数年間Proxmoxノードと格闘してきた経験から、ぜひ共有したい骨身に沁みたアドバイスをまとめました:

  • 異なる種類のコンシューマーSSD 2台でZFS Raid 1を使わないこと:書き込み速度は遅い方のドライブに引きずられ、TBWが低い方が先に死んで、交換作業を繰り返す羽目になります。
  • 可能であれば中古のEnterprise SSDを購入すること:Intel DC S3500/S3700やSamsung PM863などのモデルは中古価格がかなり安い一方、耐久性(DWPD)はコンシューマー製品の数十倍に達します。停電保護(Power Loss Protection)用のコンデンサを備えており、ZFSをより安全に運用できます。
  • ドライブの10〜20%は常に空けておくこと:SSDを使い切らないようにしましょう。SSDはGarbage CollectionWear Levelingのメカニズムに空き容量が必要です。ZFSでは、プールのquotaを設定して使用率が80%を超えないようにしています。
  • CPUが非力な場合は圧縮機能をオフにすること:デフォルトでZFSは非常に軽量なlz4を使用しています。しかし古いAtom系CPUを使用している場合、データ圧縮が書き込み遅延を引き起こし、システムが待機状態になって大量の一時的なデータの断片が生まれる可能性があります。

Proxmoxの最適化は、新しいドライブ購入費を節約するだけでなく、Home Labシステムを安定稼働させ、書き込み寿命が尽きたドライブがRead-onlyモードに入ることによる突然のフリーズを防ぐためでもあります。設定がうまくいくことを願っています!

Share: