Cuturnの適当日記

徒然なるままに適当に駄文を吐き出しております

NetApp ONTAPのIO状態をZABBIXで監視する

NetApp FASシリーズストレージを監視しようと考えたとき、ボリュームの容量、ネットワークインタフェースの使用量、CPU使用率、健常なディスク数、ストレージIOなどを監視したいと考えると思われる。

監視方法は、まぁ普通はOnCommand UnifiedManagerを使うんだとは思うが、無理やりZABBIXで監視できるように考えてみたら、できそうだった。ただIOPSとか取ろうと思うと超絶面倒な感じになってきた。

SNMP

NetAppのSNMPをONにすることで、以下の監視ができる。

  1. CPU使用率
  2. 健常なディスク数やエラーディスク数など
  3. ネットワークインタフェース状態や使用量(vif含めて)
  4. ボリューム容量や使用率、重複排除量や圧縮量等

ZABBIXのSNMPディスカバリを利用することで、ボリューム容量の変更を監視して通知したり新規ボリュームを自動的に監視対象に追加したりできる。このレベルであればZABBIXで無理なく監視できるので、おすすめかもしれない。

NetApp API と Netapp Manageability SDK

PerlやC、JavaRubyなど様々なプログラミング言語からNetAppのデータを取得するためのSDKがNetAppサイトで配布されている。これを利用することで上記SNMPの監視に加えて、以下の監視が可能となる。

  1. ストレージIOPS(ボリューム単位、全体、プロトコル単位などなど)
  2. ストレージレイテンシー

スクリプトを組み、外部スクリプトとして登録することでZABBIXからNetApp監視が可能となる。

取得できる値はSNMPのifInOctetsなどと同じく増え続けるカウンター値。IOPSに関してはZABBIXでもifInOctets同様に時間で割った値にすることでIOPS値を出すことができる。

一方で困っているのはレイテンシー。割った値にして設定したが、IOが増えると比例する勢いで増えていくので何かがおかしい。恐らく各IOのレイテンシーの和だと思われるので、同時に取得したIO値で割ってやらないといけないのかなーと思ってはいる。具体的に取れる値をどうするといいのかというのが書いてある資料がなかなかないので、困った困った。ONTAPにSSHログインして叩く分には別に普通にmsで取れるんだが。

ONTAPにSSHログインして叩く場合
FAS01> stats show nfsv3:nfs:nfsv3_read_latency
nfsv3:nfs:nfsv3_read_latency:0.50ms

IO値とレイテンシー値取るタイミングが同時でないと正確な平均を出せないけど、ZABBIXの構造だとそれが難しい。時間を同期するアイテムとか、1つのアイテムから2つのアイテムが増えるとか、そういうのがないと厳しい。でも真面目に考えたらZABBIXのメモリ使用率計算もbufferとかcachedとか微妙にずれたタイミングの値使ってるから、割っちゃえばいいのだろうか。メモリとかはそうほいほい上下しないからいいと思うのだがIOPSやレイテンシーはほいほい上下するのであまり好ましくない気がする。

また、API1回呼ぶ毎に1つの値しか取っていないので、スクリプトを呼ぶ頻度が上がってしまう問題もある。スクリプト自体を複数のパラメータとるようにするのは簡単なのだが、ZABBIXで適切に処理できるようにするのが難しい。ZABBIXはAPIを直接叩くのではなくてAPIから取ってきた値をDBとかファイルとかから取得するようにするなら、いいんだろうけど。

うん、あれだな、一定間隔でNetAppから取得したAPIの値を格納させるスクリプトや仕組みを作って、そこからZABBIXで引っ張らせた方がいいね。…そこまでするのだるいなぁ。CactiでNetAppみてるしてる人いるし、Cactiサーバ立てた方が早い気もする。

あ、perf-object-get-instances-iter-start使ってるから駄目なのかな、ひょっとして…。んー。
⇒perf-object-get-instancesでもやはり積み上げ型のカウンタ値しか取れなかった。どうしようかな。