4. Zabbix serverの設定 - Timeout
Zabbixが監視対象からデータを取得する場合、一定の時間内に監視対象からデータが取得できないと、タイムアウトエラーになります。今回は、タイムアウトになるまでの時間を変更する方法と、そのパラメタを変更した場合にZabbix serverの環境に与える影響を確認します。
タイムアウトの初期値
Zabbix agent、snmp、外部チェックなど、ポーリング系のデータのタイムアウトは、初期設定で3秒となっています。これは、zabbix serverのconfigファイル(/etc/zabbix/zabbix_server.conf)に記載されています。
### Option: Timeout # Specifies how long we wait for agent, SNMP device or external check (in seconds). # # Mandatory: no # Range: 1-30 # Default: # Timeout=3
ほとんどのzabbix agentやsnmpのアイテムでは、タイムアウト3秒というのは十分な時間です。一方、以下のようなケースだと応答時間が遅くなり、3秒ではタイムアウトになるケースが多くなります。
- Zabbix agentの vfs.dir.sizeで、ファイル数の多いフォルダ/ディレクトリを指定した場合(c:\windows 等)
- 外部スクリプトで、WebAPI等、インターネット経由で値を取得するような処理を行う場合
確認のため、20秒スリープするだけの外部スクリプトを作成し、実行します。
外部スクリプト(/usr/lib/zabbix/externalscripts)
$ ls -l sleep20 -rwxr--r-- 1 zabbix zabbix 27 Jan 27 16:47 sleep20 $ cat sleep20 #!/bin/sh sleep 20 echo ok
アイテム定義 (sleep20[1]の[1]は、複数アイテムを定義する際にキーが重複しないようにするためのダミーのパラメタです。受け取る側のスクリプトは参照しません。)
以下の、ようにエラーになります。
タイムアウト設定の影響範囲の確認
zabbix agent、snmp、外部チェックは、pollerというプロセスが処理をしています。このプロセスは初期設定では5つ動いています。
### Option: StartPollers # Number of pre-forked instances of pollers. # # Mandatory: no # Range: 0-1000 # Default: # StartPollers=5
psコマンドでも、pollerが5つ動いていることを確認できます。
ps aux | grep "zabbix_server: poller"
idle 1 sec となっているのは、キューに処理するデータがないので休憩している(休憩時間は1秒)プロセスです。上記の図では、すべてが、idle 1 secとなっており、pollerプロセスには余裕のあるように見えます。
ただ、コマンドラインで取得できるデータは、瞬間的な状態です。プロセスの稼動状態も、ある程度継続的に監視をしたほうが、より正確に状況を把握できます。Zabbixは、Zabbixインターナル という監視タイプで、Zabbix自体の稼働状況を監視することができるようになっています。
pollerの状態を監視するには、以下のように監視アイテムを設定します。
zabbixインターナルで指定可能なキー(パラメタ)は、マニュアルの以下のページで確認可能です。
監視データをグラフで確認すると、psコマンドで確認した時のように、負荷の低い状態(稼働率が1%以下)であることが確認できます。
タイムアウト設定値の変更
先ほどのスクリプトが正常に実行できるよう、タイムアウトの値を設定可能な最大値(30秒)に変更します。
# Timeout=3 Timeout=30
設定変更後は、zabbix serverを再起動します。
これで実行に20秒かかるスクリプトからもデータを受け取れるようになりました。
ただ、スクリプトからの応答を待っている20秒間、その処理を行っているpollerプロセスは他の処理を行うことができません。当然、pollerの稼働率は上がることになります。その状況は先ほど設定したグラフで確認すると、かなり負荷が上昇していることが確認できます。
タイムアウトでエラーにならなくなったかわりに、pollerの稼動率が数%から10数%になりました。
さらに、このスクリプトを使用するアイテムを、計4つになるよう登録します。
さらにpollerプロセスの稼働率が上がり、今回確認した環境では、60%近くまで上昇しています。
このように、タイムアウトの設定値を変更することで、監視アイテムを取得でエラーになる状況を減らすことができますが、その分pollerの稼動率が上がってしまいます。このペースで稼働率が上昇しつづけると、稼働率が100%に張り付いたままになり、時間内に処理すべき監視アイテムが処理し切れなくなります。そうすると、いつまでも最新の監視データが取得できなくなる、という状態になってしまいます。
pollerの稼働率を下げるには、pollerの数を増やせば対応できます。ただ、pollerの数を増やすと、当然zabbixのメモリ消費量は増えたり、CPUの稼働率も上がるので、サーバのリソース状況も見ながらpollerの数を調整しましょう。
また、インターネット経由でデータを取得するような監視アイテムが多数ある場合は、監視アイテムの取得時間が遅くなった状況を作り出した上でテストを実施し、pollerプロセスの数・稼働率が適切か確認するのをおススメします。