by manamana
25. June 2013 10:30
Hyper-Vのホスト端末でタスクマネージャを監視していても、サーバー全体のCPU使用率は表示されません。
これは、ホスト自体も仮想化されているため、タスクマネージャはホスト端末だけのCPU使用率を示すからです。
サーバー全体のCPU使用率を知りたい場合には、パフォーマンスモニターを利用するのが一般的でしょう。
パフォーマンス・モニタでHyper-Vサーバの実際のCPU使用率を調査する (@IT)
このパフォーマンスモニターですが、PowerShellからは Get-Counter コマンドレットで同様の情報を取得可能です。
そこで、Excel PowerShell Tool 上で CPU使用率を表示するシートを作ってみました。
#@PSTOOL
$ws = $_Excel.Activesheet
$addin = $_Excel.ComAddins.Item("ExPSTool").Object
#==== パフォーマンスモニター用の型定義(C#を利用)
$MyType = @"
public class PerMonitorType {
public string Timestamp;
public double ProcessorTime;
public double TotalRunTime;
}
"@
#--- 型の追加(※既存の場合はエラーになるので SilentlyContinue)
Add-Type -TypeDefinition $MyType -ErrorAction:SilentlyContinue
$PerMonitor = New-Object -TypeName PerMonitorType
#=== 使用するカウンター
$counters = @(
"\Processor(_total)\% Processor Time",
"\Hyper-V Hypervisor Logical Processor(_total)\% Total Run Time"
)
#=== 変数の初期化
$List = $ws.ListObjects.Item("PerMonitorTable")
$top = $List.HeaderRowRange
$addin.SetStartRange($top)
$i = 0
#=== Get-Count のログを加工しながら出力(60回で先頭に戻る)
Get-Counter -Counter $counters -SampleInterval 1 -Continuous | foreach {
$PerMonitor.Timestamp = $_.Timestamp.ToString("hh:mm:ss")
$PerMonitor.ProcessorTime = $_.CounterSamples[0].CookedValue
$PerMonitor.TotalRunTime = $_.CounterSamples[1].CookedValue
$PerMonitor #←これで出力
$i += 1
if ($i -gt 60) {
$addin.SetStartRange($top)
$i = 0
}
}
このスクリプトは Get-Counter の -Continuous オプションを利用して、CPU利用率を取得し続けます。
ここでは、ホスト端末のCPU使用率である "\Processor(_total)\% Processor Time" と、
Hyper-Vを含めたサーバー全体のCPU使用率である "\Hyper-V Hypervisor Logical Processor(_total)\% Total Run Time" を
指定してやり、 それを専用の PerMonitorType型変数 $PerMonitor に代入後に出力しています。
Add-Type による独自の型定義はとても便利なので参考にしてください。
殆どの場合、TotalRunTime > ProcessorTime になりますが、たまに逆転します。たぶん誤差です。
ホスト端末でHD動画を再生してやると ProcessorTime が跳ね上がります。
仮想端末でHD動画を再生すると、TotalRunTime部分だけが跳ね上がります。
PS Tool は、PowerShell から得られた情報をそのまま Excel 上に展開します。
それをグラフ等に連動させることにより簡単にくモニターシステムが構築できるわけです。
ただし、Excelの制限もありリアルタイム性には欠けます。
このスクリプトでは、1秒毎に情報を更新したかったのですが、私の環境では約2秒毎になってしまいました。
知人の新モデルでは普通に更新できるのですが…orz
9de1ed44-6548-4fa5-bc6c-66a6b4e389fb|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags:
Hyper-V | PowerShell
by manamana
18. April 2013 16:00
USB機器を扱うことにおいて、VMware vSphere は Hyper-V より遥かに柔軟です。
ハイパーバイザーの vSphere 4.1 では USBパススルー機能でホストに接続されたUSB機器を使えるようになっていたし、
現在の vSphere 5 では vSphere Client を動作させているPC(=ローカルPC)に接続されたUSB機器が使えます。
もちろん、 エミュレーターである VMware Player は当たり前のようにUSB機器が使えます。
Hyper-V には直接USB機器を扱うパスが用意されていません。
RemoteFX USB 使って一部の USB機器を使える様になっていますが、これはリモートデスクトップ側の技術だと理解しています。
エミュレーターの Virtual PC (≒XP Mode)ではそれなりに使えるのですが…残念
VMware の柔軟さに満足していたのですが、先日トラブルに遭遇したのでメモっておきます。
vSphere Client 5.1 と VMware Player 5.02 (現行の最新版)を両方インストールした環境で、
vSphere Client からはローカルPC上のUSB機器が参照できないというものです。
vSphere Client と VMware Player が同居する環境 → 参照不可
vSphere Client だけの環境 → 参照可
VMware で USB機器を制御しているのは VMware USB Arbitration Service というサービスです。
その実態である vmware-usbarbitrator64.exe を比較してみると、VMware Player の物が若干新しいことが判明しました。
VMware Player 5.02用
vSphere Client 5.1用
トラブル機では新しいVMware USB Arbitration Serviceが動いていたので、それを古いバージョンで上書きした所、
vSphere Client から USB機器が参照できるようになりましたが、逆に VMware Player で参照不可に…
要するに互換性が無いのが原因でした。
そもそもこの2つを同居させることは少ないと思いますが、現状ではどちらかのUSB機器の参照を諦めるしかないようです。
次のアップデートで対応してくれると期待しています。
17085bf0-2724-4102-ab17-6816275233be|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags:
Hyper-V
by manamana
27. March 2013 14:30
先日 Excel PowerShell Tool を使って Hyper-V を管理してみましたが、
同様の仕組みを VMware に移植してしてみました。
VMware のハイパーバイザーは有料だと思い込んでいたのですが、
VMware vSphere Hypervisor(ESXi) は無料で利用できると知りました。
このような美味しいシステムを知らずにいたとはお恥ずかしい…
PowerShell 用のコマンド群 VMware vSphere PowerCLI も用意されています。
これはもう PS Tool で利用するしか! と思ったのですが、結構大きな問題が出ました。
VSTO のアプリケーションドメインは、アセンブリのシャドウコピーを利用する設定になっています。
この状態で Runspace を作り、Add-PSSnapin "VMware.VimAutomation.Core" を実行すると、
VMware 関連の DLL もシャドウコピーが作られてしまい、スナップインが機能しません。
SharePoint 用のスナップイン等、GAC に登録されているアセンブリにはシャドウコピーが発動しないのですが、
VMware のコマンドレットには厳密名が付与されていないので GAC には登録出来ません。
さて困った…
シャドウコピーしなくても殆ど問題は無いはず(それどころかシャドウコピーで障害が発生する)なので、
シャドウコピーを作らない PS Tool を(無理やり)作ったところ、ちゃんと動いてくれました。
VMware vSphere PowerCLI は GAC に登録するべき製品だと思うのですが、とりあえず良しとしましょう。
このバージョンの PS Tool はVSTOの設定を無効にしているので副作用が予想されます。
暫くテストをした後に公開しようと思っていますが、そんなの全然大丈夫な方はご連絡ください。
無料とはいえ ESXi は高機能です。
Hyper-V の気楽さはありませんが、本格的な運用には痒い所に手が届く感じでしょうか?
この際だからもっと強力な運用スクリプトを書いてみようかな~
9f233610-eaab-4c12-b802-1cc7efe4ee1a|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags:
Hyper-V | PowerShell | VSTO
by manamana
3. March 2013 01:00
Windows 8/Server 2012 に搭載される Hyper-V 3.0 には、PowerShell モジュールが付属しています。
これを利用すると、Hyper-V マネージャー無しに仮想マシンを制御することが出来て便利です。
Hyper-V Cmdlets in Windows PowerShell
複数の仮想マシンを「同時」起動したり、Windows Updateを一斉に実行すると極端に性能が低下します。
これは HDD のランダムアクセス性能が低いのが原因で、SSD上の仮想マシンだとそれ程気になりません。
しかし、仮想マシンを SSD 上に用意できる環境は少数であり、管理者は苦労していると思います。
VMWare には仮想マシンを「順次」起動させる機能があるようですが、Hyper-V には存在しません。
そこで、 先日公開した Excel PowerShel Tool の応用として Hyper-V を管理する環境を作ってみました。
これを使えば、仮想マシンの一覧に対して以下の機能が使えます。
- 状態 仮想マシンの状態を取得する
- 起動 仮想マシンを起動する
- 保存 仮想マシンを保存する
- スナップショット 仮想マシンのスナップショットを作る
- シャットダウン 仮想マシンを終了する
- 更新 Windows Update を実行する
1~5は、Hyper-V用のコマンドレットを使って実現しています。
2の起動に関しては少し工夫をしていて、ハートビートが確認できるまで待機します。
これにより、仮想マシンの順次起動のタイミングを取っています。
その他は単純にコマンドレットを使うだけですが、完了するまで待機されるので順次実行に問題はありません。
6は PsTools に含まれる PsExec を用いて実現しています。
PsTools (Technet)
実際には PsExec により、仮想マシン上に予め配置してある Windows Update 用のスクリプト "Run-WinUpdate.ps1" を実行します。
これには次の記事が非常に役に立ちます。
更新プログラムを検索、ダウンロード、およびインストールする方法はありますか (Hey, Scripting Guy!)
普通に考えれば、PowerShell のリモートセッションでスクリプトを実行するところですが、
リモートからでは「管理者として実行」するのが困難です。
dcomcnfg で設定できると思ったのですが…挫折しました。
PsExec の -s オプションを使えばリモートからでも 「管理者として実行」 できるのでこれを採用しましたが、
PsExec はパスワード部分が平文で流れる等のセキュリティ的な問題もあるので、使用時には注意が必要です。
"Run-WinUpdate.ps1" は再起動まではサポートしていません。必要な場合は、手動で再起動してください。
※もちろん、シャットダウン&起動はExcel上から行えます
使い方は、画面を見れば分かると思います。
HyperVTable に必要な情報を記述し、スクリプトとして "Act-Hyper-V.ps1" を呼び出します。
複数の仮想マシンをバッチ的処理してくれるので、Windows Update の日には活躍してくれるでしょう。
実際の使用に関しては、スクリプト内のファイルパスを調節してください。
ここでは、PsExec.exe をパスの通った場所に配置し、
"Run-WinUpdate.ps1" は 各仮想マシンの C:\PSScripts\WindowsUpdate に配置している事が前提です。
また、Excel を「管理者として実行」しないと動かないので注意してください。
↓↓↓ ダウンロード
Act-Hyper-V.zip (13.56 kb)
5939f26a-ded6-42e8-b658-284f7995a7ab|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags:
Hyper-V | PowerShell
by manamana
28. February 2013 08:07
Windows 8 / Server 2012 に搭載された Hypre-V 3.0は随分進化しました。
Windows Server 2012クラウドジェネレーション:第5回 サーバ版Hyper-Vの概要
良い事だらけの様ですが、実は困っていたりします。 既存の Hyper-V 環境と互換性がない!
仮想マシンに互換性というのも変ですが、新らしい Hyper-V マネージャーは旧バージョンのホストに繋がらないのです。
試しに Server 2008 R2 が動いている VIP というホストに繋いでみると…
…がっくりです
Hyper-V 3.0 からは、PowerShell による管理用のコマンドが付属してくれるのでとてもありがたいです。
もしかすると! と思い、コマンドレットで接続を試みました。
まぁ、こんなものでしょう...orz
MS的には Hyper-V 3.0 は圧倒的に有利だから移行してね~という事なのでしょう。
多分、仮想マシンをエクスポートすれば普通に動いてくれると思いますが…やはり懐の問題ですねww
ちなみに 2008R2 の環境からだと 2012 の Hyper-V を管理できるという謎仕様です。
一覧が表示できて、起動・停止・接続ができれば文句ないのですが、やる気ないだろうな~
4a6b9fb4-9244-4391-804c-dfb74fea06aa|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags:
Hyper-V | Server