こんにちは!現場でシステムの「心音」を聞き続けるオブザーバビリティ・アーキテクトの先輩です。
君が今、このブログを開いてくれたということは、夜中に突然飛んできたアラートに頭を抱えているか、あるいは「いつ爆発するか分からないZabbixの爆弾」を事前に拆そうと知恵を求めているところなんじゃないかな。よく来てくれたね。
監視ツールとして長く愛されているZabbixだけど、実は「デフォルト設定のまま本番運用すると、必ずどこかで限界を迎える」という、ちょっとしたじゃじゃ馬な一面があるんだ。
今日は、現場でエンジニアたちが最も頭を悩ませる「Zabbixの二大怪奇現象」――ヒストリキャッシュ不足とDB接続エラーを例に、その根本原因と、二度と夜間呼出を食らわないための極限チューニング術を、魂を込めて伝授しよう。
これをマスターすれば、毎日の運用作業が劇的に楽になるし、何より「Zabbixに詳しくて頼れるエンジニア」になれる。さあ、深呼吸して、一緒にコードと設定ファイルを紐解いていこう!
—
そもそも、Zabbixって何をしている奴なんだ?
初心者に向けて、まずはZabbixの本質をひとことで説明するね。
Zabbixとは、一言で言えば「システム全体の健康診断を24時間休まず行い、異常があれば即座にナースコールを押す仕組み」だ。
- メトリクス監視(数値の監視): CPU使用率、メモリ残量、ディスク容量などを定期的に「測る」。
- トリガー(判定): 「もしCPUが90%を超えたら異常とみなす」というルール。
- アクション(通知): 異常を検知したら、Slackやメールに「助けて!」と叫ぶ。
この一連のサイクルを裏で支えているのが、Zabbixサーバーであり、その記憶領域(キャッシュ)と背後のデータベース(MySQLやPostgreSQL)なんだ。ここが詰まると、監視システム自体が沈没するという、笑えない本末転倒が起きる。
—
トラブルシューティング第1の関門:「Zabbix cache usage is high」
症状:管理画面のダッシュボードが真っ赤に染まる
運用を始めてしばらく経つと、Zabbixの自己監視機能からこんな警告が飛んでくる。
> `Zabbix cache usage is high`
「おいおい、メモリはまだ余ってるのに、なんでだよ!」って叫びたくなるよね。
01. なぜこのエラーが起きるのか?(根本原因の解剖)
Zabbixサーバーは、監視対象から集めた膨大なデータ(メトリクス)や設定情報を、毎回ハードディスク(DB)に書きに行っていたら遅すぎて間に合わない。だから、一度メモリ上の専用領域(キャッシュ)にデータを溜め込んで、バッチ処理的にDBへ書き込む設計になっている。
この「溜め込むバケツ」のサイズが、監視するアイテムの数や頻度に対して小さすぎると、バケツが溢れかえる。これがヒストリキャッシュ不足の正体だ。
特に危険なのが以下の3つのキャッシュ領域:
1. HistoryCacheSize(数値データを一時保存するメインのバケツ)
2. HistoryIndexCacheSize(データを高速検索するための索引バケツ)
3. ValueCacheSize(トレンド計算や障害判定のために過去データを保持するバケツ)
02. 解決策:設定ファイル(`zabbix_server.conf`)の極限チューニング
さあ、実際に設定ファイルをいじろう。
設定ファイルは通常 `/etc/zabbix/zabbix_server.conf` にある。エディタで開いて、以下のパラメータを探してくれ。
> ⚠️ 注意: 値を変更した後は、必ず `systemctl restart zabbix-server` で再起動が必要だよ。
/etc/zabbix/zabbix_server.conf
【Before】デフォルト(数台の監視なら動くが、実務では即枯渇する)
HistoryCacheSize=8M
HistoryIndexCacheSize=4M
ValueCacheSize=8M
【After】中規模〜大規模システム向けの推奨値(例:メモリを贅沢に使って安全に回す)
数値データ用のバケツを 128MB に拡張
HistoryCacheSize=128M
索引用のバケツを 32MB に拡張(HistoryCacheSizeの1/4程度が目安)
HistoryIndexCacheSize=32M
過去データ保持用のバケツを 256MB に拡張(トレンドグラフを多用するならここを厚く)
ValueCacheSize=256M
先輩からのアドバイス:
「とりあえず大きくすればいいや」と `1G` などと巨大な値を設定するのは厳禁。OSの物理メモリ(RAM)の空き容量と相談しながら、徐々に引き上げるのがプロの作法だ。設定後は、Zabbix自体の内部グラフ(`Zabbix cache usage, %`)を見て、使用率が常に80%を下回っていることを確認しよう。
—
トラブルシューティング第2の関門:「DB connection failed」
症状:突然、すべての監視が沈黙する
ある日突然、ログファイル(`/var/log/zabbix/zabbix_server.log`)にこんな絶望的な文字が並ぶ。
> `[Z3001] connection to database ‘zabbix’ failed: [2003] Can’t connect to MySQL server on ‘localhost’`
01. なぜこのエラーが起きるのか?(根本原因の解剖)
Zabbixサーバーとデータベース(MySQL等)の仲が引き裂かれる原因は主に3つ。
1. DBのプロセス自体が死んでいる(メモリ不足でOOM Killerに殺された、または単純な障害)。
2. コネクション数の枯渇(Zabbixがデータベースに接続しすぎて、MySQL側が「もうこれ以上繋げないよ!」と門前払いしている)。
3. ネットワークタイムアウト(重いクエリが走りすぎて、DBの応答が待ちきれずに切断された)。
特に厄介なのが 「2. コネクション数の枯渇」 だ。Zabbixはプロセスフォークモデルを採用しており、多数のポーラー(データを取得するプロセス)が同時にDBへアクセスするため、DB側の最大接続数(`max_connections`)を圧迫しやすい。
02. 解決策:DB側とZabbix側の両面からのアプローチ
アプローチA:Zabbixサーバーからの接続数をコントロールする
`zabbix_server.conf` で、同時にデータベースを叩くプロセスの最大数を適切に制限しつつ、タイムアウトの猶予を持たせる。
/etc/zabbix/zabbix_server.conf
データベースとの接続が切れた際、再接続を試みるまでの秒数
DBKeepAlive=30
同時接続でDBをいじめないよう、ポーラーや歴史データの書き込みプロセスの数を最適化する
(CPUコア数や監視ホスト数に応じて調整してね)
StartPollers=50
StartPreprocessors=15
StartPollersUnreachable=10
アプローチB:MySQL/MariaDB側の限界値を引き上げる
データベース側が受け入れられる接続数の上限を広げよう。
MySQLの設定ファイル(`/etc/my.cnf` または `/etc/mysql/mysql.conf.d/mysqld.cnf`)をいじるよ。
[mysqld]
デフォルトの100〜150だと、Zabbixの本番運用ではすぐに枯渇する
max_connections = 500
コネクションエラーを防ぐためのバッファとタイムアウト調整
wait_timeout = 28800
interactive_timeout = 28800
設定を変えたら、MySQLを再起動するのを忘れないでね。
sudo systemctl restart mysqld
—
精度高い「HelloWorld」的 動作確認の作法
さて、設定を変えただけでは、本当に直ったか不安よね。
オブザーバビリティの世界では、「直したつもり」が一番の毒。確実に動いていることを自分の手で証明しよう。
ここでは、Zabbixが正しくメトリクスを収集し、キャッシュを消費し、DBに書き込めているかをテストする「極上のHelloWorld(疎通確認)」手順を教えるよ。
Step 1: 自作のカスタムメトリクス(UserParameter)を投げてみる
Zabbixエージェントを使って、手動でテスト用のデータをサーバーに送らせてみよう。
エージェントの設定ファイル(`/etc/zabbix/zabbix_agentd.d/test.conf` など)に以下を記述する。
「test.ping」というキーを叩かれたら、常に「1」を返すテスト用カスタムパラメータ
UserParameter=test.ping,echo 1
エージェントを再起動:
sudo systemctl restart zabbix-agent
Step 2: Zabbixサーバー側から直接データを引っ張ってみる(Zabbixゲットコマンド)
サーバーがエージェントと正常に通信できているか、コマンドラインから直接確認する。
zabbix_get -s 127.0.0.1 -k “test.ping”
これでコンソールに `1` と表示されたら、ネットワークと基本通信のHelloWorldは大成功だ!
Step 3: キャッシュとDBの稼働状態をログで追う
最後に、`zabbix_server.log` をリアルタイムで監視して、エラーがピタリと止まったことを確認する。
tail -f /var/log/zabbix/zabbix_server.log | grep -E “cache|error|failed”
ここにしつこいエラーが出なくなっていれば、君のチューニングは見事に成功している。おめでとう!
—
おわりに:監視ツールを飼い慣らすということ
Zabbixのような監視ツールは、いわば「システムという巨大な生き物の神経系」だ。
神経系であるはずの監視ツール自身が悲鳴を上げていたら、本番システムで何が起きているかなんて分かるはずもない。
今日学んだヒストリキャッシュの拡張とDB接続の最適化は、どんな現場でも必ず直面する「登竜門」だ。ここを自分の手で乗り越えた経験は、将来どんな高度なオブザーバビリティ基盤(Prometheus、Datadog、OpenTelemetryなど)を触ることになっても、必ず君の強力な武器になる。
焦らず、論理的に、一歩ずつ。
さあ、安心してコーヒーでも飲みながら、静寂を取り戻した美しいダッシュボードを眺めようか。