Zabbix trapper processes more than 75% busy

Zabbix2.2.4を使っているのですが、ある日突然「Zabbix trapper processes more than 75% busy」のエラーが度々出るようになり、グラフを見ると常にほぼ100%で張り付いています。
この数値が上昇する主な原因にどのようなことが考えられますでしょうか?

また、これを改善するにはどうすれば良いでしょうか?

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー KAZ の写真

Ryo Sugisakiさん

SNMP監視してますか?

ユーザー Ryo Sugisaki の写真

KAZさん

SNMP監視しております。
TeraStationやスマートスイッチの監視で使っているので。

ユーザー KAZ の写真

失礼しました。
使用量上がってるプロセスZabbixトラッパーですよね。
zabbix_sender絡みの処理が増えてないか確認して下さい。

ユーザー Ryo Sugisaki の写真

>zabbix_sender絡みの処理が増えてないか確認して下さい。

無知ですみません。zabbix_sender絡みの処理はどうやって確認すれば良いでしょうか?

ユーザー KAZ の写真

Ryo Sugisakiさん

アイテムでZABBIXトラッパーの数が増えたりしていると、zabbix_senderからの収集増えているかなと…
うーん、Zabbixサーバのログですかね?
通常のログレベルでは出てこないと思うのででバックログにしないとわからないかもしれません。

すいません。

ユーザー Ryo Sugisaki の写真

KAZさん

/etc/zabbix/zabbix_server.conf の DebugLevel のことでしょうか?
DebugLevelは3でいいですか?

ユーザー KAZ の写真

Ryo Sugisakiさん

DebugLevelです。
4にしてください。

ユーザー Ryo Sugisaki の写真

KAZさん

DebugLevelを4にしました。
少し様子を見て、ログ内容をお知らせします。
よろしくお願いします。

ユーザー Ryo Sugisaki の写真

KAZさん

DebugLevelを4にして「Zabbix trapper processes more than 75% busy」出たタイミングでログを確認したところ、logキーで取得したアイテムがずらっと出てました。
ログが大量に出過ぎていて載せられませんが、出ていたのはほぼすべてlogキーで取得した値です。

ユーザー KAZ の写真
Ryo Sugisakiさん

Zabbixサーバ動いているところで「ps -ef|grep zabbix_server」を実行すると以下の様な情報が出ます。
]# ps -ef|grep zabbix_server
zabbix    1826     1  0 16:13 ?        00:00:00 zabbix_server -c /etc/zabbix/zabbix_server.conf
zabbix    1878  1826  0 16:13 ?        00:00:09 zabbix_server: configuration syncer [synced configuration in 0.016057 sec, idle 60 sec]
zabbix    1879  1826  0 16:13 ?        00:00:00 zabbix_server: db watchdog [synced alerts config in 0.003954 sec, idle 60 sec]
zabbix    1880  1826  0 16:13 ?        00:03:01 zabbix_server: poller #1 [got 2 values in 0.087427 sec, idle 1 sec]
zabbix    1881  1826  0 16:13 ?        00:03:01 zabbix_server: poller #2 [got 5 values in 0.070492 sec, idle 1 sec]
zabbix    1882  1826  0 16:13 ?        00:02:59 zabbix_server: poller #3 [got 6 values in 0.077825 sec, idle 1 sec]
zabbix    1883  1826  0 16:13 ?        00:02:58 zabbix_server: poller #4 [got 5 values in 0.069913 sec, idle 1 sec]
zabbix    1884  1826  0 16:13 ?        00:03:01 zabbix_server: poller #5 [got 7 values in 0.078053 sec, idle 1 sec]
zabbix    1885  1826  0 16:13 ?        00:00:02 zabbix_server: unreachable poller #1 [got 0 values in 0.000094 sec, idle 5 sec]
zabbix    1886  1826  0 16:13 ?        00:00:00 zabbix_server: trapper #1 [processed data in 0.000000 sec, waiting for connection]
zabbix    1887  1826  0 16:13 ?        00:00:00 zabbix_server: trapper #2 [processed data in 0.010256 sec, waiting for connection]
zabbix    1888  1826  0 16:13 ?        00:00:00 zabbix_server: trapper #3 [processed data in 0.000000 sec, waiting for connection]
zabbix    1889  1826  0 16:13 ?        00:00:00 zabbix_server: trapper #4 [processed data in 0.000000 sec, waiting for connection]
zabbix    1890  1826  0 16:13 ?        00:00:00 zabbix_server: trapper #5 [processed data in 0.000000 sec, waiting for connection]
zabbix    1891  1826  0 16:13 ?        00:00:01 zabbix_server: icmp pinger #1 [got 0 values in 0.000134 sec, idle 5 sec]
zabbix    1892  1826  0 16:13 ?        00:00:00 zabbix_server: alerter [sent alerts: 0 success, 0 fail in 0.000611 sec, idle 30 sec]
zabbix    1893  1826  0 16:13 ?        00:00:00 zabbix_server: housekeeper [deleted 0 hist/trends, 0 items, 0 events, 0 sessions, 0 alarms, 0 audit items in 0.026173 sec, idle 1 hour(s)]
zabbix    1903  1826  0 16:13 ?        00:00:00 zabbix_server: timer #1 [processed 0 triggers, 0 events in 0.000032 sec, 0 maintenances in 0.000756 sec, idle 30 sec]
zabbix    1904  1826  0 16:13 ?        00:00:02 zabbix_server: http poller #1 [got 0 values in 0.000587 sec, idle 5 sec]
zabbix    1905  1826  0 16:13 ?        00:00:00 zabbix_server: discoverer #1 [processed 0 rules in 0.000317 sec, idle 60 sec]
zabbix    1906  1826  0 16:13 ?        00:00:07 zabbix_server: history syncer #1 [synced 121 items in 0.008943 sec, idle 5 sec]
zabbix    1907  1826  0 16:13 ?        00:00:07 zabbix_server: history syncer #2 [synced 0 items in 0.000030 sec, idle 5 sec]
zabbix    1908  1826  0 16:13 ?        00:00:07 zabbix_server: history syncer #3 [synced 0 items in 0.000024 sec, idle 5 sec]
zabbix    1909  1826  0 16:13 ?        00:00:07 zabbix_server: history syncer #4 [synced 0 items in 0.000025 sec, idle 5 sec]
zabbix    1910  1826  0 16:13 ?        00:00:03 zabbix_server: escalator [processed 0 escalations in 0.000416 sec, idle 3 sec]
zabbix    1911  1826  0 16:13 ?        00:00:01 zabbix_server: proxy poller #1 [exchanged data with 0 proxies in 0.000083 sec, idle 5 sec]
zabbix    1920  1826  0 16:13 ?        00:00:06 zabbix_server: self-monitoring [processed data in 0.000027 sec, idle 1 sec]
zabbix    1921  1826  0 16:13 ?        00:01:02 zabbix_server: vmware collector #1 [updated 0, removed 0 VMware services in 0.000003 sec, idle 5 sec]
root      5614  5528  0 21:47 pts/1    00:00:00 grep zabbix_server
trapper #1〜#5がトラッパーのプロセスです。
2行目の値がPIDです。

trapper #1を調べるときは下記のようにPIDでログを絞ると量が減ります。
grep " 1886:" /var/log/zabbix/zabbix_server.log > trapper1.log

因みに、grepする時、PIDの前の半角空白と後ろの":"重要です。A(^^;

ユーザー Ryo Sugisaki の写真

KAZさん

同じようにやってみましたところ、以下のメッセージが多く見受けられました。

Cannot get socket IP address: [107] Transport endpoint is not connected
1989:20141119:025934.495 Cannot get socket IP address: [107] Transport

簡単に訳すとソケットIPアドレスを取得できませんでした。というような感じでしょうが、これが原因なのでしょうか?
あと、これを改善するにはどうすればよいのでしょうか?

ユーザー KAZ の写真

Ryo Sugisakiさん

うーん、ソケットが足りなくなっているかも…

↓これをじっこうするとTIME_WAITしている数が取れます。
]# netstat -anp|grep TIME_WAIT|grep -v grep|wc -l

これがいっぱいあるようなら(1万とか)ソケット不足だと思われます。

ユーザー Ryo Sugisaki の写真

KAZさん

183でした。そんなに多くない感じです。

# netstat -anp | grep TIME_WAIT | grep -v grep | wc -l
183

ユーザー KAZ の写真

Ryo Sugisakiさん

3時ぐらいからエラーが出てますね。

↓こんな感じのシェル作ってcronで3時~4時を10分間隔でログとることできますか?

#!/bin/sh
echo "-----start-----" >> /tmp/netstat.log
netstat -anp | grep TIME_WAIT | grep -v grep >> /tmp/netstat.log
echo "-----end-----" >> /tmp/netstat.log

シェルは試してないので、すいませんが動くか試していただけますか?

ユーザー KAZ の写真
ソース追ってみました。

Cannot get socket IP address
これはZabbixのエラーメッセージでした。
zbx_tcp_recv_ext関数で該当のエラーを出力しているようです。 2014-11-21 1043
get_ip_by_socket関数で該当のエラーを出力しているようです。

[107] Transport endpoint is not connected
これはOSが返却しているエラーのようです。

もう少々追ってみます。

エラー的には「ENOTCONN ソケットが接続していない。」です。 2014-11-21 Add
ソケットが足りなくなって接続できなくなっているような感じですね…
夜間の処理でソケットを消費するような処理がないでしょうか?
ユーザー Ryo Sugisaki の写真

KAZさん

シェル作ってcron設定しておきました。
シェルが正常に動くことも確認済みです。
夜間も昼間も同じように監視しており、夜間に特別な処理を走らせているということはありません。
とりあえず、ログが取れましたら再度ご連絡します。
いろいろと調べていただき、誠にありがとうございます。

ユーザー Ryo Sugisaki の写真

KAZさん

遅くなり申し訳ありません。
ログを添付します。
よろしくお願い致します。

ユーザー KAZ の写真

Ryo Sugisakiさん

TIME_WAIT多くないですね…
で、socketエラーは出る…

接続している方が多い?
うーん、TIME_WAITに絞らないログを取得お願いできますか?

#!/bin/sh
echo "-----start-----" >> /tmp/netstat.log
netstat -anp >> /tmp/netstat.log
echo "-----end-----" >> /tmp/netstat.log

OSって、RedHat/CentOS系ですか?
CentOSだとデフォルトで32768から61000の28232ポート使えます。(確か64bitの話で32bitはどうだったか不明です。)
これ以上だと、上限を上げてやるしか無いです。

ユーザー Ryo Sugisaki の写真

KAZさん

お返事が遅くなり申し訳ございません。
OSはCentOS系です。

TIME_WAITに絞らないログを添付します。
よろしくお願いします。

ユーザー KAZ の写真

Ryo Sugisakiさん

ログ拝見しました。
TIME_WAITになっているの基本的にZabbixの接続ですね…
もしかするとこれが原因かも…

一度コネクトするとgetpeername関数で接続している相手ソケットの名前を取得する事ができます。
Cannot get socket IP address〜のメッセージはgetpeername関数がエラーに成った場合でていて、
エラー[107] Transport endpoint is not connectedは、「ソケットが接続していない。」つまり切断されたことを意味しています。

TIME_WAITですが…
サーバがTCPセッションを受け付けcloseすると、TIME_WAIT状態になりますが、
TCPクライアント側で先にcloseを実行すると、サーバ側ではTIME_WAITは発生しません。

つまり、zabbix_senderがZabbixサーバ接続して来たが、何らかの要因でZabbixサーバがソケットクローズしてしまった可能性が考えられます。
考えられるのはタイムアウトでしょうか…

<<上記より考えられる対策???>>
★★★ Zabbixサーバの設定変更 ★★★
/etc/zabbix/zabbix_server.confの下記を確認して下さい。

■Timeout
デフォルトがTimeout=3です。
デフォルトの場合、MaxのTimeout=30に上げてください。
これで落ち着いてくれると良いのですが…

■StartTrappers
デフォルトがStartTrappers=5です。
TNKさんの指摘でStartTrappersは15に上げたということで良いでしょうか?
StartTrappers=15ならとりあえずは様子見でそのままにしてください。

★★★ MySQLの設定を変更 ★★★
/etc/my.cnfの下記を変更してください。

■innodb_buffer_pool_size
実メモリの80%位割り当てると書いてあることいっぱいありますが、
Zabbixの場合WebもZabbixも同じサーバで動くこと有りますので、
swapが発生しない程度にいっぱいあててください。
※:メモリ使用量とかはvmstatで空きを確認してみてください。

■innodb_log_file_size
とりあえず、innodb_buffer_pool_size ÷ 2の値で良いかと。

参考URL
http://blog.flatlabs.net/20100727_212649/
http://dsas.blog.klab.org/archives/50860867.html

ユーザー Ryo Sugisaki の写真

KAZさん

>TNKさんの指摘でStartTrappersは15に上げたということで良いでしょうか?

現在は20になっています。

innodb_buffer_pool_sizeとinnodb_log_file_sizeを変更しますが、これはmysqldをリスタートすれば適用されますでしょうか?
それとも、DBをdropしてcreateし、インポートしないと適用されないでしょうか?

ユーザー KAZ の写真

Ryo Sugisakiんさん

> 現在は20になっています。
了解です。

Timeoutはどうなってましたか?

> innodb_buffer_pool_sizeとinnodb_log_file_sizeを変更しますが、これはmysqldをリスタートすれば適用されますでしょうか?
> それとも、DBをdropしてcreateし、インポートしないと適用されないでしょうか?
MySQLを止めて、/etc/my.cnf直して、MySQL起動してください。

ユーザー TNK の写真

innodb_log_file_sizeを変更する場合は、my.cnfの書き換えとmysqld
の再起動だけではダメです。
ログファイルの削除が必要になります。

きちんと手順を確認してから実行してください。

とりあえず、innodb_buffer_pool_sizeだけ変更されてはいかがでしょうか?
現時点のサーバの負荷状況の情報を提供頂けていないので以上です。

ユーザー KAZ の写真

TNKさん


きちんと手順を確認してから実行してください。

フォロー有難うございます。
↓これいりますね。
rm /var/lib/mysql/ib_logfile*

参考URL
http://masasuzu.hatenadiary.jp/entry/2014/06/13/innodb_log_file_size%E3%...

ユーザー Ryo Sugisaki の写真

KAZさん

返信遅くなってしまい申し訳ないです。
Timeoutは30に変更済みです。
Mysqlの設定も変更してみました。
これで少し様子を見てみます。
結果また連絡します。

ユーザー Ryo Sugisaki の写真

KAZさん

設定を変更してから頻発していたtrapperのエラーがほぼ出なくなりました。
長い間、いろいろと相談に乗って頂き有難う御座いました。
助かりました。

ユーザー TNK の写真

以下のブログにもありますが、Trapperプロセスの役割は、

 ・Zabbixエージェントからのアクティブ通知
 ・zabbix_senderコマンドを利用した値通知
 ・Zabbixプロキシ経由でのアクティブ通知

などで利用されます。
http://blog.zabbix.com/monitoring-how-busy-zabbix-processes-are/457/

上記のような外部からの値通知のアイテムが多くなってきているの
ではないでしょうか?

そうであるならば、zabbix_server.conf内のStartTrappersの値を
ご確認ください。
デフォルトであれば5であったと思いますので、上記のようなアイ
テムや頻度など、監視されている環境の規模にもよりますが、少し
だけ数値を大きくしてみてください。

なお、プロセス数の変更を反映するには、Zabbixサーバプロセスの
再起動が必要となりますのでご注意ください。

ユーザー Ryo Sugisaki の写真

TNKさん

>上記のような外部からの値通知のアイテムが多くなってきているのではないでしょうか?

ご推察の通り、外部からの値通知アイテムが多くなっては来ております。

>そうであるならば、zabbix_server.conf内のStartTrappersの値をご確認ください。
>デフォルトであれば5であったと思いますので、上記のようなアイテムや頻度など、監視されている環境の規模にもよりますが、少しだけ数値を大きくしてみてください。

デフォルトの5から15に変更しました。
少し様子を見てみます。

ユーザー Ryo Sugisaki の写真

TNKさん

StartTrappersの値を増やしましたが、未だに改善しません。
頻繁にエラーが出てきます。
他に何か方法はありませんでしょうか?
また、StartTrappersの値を変更したことで何が変わるのでしょうか?監視間隔ですか?

ユーザー TNK の写真

StartTrappersの値を増やしましたが、未だに改善しません。
頻繁にエラーが出てきます。
他に何か方法はありませんでしょうか?

今までいただいている情報では、一番有効な方法です。
5から15に増やした程度では余裕をもって処理できる以上の情報数
がZabbixサーバに送られてきているのかもしれません。

プロセス数を増やしても改善しないのであれば、Zabbixサーバ及び
Zabbixサーバが利用しているデータベースの性能の改善が必要かも
しれません。
Zabbixサーバやデータベースを別のサーバで稼働させているのであ
れば、その負荷状況を確認してください。

また、StartTrappersの値を変更したことで何が変わるのでしょうか?監視間隔ですか?

ご紹介したブログは読んでいただけましたか?

StartTrappersの数を増加させれば、先に書かせて頂いたような外
部サーバから値を受け取る際に処理を行うtrapperプロセスのプロ
セス数が増加し、同時に処理できる個数が増えます。

監視間隔を変更するものではありません。

ユーザー Ryo Sugisaki の写真

TNKさん

>プロセス数を増やしても改善しないのであれば、Zabbixサーバ及びZabbixサーバが利用しているデータベースの性能の改善が必要かもしれません。

了解しました。
サーバ自体の性能を少し上げてみます。

>StartTrappersの数を増加させれば、先に書かせて頂いたような外部サーバから値を受け取る際に処理を行うtrapperプロセスのプロセス数が増加し、同時に処理できる個数が増えます。

>監視間隔を変更するものではありません。

理解できました。
有難う御座います。

ユーザー TNK の写真

サーバ自体の性能を上げる前に、本当にサーバの性能がボトルネッ
クになっているのかどうかを確認してください。

というのも、現時点の状況では、そもそもサーバ自体の性能の問題
かどうかも切り分けできていないのではないでしょうか?

性能を上げるにも、CPUのコア数追加なのかメモリのサイズ追加な
のか、それともハードディスクのI/O性能の向上なのか、原因がわ
からなければ、性能を上げたつもりでもまったく効果が得られない
ことも考えられます。
それ以前に、Zabbixで利用されているデータベースのチューニング
も行われましたか?

つまり、Trapperプロセスを増やしても改善しないのであれば、サ
ーバの性能がボトルネックになっているのかを確認してください。
そして、データベースのチューニングを行われていないのであれば、
再度、サーバの状態を確認してチューニングを行ってください。

それでも改善しない場合は、サーバの負荷状況(特に、CPU関連、メ
モリ、ハードディスクI/O)を再度ご確認頂き、その負荷状況を改善
するために効果的なサーバ自体の性能向上方法をご検討ください。

ユーザー Ryo Sugisaki の写真

TNKさん

>それ以前に、Zabbixで利用されているデータベースのチューニングも行われましたか?

無知ですみませんが、データベースのチューニングとは以下URLのサイトに書かれていることでしょうか?
それとも別のことでしょうか?
もし別のことでしたら教えて頂けると助かります。

http://zabbix.robata.org/tips-dbsize-check-01.html

ユーザー TNK の写真

紹介されていたURLにあるDBのファイルサイズの件だけではありま
せん。

Zabbix用のデータベースを稼働させているサーバ上のCPUやメモリ
サイズを元に、そのサーバ上で稼働させる他のプログラムなども考
慮して、メモリの配分やデータベースのログのサイズなどの調整を
行うことです。

もし、データベースに関してデフォルトの設定のみで上記のような
チューニングを行っていらっしゃらないのであれば、サーバ自体に
メモリを何十GB搭載していたとしてもデータベース自体はデフォル
トで設定されているサイズでしか機能しませんのでご注意ください。

これ以上は、利用されている環境に関する情報提供を頂けていない
ので回答できません。

ユーザー Ryo Sugisaki の写真

TNKさん

/etc/my.cnf のことでしょうか?
おっしゃる通り、特にチューニングは行っていません。
innodb_buffer_pool_size や innodb_log_file_size を変えただけでも少しは変わるものでしょうか?

-------
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

default-character-set=utf8

innodb_file_per_table
innodb_buffer_pool_size=512M
innodb_log_file_size=128M

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
character-set-server=utf8
skip-character-set-client-handshake

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

ユーザー TNK の写真

変わります。

ただ、これまでの調査状況の結果を頂けていませんし、
環境に関する情報も頂けていないのでこれ以上の回答
はできません。

ユーザー zinten の写真

Ryo Sugisakiさん

ZabbixTrapperさんは上記以外にもちょっとだけ仕事をしてます。
その中のひとつでZabbixに登録されていないホストから
エージェントの通信があるとDNSを参照しにいく動きをします。

このとき、OSのDNS参照先の設定が間違っている場合、
DNSの設定を変更してからZabbixの再起動を行っていない場合に処理が待たされます。
DNS周りの設定等を確認してみてもらえませんか?

以下のコマンドでどのくらいかかるか計測してみてください。

# nslookup <存在しないIP>

ユーザー Ryo Sugisaki の写真

zintenさん

>以下のコマンドでどのくらいかかるか計測してみてください。

># nslookup <存在しないIP>

1秒もかからないくらいです。

ユーザー zinten の写真

Ryo Sugisaki さん

>1秒もかからないくらいです。
なるほど。。。
前触れもなく急激に上がっているのでもしやと思ったのですが外れましたか。
お役に立てずすいません。

ユーザー Ryo Sugisaki の写真

zintenさん

お役に立てずとのことですが、そんなことはありません。
コメント有難う御座いました。

ユーザー TNK の写真

インデントが深くなりすぎて見にくくなってきたので、こちらに書
かせて頂きます。

KAZさんからの確認依頼でポートの状態の情報をご提供頂きました
が、それを拝見する限り、数も少ないのでポートの不足やファイル
ディスクリプタの不足でもないと思われます。

やはり、Trapperプロセスのbusy率を75%以下にするには、処理しな
ければならない量に対して、StartTrappersの値がまだ足りないので
しょう。
11/12に5から15、その後20に増やされたようですが、もっと増やし
てみてください。

ただし、Zabbixサーバ自体のOSの負荷が高い状況であるならば、そ
ちらも対応する必要がでてきます。
サーバの負荷状況に関する情報はいまだご提供頂けていないので、
何をどうすれば良いかは判断することができません。

情報をご提供いただけないのであれば、CPUなのか、メモリなのか、
ディスクなのか、様々な要因が考えられますので、せっかくZabbix
を利用されているのであれば、それらのサーバの負荷状況を確認し
て、ご自身で調査してご対応頂ければと思います。

もしくは、タイプが「Zabbixエージェント(アクティブ)」のアイテ
ム、zabbix_senderで送り込むアイテム、ログ監視など、Trapperを
利用すると思われるアイテムの処理しなければならない量を削減
(個数を減らすか、監視間隔を伸ばす)してみるのも対応方法の1つ
かもしれません。