zabbix_serverメモリリーク?

お世話になっております。hiroyukiです。

zabbix_serverのメモリ使用率が徐々に上がっている状況で、最終的にout of memory になって、zabbix_serverプロセスがダウンしてしまい困っております。
1週間で2GBほど空きメモリが減っていくような状態です。
zabbix_serverプロセスがメモリ使用率が一番高いのだけ分かっていますが、その後、どこが原因か調査は皆さんどのようにされていますでしょうか?

↓ZABBIXのダッシュボードに表示されている情報
**********************************************
ホスト数 (有効/無効/テンプレート) 296 177 / 25 / 94
アイテム数 (有効/無効/取得不可) 7594 7070 / 191 / 333
トリガー数 (有効/無効)[障害/不明/正常] 2076 1997 / 79 [0 / 0 / 1997]
ユーザー数 (オンライン) 44 5
1秒あたりの監視項目数(Zabbixサーバの要求パフォーマンス) 97.64 -

■topコマンドでメモリ使用率順にソートした情報
top - 11:10:47 up 58 days, 1:55, 2 users, load average: 0.09, 0.10, 0.13
Tasks: 141 total, 2 running, 138 sleeping, 0 stopped, 1 zombie
Cpu(s): 2.2%us, 0.6%sy, 0.0%ni, 96.9%id, 0.2%wa, 0.0%hi, 0.1%si, 0.0%st
Mem: 17525536k total, 17078004k used, 447532k free, 167684k buffers
Swap: 0k total, 0k used, 0k free, 4305516k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
316 zabbix 20 0 3402m 3.2g 4512 S 0 19.3 27:07.98 zabbix_server
323 zabbix 20 0 2188m 2.1g 29m S 0 12.3 94:29.69 zabbix_server
326 zabbix 20 0 2184m 2.1g 29m S 0 12.3 94:11.45 zabbix_server
324 zabbix 20 0 2170m 2.0g 29m S 0 12.2 93:35.97 zabbix_server
325 zabbix 20 0 2167m 2.0g 29m S 1 12.2 93:13.32 zabbix_server
13584 www-data 20 0 227m 40m 5016 S 2 0.2 0:03.17 apache2
14175 www-data 20 0 227m 40m 4944 R 0 0.2 0:00.98 apache2
13999 www-data 20 0 223m 36m 5016 S 4 0.2 0:03.84 apache2
14354 www-data 20 0 223m 36m 4908 S 0 0.2 0:00.42 apache2
14252 www-data 20 0 220m 34m 4912 S 0 0.2 0:00.51 apache2
14000 www-data 20 0 217m 30m 4992 S 0 0.2 0:00.71 apache2
309 zabbix 20 0 111m 30m 28m S 0 0.2 17:18.01 zabbix_server
308 zabbix 20 0 111m 30m 28m S 0 0.2 17:42.35 zabbix_server
312 zabbix 20 0 111m 30m 28m S 0 0.2 17:12.36 zabbix_server
310 zabbix 20 0 111m 29m 28m S 0 0.2 17:07.45 zabbix_server
311 zabbix 20 0 111m 29m 28m S 0 0.2 17:05.53 zabbix_server
302 zabbix 20 0 111m 29m 28m S 0 0.2 40:35.54 zabbix_server

■zabbixサーバ自体のスペック
ハイメモリ エクストララージ インスタンス(AWS)

17.1 GiB のメモリ
6.5 ECU(3.25 ECU × 2仮想コア)
420 GB インスタンスストレージ
64ビット プラットフォーム
I/O 性能: 標準
EBS 最適化: 使用不可

コメント表示オプション

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

Zabbixのバージョンが書かれていませんが、どのバージョンを利用
されているのでしょうか。
バージョンによって対応状況が異なる場合がありますので、ご質問
いただく際には、利用されているバージョンもお教えください。

あと、監視アイテムでSSHを利用しているようなアイテムはありま
せんか?
あるならば、利用されているlibssh2のバージョンが、1.4.2以降で
あることをご確認ください。

ご参考:
 https://support.zabbix.com/browse/ZBX-4857
 https://support.zabbix.com/browse/ZBX-4602

ユーザー tsuzuki の写真

こんにちは。
見たところ、316、323、326、324、325 のプロセスがメモリリークしてそうな感じがしますね。
/var/log/zabbix_server.log を見て、zabbix_server起動時点のログを見ると以下のようなメッセージが出ていると思います。
行の先頭の数字がプロセスIDで、行の末尾にtrapperとかalerterなどがプロセスの役割名になります。
--------------------------------------------------------------
 17345:20130122:202135.085 server #1 started [configuration syncer #1]
 17347:20130122:202135.090 server #2 started [db watchdog #1]
 17355:20130122:202135.165 server #9 started [trapper #1]
 17357:20130122:202135.176 server #10 started [trapper #2]
 17360:20130122:202135.182 server #12 started [trapper #4]
 17362:20130122:202135.188 server #13 started [trapper #5]
 17364:20130122:202135.194 server #14 started [icmp pinger #1]
 17366:20130122:202135.200 server #15 started [alerter #1]
 17358:20130122:202135.207 server #11 started [trapper #3]
 17368:20130122:202135.205 server #16 started [housekeeper #1]
 17368:20130122:202135.212 executing housekeeper
 17372:20130122:202135.217 server #18 started [http poller #1]
 17375:20130122:202135.231 server #20 started [history syncer #1]
 17376:20130122:202135.236 server #21 started [history syncer #2]
 17369:20130122:202135.248 server #17 started [timer #1]
 17377:20130122:202135.253 server #22 started [history syncer #3]
 17378:20130122:202135.255 server #23 started [history syncer #4]
 17349:20130122:202135.302 server #3 started [poller #1]
 17350:20130122:202135.352 server #4 started [poller #2]
 17352:20130122:202135.418 server #6 started [poller #4]
 17351:20130122:202135.475 server #5 started [poller #3]
 17379:20130122:202135.536 server #24 started [escalator #1]
 17389:20130122:202135.539 server #25 started [proxy poller #1]
 17390:20130122:202135.542 server #26 started [self-monitoring #1]
 17341:20130122:202135.543 server #0 started [main process]
 17354:20130122:202135.614 server #8 started [unreachable poller #1]
 17353:20130122:202135.635 server #7 started [poller #5]
 17374:20130122:202135.674 server #19 started [discoverer #1]
--------------------------------------------------------------

なので、316、323、326、324、325 のプロセスがどの役割かをまずは見てもらうことで、どの役割のプロセスがメモリリークしていそうなのかが絞り込めます。
これらの情報をここに書いてもらえれば、過去のリリースですでに修正されていないか確認することが可能です。
例えば 2.0.5 や 1.8.16 では history syncer がメモリリークしていた問題が修正されていますので、バージョンアップする価値があります。

もっと深くコードレベルで調べようと思う場合は、debuginfo パッケージと valgrind を使って zabbix_server サービスを起動すると、メモリリークしている疑いのある箇所を出力してくれます。
ただ、非常に動作が重いし、それ以上はコードを読んで特定する必要があるので大変だとは思います。
それでもメモリリークかどうか確定させるには最も良い方法です。

ユーザー tsuzuki の写真
田中さんの書いているlibssh2のメモリリーク以外で、Zabbix Server側のメモリリークをリストアップしてみました。


■1.8.3〜1.8.16までで1.8系で修正されたZabbix Server側のメモリリーク
・1.8.16で history syncer でのメモリリークが修正 [ZBX-5988]
    発生条件は、トリガー条件式で"@"付きの正規表現を "regexp()", "iregexp()", "logeventid()" の関数内で使用している場合


■2.0〜2.0.5までで2.0系で修正されたZabbix Server側のメモリリーク
・2.0.5で history syncer でのメモリリークが修正 [ZBX-5988]
    発生条件は、トリガー条件式またはLLDで"@"付きの正規表現を "regexp()", "iregexp()", "logeventid()" の関数内で使用している場合
・2.0.3で history syncer、timer、escalator でのメモリリークが修正 [ZBX-5435]
    発生条件は、トリガー使っていると発生する可能性がある
ユーザー hiroyuki の写真

>TNK様、tsuzuki様
迅速な返答ありがとうございます。

使用しているバージョンは下記になります。
$ zabbix_server -V
Zabbix server v2.0.2 (revision 29214) (31 July 2012)
Compilation time: Aug 27 2012 15:10:50

sshについては、使用しております、libsshのバージョンは、1.2でした。。
なので、1.4.2以降にあげてみます。。
$ dpkg -l |grep libssh
ii libssh2-1 1.2.8-1 SSH2 client-side library

>■2.0〜2.0.5までで2.0系で修正されたZabbix Server側のメモリリーク
については、2.0.2から2.0.5に上げてみるのはよさそうですね。。

"@"付きの正規表現を どこかのトリガーで使ってないか確認してみます。

以上よろしくお願いします

ユーザー hiroyuki の写真

/var/log/zabbix_server.log
に、関しては、
1ヶ月以上前に再起動しており、起動時点のログは、なくなっておりました。。

手動再起動した後にどの役割のプロセスが高メモリ使用率なのか確認してみます。

ユーザー hiroyuki の写真

度々すみません、

zabbix_server再起動して、しばらくしてから、メモリ使用率の高いプロセスを確認してみたところ、
全て、history syncerの役割プロセスでした。

又、よく確認したところssh監視は使用していませんでした。失礼しました。

このことを踏まえると、
>■2.0〜2.0.5までで2.0系で修正されたZabbix Server側のメモリリーク
>・2.0.5で history syncer でのメモリリークが修正 [ZBX-5988]
> 発生条件は、トリガー条件式またはLLDで"@"付きの正規表現を "regexp()", "iregexp()", "logeventid()" の関数内で使用している場合
>・2.0.3で history syncer、timer、escalator でのメモリリークが修正 [ZBX-5435]
> 発生条件は、トリガー使っていると発生する可能性がある
こちらの可能性が高いのかなと思ってます。

history syncerとは、ログ収集プロセスなのでしょうか?
以前、ログ監視で、大量にログを読み込んでDBの容量が大きくなった経緯があり、history期間を1日にして暫定処置をしたと言うことがあります。
今もログは割と大量に受けてとしたら、メモリリークに関係あったりするでしょうか?

以上よろしくお願いします。

ユーザー tsuzuki の写真

Zabbix Server は収集した監視データを一旦メモリ上に保管するのですが、それを定期的にDBに書き込みしています。
このメモリ上からDBへ収集した監視データを書き込むのが history syncer の役割になります。
その処理の中で同時にトリガーの評価とかもしていますが、基本的にはDBへ監視データ書き込みの役割です。
ログ収集自体は別のプロセスの担当になります。

ただ、ログの量が多ければDBへの書き込みやトリガーの評価数も多くなるので、メモリリークが増えるという相関関係はありえます。

ユーザー hiroyuki の写真

>tsuzuki様

丁寧な返答ありがとうございます。なるほどです、
とりあえず、2.0.5にアップデートしました。しばらくしたら、結果をご報告したいと思います。

以上ですがどうぞよろしくお願い致します。

ユーザー hiroyuki の写真

お世話になっております、hiroyukiです。

メモリリーク止まりました!(2.0.2から2.0.5にしたことで解決しました)

良かったです、ありがとうございました!

今後ともどうぞよろしくお願いします。