vSAN 8.0 U2 以降で DomClientReadCache がデフォルト無効化された件
概要
vSAN 8.0 Update 2 から、読み取り性能に効いてきた DOM クライアント読み取りキャッシュ(DomClientReadCache)がデフォルトで無効化されている。CPU 負荷の軽減が狙いのようだが、小規模データセットでは IO 性能が低下しうる。実機(ESXi 8.0 U3)で実際に変更になっているかを確認し、有効化を検討すべきケースを整理する。
要点
- vSAN 8.0 U2 以降、
/VSAN/DomClientReadCacheはデフォルトで 無効(0) になった。 - 目的は CPU 使用率の削減。大規模データセットではキャッシュヒット率が低く、キャッシュの恩恵よりも CPU コストの方が大きいと判断されたため。
- 副作用として、ワーキングセットが小さい環境(目安 5GB 未満)では読み取り性能が低下する場合がある。
- CPU に余裕があり、かつデータセットが小さい環境では、再度有効化することで性能を取り戻せる可能性がある。
- 実機の ESXi 8.0 U3 で確認したところ、設定値は確かに
0だった。
DomClientReadCache とは何か
vSAN の I/O パスは、各仮想マシンの側で動く DOM(Distributed Object Manager)クライアントと、オブジェクトごとに存在する DOM オーナーという役割に分かれている。読み取り要求が来ると、まず DOM クライアントが自身のキャッシュ(DOM client read cache)に最近読んだブロックがあるかを確認し、ヒットすればそこで即座に応答する。ヒットしなければ DOM オーナーに問い合わせ、下位レイヤーからデータを取得し、チェックサム検証・展開を経て VM に返す、という流れになる。
つまり DomClientReadCache は、この「DOM クライアント層で完結できる読み取り」を増やすためのメモリ内キャッシュである。ヒットすればストレージ下位層への往復や CPU 処理(チェックサム・伸張など)を省ける。
8.0 U2 で何が変わったのか
vSAN 8.0 Update 2 から、この DomClientReadCache が デフォルトで無効(値 0)に変更された。Broadcom(旧 VMware)のナレッジ記事 KB 313370 でこの挙動と回避策が公式に説明されている。
この変更は、キャッシュ管理そのものが消費する CPU 消費を削減する狙いがある。vSAN のモジュールは ESXi カーネル内で動作するため、ホストの CPU が逼迫すると vSAN の性能にも影響がでる。ヒット率の低いキャッシュを維持し続けるよりも、その CPU を I/O 処理に回した方が総合的に速い、という判断と考えられる
影響 — 小規模データセットでの性能低下
ただしこれは万能ではない。KB 313370 は、次のような症状を明記している。
データセットが小さければ、キャッシュサイズが限られていてもワーキングセット全体をキャッシュに収められるため、ヒット率が高くなり、キャッシュの恩恵を十分に受けられる。ところがデフォルトが無効になったことで、こうした小規模環境ではせっかくのキャッシュ効果が失われ、読み取り I/O 性能が落ちてしまう。vSANのユースケース全体を見通した場合に、今回の変更は有効だといえるが、一部の小規模データセットのシナリオでは性能上の欠点が生じるため、ケースバイケースで判断する必要がある
整理すると、トレードオフは次のようになる。
| 観点 | キャッシュ無効(デフォルト / 8.0 U2+) | キャッシュ有効(回避策で有効化) |
|---|---|---|
| 大規模データセット | CPU 削減・総合性能が向上(ヒット率が低くキャッシュの恩恵は小さい) | キャッシュ管理の CPU コストが上乗せされ、恩恵は限定的 |
| 小規模データセット(< 5GB 目安) | 読み取り性能が低下しうる | ヒット率が高く読み取り性能を回復できる |
| CPU リソース | 消費を抑えられる | キャッシュ処理分の CPU を消費する |
実機での確認(ESXi 8.0 U3)
実際に ESXi 8.0 Update 3 のホストで現在値を確認した。まずビルドとバージョンを確認する。
[root@esx11:~] vmware -vl
VMware ESXi 8.0.3 build-24859861
VMware ESXi 8.0 Update 3続いて DomClientReadCache の現在値を取得する。
[root@esx11:~] esxcfg-advcfg -g /VSAN/DomClientReadCache
Value of DomClientReadCache is 0KB 313370 が示すとおり、8.0 U2 以降の挙動が 8.0 U3 でも引き継がれており、デフォルトで無効(0)であることが確認できた
有効化の方法
小規模データセット環境における性能低下懸念の回避策として、次の advanced config オプションでクライアントキャッシュを有効化できる。
[root@esx11:~] esxcfg-advcfg -s 1 /VSAN/DomClientReadCache
# 適用後、値が 1 になっていることを確認
[root@esx11:~] esxcfg-advcfg -g /VSAN/DomClientReadCache
Value of DomClientReadCache is 1元に戻す(無効化する)場合は -s 0 を指定する。この設定はホストごとの advanced setting のため、クラスタ内の全ホストで統一して適用するのが望ましい。KB では「この回避策は 8.0 U2 より後のバージョンで必要になる」と補足されている。
有効化を検討すべきケース
デフォルトの無効設定はあくまで「大半の一般的なケース」を優先したもの。以下の条件に当てはまるなら、有効化を試す価値がある。
- ワーキングセットが小さい(5GB 未満が目安)。キャッシュに全体が収まりヒット率が高くなるため、読み取り性能の回復が期待できる。
- CPU に余裕がある。ホストの CPU Ready 値が低く(目安として 1% 未満)、CPU がボトルネックになっていない環境。余った CPU をキャッシュ処理に充てられる。
- 読み取り主体で、レイテンシに敏感なワークロード。キャッシュヒットによる下位層往復の削減が性能に効きやすい。
逆に、CPU が逼迫している(CPU Ready が高い、高集約率、オーバーサイジング気味)環境や、ワーキングセットが大きくヒット率が見込めない環境では、デフォルトの無効のままにしておくのが無難といえる。有効化すると CPU 負荷が増し、かえって vSAN 全体の性能を損なう可能性がある
まとめ
vSAN 8.0 U2 以降で DomClientReadCache がデフォルト無効化されたのは、大規模データセットにおける低ヒット率と CPU コストのトレードオフを踏まえた、合理的なデフォルト変更であるといえる。一方で、小規模かつ CPU に余裕のある環境では、この変更が読み取り性能の低下として表面化しうるため、ユーザ目線では地震の環境と照らし合わせて有効性を判断したい。自分の環境がどちら側にいるのか、ワーキングセットのサイズと CPU Ready 値を見て判断し、必要に応じて回避策で有効化することが望ましい。「CPU が余っているか」と「データセットが小さいか」の二点が重要となる。
参考情報
- Broadcom KB 313370 — Enable DomClientReadCache for the smaller working dataset(症状・原因・回避策の一次情報。2024-05-11 公開)
- VMware — Fast and Efficient Reads in vSAN Express Storage Architecture(DOM クライアント読み取りキャッシュを含む ESA の読み取りパス解説)
- Broadcom KB 429468 — Host CPU overutilization may negatively impact vSAN performance(vSAN と CPU Ready 値の関係)
コメント
コメントを投稿