誰でも ZABBIX

Zabbixの使い方、役に立つ情報、等々

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]は、複数アイテムを定義する際にキーが重複しないようにするためのダミーのパラメタです。受け取る側のスクリプトは参照しません。)
f:id:Unam:20180127175227p:plain

以下の、ようにエラーになります。

f:id:Unam:20180127193257p:plain

タイムアウト設定の影響範囲の確認

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"

f:id:Unam:20180127183409p:plain

idle 1 sec となっているのは、キューに処理するデータがないので休憩している(休憩時間は1秒)プロセスです。上記の図では、すべてが、idle 1 secとなっており、pollerプロセスには余裕のあるように見えます。

ただ、コマンドラインで取得できるデータは、瞬間的な状態です。プロセスの稼動状態も、ある程度継続的に監視をしたほうが、より正確に状況を把握できます。Zabbixは、Zabbixインターナル という監視タイプで、Zabbix自体の稼働状況を監視することができるようになっています。

pollerの状態を監視するには、以下のように監視アイテムを設定します。
f:id:Unam:20180127184223p:plain

zabbixインターナルで指定可能なキー(パラメタ)は、マニュアルの以下のページで確認可能です。

8 Internal checks [Zabbix Documentation 3.4]


監視データをグラフで確認すると、psコマンドで確認した時のように、負荷の低い状態(稼働率が1%以下)であることが確認できます。
f:id:Unam:20180127185056p:plain

タイムアウト設定値の変更

先ほどのスクリプトが正常に実行できるよう、タイムアウトの値を設定可能な最大値(30秒)に変更します。

# Timeout=3
Timeout=30

設定変更後は、zabbix serverを再起動します。
f:id:Unam:20180127201750p:plain

これで実行に20秒かかるスクリプトからもデータを受け取れるようになりました。
f:id:Unam:20180127185437p:plain

ただ、スクリプトからの応答を待っている20秒間、その処理を行っているpollerプロセスは他の処理を行うことができません。当然、pollerの稼働率は上がることになります。その状況は先ほど設定したグラフで確認すると、かなり負荷が上昇していることが確認できます。

f:id:Unam:20180127185909p:plain

タイムアウトでエラーにならなくなったかわりに、pollerの稼動率が数%から10数%になりました。

さらに、このスクリプトを使用するアイテムを、計4つになるよう登録します。
f:id:Unam:20180127190135p:plain

さらにpollerプロセスの稼働率が上がり、今回確認した環境では、60%近くまで上昇しています。
f:id:Unam:20180127190732p:plain

このように、タイムアウトの設定値を変更することで、監視アイテムを取得でエラーになる状況を減らすことができますが、その分pollerの稼動率が上がってしまいます。このペースで稼働率が上昇しつづけると、稼働率が100%に張り付いたままになり、時間内に処理すべき監視アイテムが処理し切れなくなります。そうすると、いつまでも最新の監視データが取得できなくなる、という状態になってしまいます。

pollerの稼働率を下げるには、pollerの数を増やせば対応できます。ただ、pollerの数を増やすと、当然zabbixのメモリ消費量は増えたり、CPUの稼働率も上がるので、サーバのリソース状況も見ながらpollerの数を調整しましょう。

また、インターネット経由でデータを取得するような監視アイテムが多数ある場合は、監視アイテムの取得時間が遅くなった状況を作り出した上でテストを実施し、pollerプロセスの数・稼働率が適切か確認するのをおススメします。