前の続き
ESXのカウンタ値(CPU/MEM/Disk/Net/etc)は直接のオブジェクトは無く、PerformanceManagerオブジェクト経由で取得する。
カウンタ種別
取得出来るカウンタの一覧は以下のコードで見ることが出来る。
require 'rbvmomi'
vim = RbVmomi::VIM.connect(:host=>"host", :user=>"root", :password=>"password", :insecure=>true)
host = vim.root.childEntity[0].hostFolder.childEntity[0].host
vim.serviceContent.perfManager.retrieve_stats(host,[""])
それぞれの意味はドキュメントに載っている。
真っ当に取得するのであればPerfCounterInfoオブジェクトが保持しているのでこちらを参照のこと。
ここではCPUとメモリを取得してみる。
カウンタ取得
PerformanceManagerオブジェクトのメソッドを直接使うのは手間が多いせいか、rbvmomiではより簡便なメソッド(perfManager.retreive_stats))を用意しているのでこちらを利用する。
metrics = ["cpu.usage"]
vim = RbVmomi::VIM.connect(:host=>"host", :user=>"root", :password=>"password", :insecure=>true)
host = vim.root.childEntity[0].hostFolder.childEntity[0].host
counters = vim.serviceContent.perfManager.retrieve_stats(host, metrics)
配列でカウンタ種別を指定、戻り値はHashが返ってくる。
中身の例
pp counters[host[0]]
{:sampleInfo=>
[PerfSampleInfo(
dynamicProperty: [],
interval: 20,
timestamp: 2015-01-01 06:00:40 UTC
)],
:metrics=>{"cpu.usage"=>[815]}}
実際の値は
counters[host[0]][:metrics]["cpu.usage"][0]
で得られる
Multi metrics
CPUとメモリをまとめて取得するのであれば
metrics = ["cpu.usage", "mem.usage"]
と複数指定するだけ。
値はカウンタ名をキーに指定する。
counters[host[0]][:metrics]["cpu.usage"][0]
counters[host[0]][:metrics]["mem.usage"][0]
Multi instance
CPUやNICなど複数実装しているカウンタ値をそれぞれに取得したい場合はオプションで指定する。
opt = {:multi_instance=>true}
counters = vim.serviceContent.perfManager.retrieve_stats(host, metrics, opt)
インスタンス毎の配列で返ってくるので、取得する場合は
counters[host[0]][:metrics][["cpu.usage", "1"]][0]
のようにハッシュのキーを[カウンタ名、インスタンス名]の配列で指定する
特定のインスタンスを指定する場合は
opt = {:instance=>"instance name"}
とする。
Multi record
ESXは20秒毎に2時間分のデータを保持しており、max_samplesを指定することで過去分も取得できる。
opt = {:max_samples=>10}
counters = vim.serviceContent.perfManager.retrieve_stats(host, metrics, opt)
各レコードが配列で返ってくるのでindexを指定し値を得る。
counters[host[0]][:metrics]["cpu.usage"][10]
値と時刻の対応は配列のindex値を合わせて
counters[host[0]][:sampleInfo][10][:timestamp]
で関係付けられる。
VM
ホストだけでなくVM単位でも取得出来るが、ホストとVMとで取得出来るカウンタが異なるので、
vm = vim.serviceContent.rootFolder.childEntity[0].find_vm("vmName")
counters = vim.serviceContent.perfManager.retrieve_stats(vm, [""])
でVM用のカウンタ名を確認しておく。
CPUやメモリは共通なので上記のコードで同じように取得出来る。
その他
有用と思われるカウンタ
cpu.usagemhz
CPUの使用クロック数
比率ではなく絶対値で取得出来るので、使われてる・使われていないの判断に使える
VMの使用状況をホスト側から観測出来るのでエージェントレスな監視にも使える。mem全般
メモリ関連のカウンタ。結構細かい値が取得出来る。
shared(複数VMでのページ共有量。over commitの基準に)、
swap(VM内のswapではなくover commit時のホスト側でのswap)
など。net全般
ネットワークトラフィックなど
現状では分散スイッチ側で取得できなかったので、ホスト物理NICとVMのNICで取得する。datastore.xxxLatency
ホストからのディスクアクセス遅延値
ストレージのwrite cacheが溢れるととたんに増え始める(そしてVMが固まる)