Zabbix3.2から未復旧の障害イベントが大量にあるとWebインタフェースの表示が重くなります。
特に以下の画面は、カーソルがグルグル回って表示されなかったり、メニュー以外が真っ白になったり、500 internal server errorになったりします。使ってる環境によっては504 Gateway Timeoutも発生します。
- 「監視データ」「ダッシュボード」の障害Widget
- 「監視データ」「ホスト」
- 「監視データ」「障害」
上記の根本原因は未復旧の障害イベントが大量でphpから発行するSQLの応答が遅くてタイムアウトしたり、取得データ量が多すぎてphpでメモリ不足になったりするのが原因です。
と言う訳で…
Zabbix3.2以上を使用してる人はトリガー条件式と復旧条件式で自動的に障害イベントが回復するように設定しましょう。
復旧条件式でnodataを使って復旧させるのがお手軽ですが、nodataがアクティブ監視の場合、監視データの時刻が監視対象OSの時刻であるのに対し、トリガー評価はZabbixサーバのOS時刻で、時刻同期されていないと想定した動作にならないので、注意が必要です。
※:時刻同期していてもタイミングによっては想定外の動作になります。
え!既に未復旧の障害イベントがいっぱいあるんですけど!
そうか、手動クローズを実行すれば良いんですね!( ー`дー´)キリッ
はい、レッドカード
大量の未復旧の障害イベントを大量に手動クローズすると北斗神拳を会得したZabbixサーバが手動クローズSQL百裂拳をDBに打ち込みます。
※:百ではなく、万の単位を見たこともあり…億の単位も見たことあります。
打ち込まれたDBはCPU100%とか、メモリ使用率上昇とか引き起こします。DBの設定次第ではOOM-Killer喰らいます。
Zabbixサーバ"手動クローズSQL百裂拳"は自爆技ですので、絶対に止めましょう。
え!だから未復旧の障害イベントがいっぱいで困ってるんですよ!
「この千年、神も仏も見たことがない」 by 鬼滅
「ならば鬼になれば良いではないか」 by 鬼滅
標準的なZabbixの操作ではありませんがSQLで未復旧の障害イベントを鬼となって蹴散らしましょう。
※:注:正常なイベント・クローズではないので、「監視データ」「障害」の「表示:ヒストリ」で削除した未復旧のイベントが障害でデータ保存期間まで表示されます。
まずは以下でトリガーIDで発生しているイベントIDの最大を確認します。
SELECT MAX(eventid) FROM problem WHERE source=0 AND object=0 AND objectid=トリガーID;
こんな感じ
MariaDB [zabbix]> SELECT MAX(eventid) FROM problem WHERE source=0 AND object=0 AND objectid=16120;
+--------------+
| MAX(eventid) |
+--------------+
| 4 |
+--------------+
1 row in set (0.009 sec)
次に、eventidも指定して削除します。
DELETE FROM problem WHERE source=0 AND object=0 AND objectid=トリガーID AND eventid < xxxx limit 10000;
こんな感じ
MariaDB [zabbix]> DELETE FROM problem WHERE source=0 AND object=0 AND objectid=16120 AND eventid < 4 limit 10000;
Query OK, 1 row affected (0.014 sec)
limitは使用しているDBのチューニング次第ですけど、最初は1万の方が無難です。limitを使用してますので、「Query OK, 0 row」になるまで繰り返しましょう。
最大の1件残すのは、イベント表示とトリガーの状態を一致させるためです。
これをしないとトリガー表示とイベント表示が一致しなくなるので注意ください。
これで未復旧によるWebインタフェースの表示が重い事象は解決します。
まぁ、緊急対処方法なので、よい子のZabbixユーザは鬼になって未復旧の障害イベントを蹴散らさない事を祈ります。