Zabbixで使うDB接続数

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

現在運用しているZabbixで「mysql_connect(): Too many connections [include/db.inc.php:77]」が発生してしまっています。
ZabbixサーバとMySQLは同じサーバに収容しており、MySQLのmax_connections設定は512です。

構築しているサーバはZabbixで使うデータベースのみが存在するので、Zabbixか管理者が利用するMySQLクライアントからしかアクセスされません。
調べてはみたのですが、Zabbixで使うMySQLの接続数の算出方法がわからず、どの程度の値が適正値なのか判断できない状況です。

zabbix_server.conf内でデフォルトから大きくしたスレッド関連の設定値は下記のとおりです。
・StartPollers=300
・StartTrappers=200
・StartPingers=50
・StartHTTPPollers=100
・StartDBSyncers=100

Zabbixの構築パラメータから同時接続数の適正値を求めることは可能なのでしょうか?
もし可能であれば算出方法などアドバイスいただけると助かります。

コメント表示オプション

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

zabbix_serverプロセスからMySQLに接続する最大数は、StartDBSyncers
の値になったと思います。
Zabbixを利用する場合、Webフロントエンドからもアクセスしますので、
それらの数が影響しているかもしれません。

情報として、

 ・利用されているOSやバージョン
 ・Webサーバとして何を利用しているか
 ・Zabbixのバージョン
 ・Zabbixのインストール方法(ソースからかRPMを利用してか)
 ・ZabbixのWebフロントエンドを利用されている利用者数

などもお教えいただけませんでしょうか?

あと、MySQL側のログにも何か出力されていないかご確認ください。

ユーザー mkt の写真

コメントありがとうございます。
下記回答いたします。

・利用されているOSやバージョン
 RHEL6.3
・Webサーバとして何を利用しているか
 Apache HTTP Server
・Zabbixのバージョン
 2.0.8
・Zabbixのインストール方法(ソースからかRPMを利用してか)
 yumでのインストール
・ZabbixのWebフロントエンドを利用されている利用者数
 正確にはわかりませんが多くても数十人程度

MySQLにはバイナリログ領域がFullになったとのメッセージがありました。
ディスクフルについては領域確保やファイル削除で対応しています。

ちなみにMySQLクライアントで show processlist; すると300前後の行が選択されます。

ユーザー TNK の写真

Apacheの同時接続数関連の設定はどう設定されていますか?
例えば、MaxClientsなど。

ユーザ数が数十人であったとしても、ブラウザからは同時に複数の
コネクションが張られる場合があるので、ユーザ数よりも大きな数
でのhttpdへの同時接続が発生する場合があります。

Apache + PHPの場合、最大MaxClientsの数のDB接続が求められたと
思いますので、zabbix_serverの分に加えてMaxClientsの数を加え
た数以上のDB接続を用意することが必要になったと思います。

Apacheの設定も確認してみてください。

MySQLへのアクセスの処理が終わっているにも関わらず、コネクション
が残ってしまっているような場合は、wait_timeoutの時間を設定して、
idle状態が続いたらコネクションを切るような設定を追加しても良いか
もしれません。

ユーザー mkt の写真

MaxClientsは256に設定されています。
と、いうことは
 MaxClients 256 + StartDBSyncers 100 = 356
前後のDB接続が最大で発生すると見込まれるということなんでしょうか。

ちょっと解せないのはMySQLのmax_connection=512で枯渇してしまったことです。
Apache側のコネクションがクローズされず残ってしまっているのでしょうか。
そんなことはないと信じたいのですが…。

wait_timeoutは短くしてみた(15分に設定)のですが
[Z3005] Query failed: [2006] MySQL server has gone away
が発生したのでデフォルトの8時間に戻しています。
(フォーラムの別投稿で「デフォルト推奨」と見かけたのでそのとおりにしました)

ユーザー TNK の写真

TCP/IPでのコネクションであれば、netstat -aeとかで、
どのユーザでの接続がわかると思います。

lsofとかと組み合わせれば、プロセスも特定できるはず
ですので、何がそんなにMySQLに接続しているのかを確認
してみてください。

ユーザー mkt の写真

色々とアドバイスありがとうございました。
いただいた内容で調査を進めてみます。

ユーザー mkt の写真

本件、リオープンさせて下さい。
調査を進めていますが、同様の問題でMySQLの最大接続数に達していしまい、Zabbixが停止する現象が再現しました。

DBの接続数とzabbixのプロセス数を調べてみると、zabbixからの接続がほとんどであることがわかりました。

mysql> select count(*) from information_schema.processlist where user = 'zabbix';
+----------+
| count(*) |
+----------+
| 758 |
+----------+
1 row in set (0.00 sec)

ps aux | grep httpd | wc -l
42
# ps aux | grep zabbix_server | wc -l
766

DBSyncers設定は100、httpdのMaxClientsは300なのでそれらを足しても700は超えないと思います。
これら2つ以外にMySQLの接続を利用するプロセスはあるのでしょうか?

また不定期にzabbix-serverがログを残さずに停止するのですが、これが原因の可能性は考えられるでしょうか?

ユーザー TNK の写真

MySQLに対する監視アイテムとしては、どのようなものを設定され
ていますか?

DBSyncersが利用するのは、zabbix_serverプロセスが収集してきた
情報を保存したり、Webフロントエンドで設定した情報を読み込ん
だりするのに利用します。
それら以外にも、監視のアイテムによっては、Pollerなどからも、
MySQLにアクセスする場合があります。

MySQLに対する監視アイテムを設定していないか、設定しているの
であれば、どのようなアイテムを設定しているのかをご確認くださ
い。

information_schema.processlistテーブルからuserで絞り込むだけ
ではなく、どのようなコマンドを実行しているかとか、どこからア
クセスしてきているかとかなども合わせて確認してみてください。

また不定期にzabbix-serverが停止するのですが、これが原因の可能性は考えられるでしょうか?

Zabbixサーバのログに何も出力されずにですか?
ログ何らかの出力があったのであれば、それをご提示ください。

zabbix_serverのプロセス数が700以上になっているのはmako-2さん
ご自身で、zabbix_server.confで各種プロセスを多数起動するよう
に設定されているからです。

ユーザー mkt の写真

返信ありがとうございます。

MySQLに対する監視アイテムとしては、どのようなものを設定されていますか?

MySQLの監視は行っていませんでした。
Zabbix Serverとは別のサーバ(用途はいろいろ)に対する監視を行っています。
監視の種類はPing、SNMP、Webなどさまざまです。

それら以外にも、監視のアイテムによっては、Pollerなどからも、
MySQLにアクセスする場合があります。

恐らくこの原因のように思います。
lsofでMySQLのローカルソケットを利用しているプロセスを確認したところ、zabbix_server.confで起動するプロセスの合計値とほぼ一致しました。

また不定期にzabbix-serverが停止するのですが、これが原因の可能性は考えられるでしょうか?

Zabbixサーバのログに何も出力されずにですか?
ログ何らかの出力があったのであれば、それをご提示ください。

異常終了した旨のログは出力されていませんが、下記のようにエラーになったりしてはいました。

1626:20140117:060134.312 [Z3005] query failed: [1205] Lock wait timeout exceed
ed; try restarting transaction [update ids set nextid=nextid+1 where nodeid=0 an
d table_name='events' and field_name='eventid'] 10054:20140117:060327.463 Starti
ng Zabbix Server. Zabbix 2.0.8 (revision 38017).

ただ、このようなログが出力されているのが全てではなく、エラーログではないログの直後に落ちている場合もあります。

16596:20140116:174158.893 cannot send list of active checks to [xxx.xxx.xxx.xxx]:
host [hostname] not found
16673:20140116:17 22393:20140116:180536.956 Starting Zabbix Server. Zabbix 2.0.8 (revision 38017).

※Startログは停止したので起動した時のログです。

zabbix_serverのプロセス数が700以上になっているのはmako-2さんご自身で、zabbix_server.confで各種プロセスを多数起動するように設定されているからです。

こちらは納得です。
ご指摘ありがとうございました。

ユーザー TNK の写真

申し訳ありません。
DBSyncer以外もDBに接続して処理するようになっていたようです。
各プロセスの情報同期にDBを介して処理していたのを忘れていまし
た。

ですので、Pollerなど各種プロセスの数を増やすのであれば、
その分のMySQLに対するコネクション数を確保することが必要そう
です。

ユーザー mkt の写真

色々と教えて頂いてありがとうございました。
おかげさまですっきりしました。

突然死についてはコアダンプを採るなど対応策を検討してみます。
Zabbix自身の監視内容を見てもCacheを使い果たしていたりもしないようなので、いまひとつプロセスが落ちる原因がつかめないので。

ユーザー TNK の写真

異常終了でたまに見かけるのは、メモリ管理関連での不具合ですが、
明確なメモリアクセス違反などのエラーメッセージが出ていないよ
うですので、ZabbixよりもOSに何らかの問題がでているのかもしれ
ません。

その時刻に、/var/log/messagesには何も出力されていませんか?

特にOS側に問題がないようであれば、直接この異常終了の解決がリ
リースノートには見当たらないものの、重要なセキュリティFixな
どもあったりしますので、2.0.10へのアップグレードも検討されて
みてはいかがでしょうか。

ユーザー mkt の写真

/var/log/messagesにも特に異常なメッセージは表示されていません。(SNMPTrap受信メッセージが普通に表示されていたり)
バージョンアップについては事情により簡単にはできないのでしばらく様子を見ようと思います。
(max_connections増加後は落ち着いています)

ユーザー mkt の写真

Got signal [signal:15(SIGTERM),sender_pid:9344,sender_uid:0,reason:0]. Exiting ...

こういったログが連発してzabbixが再起動することがあるのですが、何か関係あるでしょうか…
ただ落ちる直前のログは正常動作に見える場合もあるのでこれでは特定できないですよね。
なにかわかったら報告します。