2016年1月22日金曜日

RDSHにおける負荷分散方式について

2016年最初の、また、記念すべき(?)50投稿目のネタは、絶賛オススメ中の「RDSH」です。

今回は、Horizon 6.2で強化された「負荷分散」機能について色々と試してみたところ、意外にハマりましたので、、紹介したいと思います。

RDSHにおける負荷分散方式は、以下の2つの方式から選択可能です。

1. 接続数が少ないホストにセッションを割り振る
2. 負荷の小さいホストにセッションを割り振る New!!

「1」は元々あったデフォルトの分散方式で、「2」がHorizon 6.2で追加された分散方式です。

ユーザー数が多い環境などでRDSHを複数台構成する場合、どのホストにユーザーのセッションを割り振られるのか、気になるところだと思います。


それぞれの方式でどのようにセッションが割り振られるのか、実際に設定内容を確認しながら紹介していきたいと思います。

例によって長文となってしまいましたので、、、ご興味のある方は続きをどうぞ。


それでは、まずは「セッション数による分散」から順に見ていきたいと思います。

こちらはデフォルトの分散方式で、Connection Serverによって管理されているセッションの接続数によって、より接続許容量が大きいRDSHにセッションが割り振られます。

接続許容量は、「最大接続数-現在のアクティブなセッション数」によって算出されます。

単純に接続しているセッション数が少ないホストに割り振るのではなく、そのホストが許容出来るセッション数が多いホストを選出するところがポイントですね。これにより、スペックの異なるホストが混在するようなケースでも適切な分散が可能です。

最大接続数はConnection Server側で設定するのですが、ファーム種別によって設定する箇所が異なります。

手動ファームの場合は、[View構成]-[登録済のマシン]に登録されているRDSHを選択し、[編集]ボタンから"接続数"パラメータにより設定が可能で、デフォルト値は"150"となります。

自動ファームの場合は、ファームを構成する際にファーム側で一括で設定するのですが、パラメータ名の通り"RDSサーバあたりの最大セッション数"となりますので、RDSHごとの接続数でファーム全体の接続数としてはホストの台数を掛けた値となります。こちらのデフォルト値は"無制限"となります。

自動ファームで3台のRDSHを構成した場合の振り分けは以下の通りとなりました。
動きとしては想定通りですね。
ユーザー RDSH#1接続数 RDSH#2接続数 RDSH#3接続数 接続先ホスト
user01 0 0 0 RDSH#1
user02 1 0 0 RDSH#3
user03 1 0 1 RDSH#2
user04 1 1 1 RDSH#3
user05 1 1 2 RDSH#1
user06 2 1 2 RDSH#2

さて、ここからが今回の投稿の本題です。

Horizon 6.2から利用可能となった「CPU/メモリ負荷による分散」について確認していきます。

こちらはセッション数による分散方式とは異なり、以下の前準備が必要となります。
1.負荷分散スクリプトを用意する。
2. "VMware Horizon View Script Host"サービスの有効化する。
3.負荷分散スクリプトを構成する。

1.負荷分散スクリプトを用意する。

いきなりの無茶ぶりですが、、ご安心下さい、イチから開発しなくても大丈夫です。
View Agentにサンプルスクリプトが付属しておりますので、こちらをそのまま利用することでも設定が可能です。

"C:\Program Files\VMware\VMware View\Agent\scripts"に格納されており、提供されるサンプルスクリプトは以下の2つです。
cpuutilisation.vbs・・・CPU負荷を取得
memoryutilisation.vbs・・・メモリ負荷を取得

スクリプトをイチから開発したい、という方は、負荷値(スクリプトを実行した戻り値)を以下の仕様に合わせる必要がありますのでご留意を。もちろん、スクリプトは自由に作成出来るので、CPU/メモリ以外のリソースによって分散することも可能だと思います。
負荷値(戻り値) 負荷状態 セッション優先度
0 非常に高い負荷 このRDSHにはセッションが割り当てられません。
1 高い負荷
2 通常の負荷
3 軽い負荷

尚、サンプルで用意されているスクリプトはCPU、メモリいずれも以下の負荷基準に基づいて負荷値(戻り値)が定義されています。
負荷値(戻り値) 判定基準
0 CPU/メモリ使用率が 90% より大きい場合
1 CPU/メモリ使用率が 75% より大きい場合
2 CPU/メモリ使用率が 25% より大きい場合
3 CPU/メモリ使用率が 25% 以下の場合

2. "VMware Horizon View Script Host"サービスの有効化する。

負荷を判定するためのスクリプトが構成出来たら、スクリプトを実行するためのサービスを起動します。デフォルトでは"無効"に設定されており、起動していません。

[管理ツール]-[サービス]より、サービスツールを起動する。

"VMware Horizon View Script Host"サービスを選択し、右クリックメニューよりプロパティを実行する。

"自動起動"項に"自動"を設定し、[OK]ボタンをクリックします。

自動起動の設定完了後、[起動]ボタンをクリックしてサービスを起動します。

3.負荷分散スクリプトを構成する。

ファイル名を指定して実行より、"regedit"と入力し、[OK]ボタンをクリックします。

[HKEY_LOCAL_MACHINE]-[SOFTWARE]-[VMware, Inc.]-[VMware VDM]-[ScriptEvents]-[RdshLoad]の順に選択します。

右クリックメニューより、"新規(N)"-"文字列値(S)"を実行します。

任意の名前を入力します。 ※ここでは"cpuutilisationScript"と入力しています。

値を選択し、右クリックメニューより"修正"を実行します。

"値のデータ"欄に実行するスクリプトをフルパスで指定します。
例)cscript.exe "C:\Program Files\VMware\VMware View Agent\scripts\cpuutilisation.vbs"

"VMware Horizon View Agent"サービスを選択し、[再起動]ボタンをクリックします。

これで負荷分散スクリプトの有効化は完了です。
自動ファームで構成する場合は、親VMとなるホストにここまでの前準備を行えばOKです。

それでは、実際に負荷をかけてステータスを確認してみたいと思います。

今回、負荷テストツールとして使用したのは、以下のツールです。
CPU負荷ツール:CPUSTRES.exe
メモリ負荷ツール:TestLimit.exe

いずれもMicrosoftさん純正の負荷ツールなのですが、「CPUSTRES.exe」は公式サイトからのダウンロードが出来なくなっています。。良いか悪いか、Sysinternals.comのサイトに直接アクセスするとダウンロード出来ますので、ご入用の方は自己責任でどうぞ。
https://live.sysinternals.com/Files/

まず、サンプルスクリプトの「cpuutilisation.vbs」を有効にした状態での挙動を確認します。

デフォルトではスクリプトは30秒おきに実行され、負荷値はView Administratorのダッシュボードより、ファーム配下のRDSHをクリックすることで確認出来ます。

負荷のかかっていない状態であれば、"軽負荷のため、新しいセッションは許可されます"と表示されます。スクリプトが返答している負荷値は「3」ですね。

CPUSTRES.exeを使って、CPUの使用率を30%まで上げます。

すると、スクリプトが返答する負荷値が「2」に変わり、ダッシュボードの表記も"正常な負荷のため、新しいセッションは許可されます"に変わります。

負荷を80%まで上げると、負荷値は「1」となり、高い負荷状態とはなりますが、セッションを受け付けてくれます。

負荷を100%まで上げると、負荷値は「0」となり、セッションを受け付けない状態(ブロック)となります。

サンプルスクリプトの「memoryutilisation.vbs」を有効にした状態での挙動を確認しましたが、こちらも同様にView Administratorダッシュボードで負荷状況の確認が出来ました。

メモリに負荷をかけるツールとして「TestLimit.exe」を使用しましたが、使い方はいたって簡単、以下のコマンドを実行するだけです。
C:\Toos\TestLimit\testlimit64.exe -d -c 消費したいメモリ量(MB)

終了したい時は「Ctrl+C」でコマンドを終了させればOKです。

ちなみに、CPUSTRES/TestLimitの使い方はこちらをご参考下さい。

ここままででCPUとメモリの負荷を別々に見てきましたが、CPUとメモリ双方の負荷を考慮する必要があると思いませんか?

ということで、「cpuutilisation.vbs」と「memoryutilisation.vbs」の2つ実行するスクリプトとして「RdshLoad」にエントリしてみました。

ところが・・・

CPUもしくはメモリだけに負荷を掛けてみたり、CPUとメモリ両方に負荷を掛けてみましたが、すべて"cpuutilisation.vbs"の戻り値が反映されるという結果でした。。

色々と調べた結果、「RdshLoad」にエントリしたスクリプトのうち、命名規則の順番で先にくるスクリプトのみが有効になるようですね。

調査内容としては、戻り値として1~3をそれぞれ応答するスクリプトを3つ「RdshLoad」にエントリし、ProcessMonitorで確認したところ、たしかにスクリプトは3つとも実行されているのですが、View Administrator上のステータスには最初に実行されたスクリプトの結果のみが反映されます。

その後も調べてみたところ、以下VMwareさんのブログでスクリプトはひとつだけが有効であることが明記されていました。# じゃあ実行しないでよ!とは言いませんよ。
https://blogs.vmware.com/euc/2015/09/whats-new-with-vmware-horizon-6-version-6-2-part-2.html

"The VMware Horizon View Script Host service must be running and only one load balancing script should be running at anyone time."

むむむ・・・

ということで、多少強引ではありますが、「cpuutilisation.vbs」と「memoryutilisation.vbs」を合体させたスクリプトを作成したところ、CPUとメモリそれぞれの負荷状況に応じた負荷値の報告が上がりました。

ちなみに、CPUとメモリの負荷値をどのように判定したかと言いますと、いずれか小さな値(負荷の高い結果)を採用しました。CPUもしくはメモリ、どちらかの負荷が高ければその高い方の負荷をそのホストの負荷値とする、ということですね。

同様に自動ファームで3台のRDSHを構成し、それぞれ意図的に負荷をかけてみたところ、セッションの割り振りは以下の通りとなりました。こちらも動きとしては想定通りですね。
ユーザー RDSH#1負荷値 RDSH#2負荷値 RDSH#3負荷値 接続先ホスト
user01 3 3 3 RDSH#3
user02 3 3 2 RDSH#1
user03 2 1 2 RDSH#3
user04 1 1 1 RDSH#3
user05 0 0 0 接続NG
user05 2 1 0 RDSH#1

今回ご紹介した各分散方式はいずれも、新規セッションを確立する場合にのみ有効であり、既存セッションはすでにセッションが確率されているホストに再接続されます。


最後にもう一点だけ、気になる挙動がありましたので、ご紹介だけしておきます。

サンプルとして提供されるCPUの負荷を取得するスクリプト「cpuutilisation.vbs」に実装されているCPU負荷判定ロジックですが、動きが少々複雑です。。

CPU負荷そのものはレジストリにセットされており、スクリプトはこのレジストリ値を見て負荷を判定しているようですが、このCPU負荷をレジストリにセットしているのはスクリプトではなく、View Agent(wsnm.exe)が行っており、デフォルトでは5分間隔となります。
# 間隔はレジストリで変更出来るようですが私の検証ではうまく動作しませんでした。。

CPU負荷値
HKEY_LOCAL_MACHINE\SOFTWARE\VMware, Inc.\VMware VDM\Performance Stats\
CpuPercentage(REG_DWORD)

監視間隔
HKEY_LOCAL_MACHINE\SOFTWARE\VMware, Inc.\VMware VDM\Performance Stats\
SamplingIntervalSeconds(REG_DWORD)

CPUの負荷計測が5分間隔なのに対し、負荷を判定するスクリプトの実行間隔が30秒だと、あまり効率がいいとは言えないかなと思います。
実際に本番環境で運用頂く場合には、まだまだ見直す余地があるかなと思います。

メモリの負荷判定ロジックについては、スクリプト実行時のメモリ使用率を元に判定されていますので、特に修正する必要はないかなと思います。

ま、結論としては、30秒おきに負荷判定するほどシビアに分散しなくともよいとは思いますので、スクリプトの実行間隔を5分に変更してしまえば、統一されてイイ感じではないかなと。

ちなみに、スクリプトの実行間隔は、以下のレジストリで変更が可能です。

スクリプトの実行間隔
HKEY_LOCAL_MACHINE\SOFTWARE\VMware, Inc.\VMware VDM\Agent\Configuration\
RdshLoadScriptIntervalSecs(REG_DWORD)

以上、RDSHにおける負荷分散方式についてのご紹介でした。

Horizon6で追加されたRDSHですが、vGPUをサポートするなど機能強化が目白押しです。
他の強化点についても、機会があればご紹介が出来ればと思います。。

本年も皆さんにとって、「Horizon」な1年でありますように!(笑

0 件のコメント:

コメントを投稿