2017年10月31日火曜日

仮想デスクトップ黒ブチ画面問題

みなさん、こんにちは。

Horizonで仮想デスクトップに接続した際、以下のように黒ブチ画面が表示されたことはありませんでしょうか?


本現象は、解像度の高い環境(Horizon Client)から仮想デスクトップに接続した場合に見られ、仮想デスクトップ側のビデオメモリが足りないために画面を描画しきれないために発生していることが主な原因と考えられます。

仮想デスクトップ側のビデオメモリを調節すればおおよそ解消するのですが、どのくらいの値に調節すればよいのか、どこで設定すればよいのかがわからない、という方もいらっしゃるかもしれませんので、今回はこの黒ブチ画面問題に対する対処法について紹介したいと思います。

ご興味のある方は続きをどうぞ。


1.デバイスの解像度を調べる

まずはお使いのデバイスの解像度を確認します。

Windows10であれば[スタート]-[設定]-[システム]-[ディスプレイ]で確認が可能です。




私の使っているPCの画面ですが、解像度が「2736×1824」ということがわかります。

2.プールの解像度設定を変更する

確認した解像度の要件を満たすように、プールの解像度を設定します。

Horizonはプールの解像度設定によって仮想デスクトップに割り当てるビデオメモリを自動で調節してくれます。

View Administratorにログインし、問題の発生している仮想デスクトップが所属しているプールを選択し、[編集]ボタンをクリックします。


設定するパラメータは、"デスクトッププールの設定"タブ内の中段にある"モニターの最大数"と"1台のモニターの最大解像度"です。


デフォルトでは"モニターの最大数"が「2」、"1台のモニターの最大解像度"が「1920×1200」に設定されています。

ここへデバイスの解像度要件を満たすように設定すれば、Horizonが割り当てるビデオメモリを自動的に調節してくれます。

3.設定の反映には"パワーオフ"が必要

プールの設定などにより仮想マシンのビデオメモリを変更した場合、対象の仮想デスクトップをパワーオフ(シャットダウン)しないと設定が反映されません。
※再起動では設定が反映されません。

View Administratorからでは仮想マシンをシャットダウンできない(できるのは再起動とリセット)ので、vSphere Web Clientより対象の仮想マシンをシャットダウン&パワーオンする必要があります。
※プールの電源ポリシーが「マシンは常にパワーオン状態」に設定されていれば、シャットダウン後、仮想デスクトップは自動で起動してくれます。


4. 仮想デスクトップに再接続

ビデオメモリの調節が完了すれば、Horizon Clientで再接続してみてください。
黒ブチ画面にならずに画面いっぱいにデスクトップ画面が表示されると思います。


Tips.Horizonによるビデオメモリ自動調整

Horizonのプール設定により簡単にビデオメモリが調整できることを紹介しましたが、どのようなロジックで値が決定されるのか気になったので調べてみました。

希望の解像度を表示するために必要となるビデオメモリサイズは、以下の計算式によって試算することが可能です。

解像度(幅) × 解像度(高さ) × 4

【参考】Windows ゲスト OS へのビデオ解像度モードの追加 (2078472)
https://kb.vmware.com/kb/2078472

デフォルトでプールに設定されている解像度「1920×1200」が必要とするビデオメモリは、おおよそ「9MB」となります。

1920 × 1200 × 4 = 9,216,000 byte

割り当てられているビデオメモリは、vSphere Web Client より仮想マシン情報の"サマリ"タブ内"仮想マシンのハードウェア"項より確認できます。

ん!? 35MB!?

想定していた「9MB」のおおよそ4倍である「35MB」が割り当てられています。

気になってvmxファイルを確認したところ、解像度(幅、高さ)がそれぞれ2倍に設定されています。

svga.vramSize = "36896768"
svga.maxHeight = "2400" (1200×2)
svga.maxWidth = "3840" (1920×2)
svga.numDisplays = "2"

3840 × 2400 × 4 = 36,864,000 byte

"モニターの最大数"に「2」を指定したことで、その分のビデオメモリを調節してくれているのだと思いますが、なぜ「4倍」なのでしょうか。。

気になったので、"モニターの最大数"を「1」に変更してみたところ、"幅"の値はプールで設定している値「1920」に戻り、"高さ"は「2400」が設定されたまま。割り当てられたビデオメモリはおおよそ「18MB」となりました。

svga.vramSize = "18481152"
svga.maxHeight = "2400" (1200×2)
svga.maxWidth = "1920" (1920×1)
svga.numDisplays = "1"

1920 × 2400 × 4 = 18,432,000 byte

さらに、"モニターの最大数"を「3」に設定してみたところ、"幅"の値はプールで設定している値「1920」の3倍である「5760」となり、"高さ"は「2400」が設定されたまま。割り当てられたビデオメモリはおおよそ「55MB」となりました。

svga.vramSize = "55312384"
svga.maxHeight = "2400" (1200×2)
svga.maxWidth = "5760" (1920×3)
svga.numDisplays = "3"

5760 × 2400 × 4 = 55,296,000 byte

何となく傾向がつかめてきましたね。

  • "モニターの最大数"の設定値は、解像度の"幅"パラメータに影響を与える。
  • 解像度の"高さ"パラメータは、常に2倍の値で計算される。

上記仮説を検証するために"モニターの最大数"を「4」に設定してみました。

svga.vramSize = "73728000"
svga.maxHeight = "2400" (1200×2)
svga.maxWidth = "7680" (1920×4)
svga.numDisplays = "4"

7680 × 2400 × 4 = 73,728,000 byte

間違いなさそうですね。(笑

ということで、Horizonのプール設定によって自動調整されるビデオメモリは、以下の計算式となりそうです。

モニター数 × 解像度(幅) × 解像度(高さ) ×2 × 4

なぜ"高さ"パラメータが常に「2倍」されているのかを説明するいい表現が思いつかないのですが、、設定した解像度よりも多めにビデオメモリを割り当てておくことで、将来的な解像度改善にも耐えられる設計である、としておきましょうかね。

余談ですが、ビデオメモリを厳密に設定したいという方は、プール設定の”3Dレンダラー”パラメータを「vSphere Clientを使用して管理」に設定することで、vSphere Web Client側で設定・管理することが可能です。


ただし、vSphere Web Clientの仮想マシンプロパティから設定できるビデオメモリは「1.17MB~128MB」に制限されますのでご注意ください。

さて、今回は「黒ブチ画面問題」に対してビデオメモリの観点から対応する方法を紹介させていただきました。
様々な理由で発生する「真っ暗画面」や「黒ブチ画面」問題。また違う要因での発生が確認できましたら、その対応方法について紹介させていただきます。

0 件のコメント:

コメントを投稿