ログ監視で大量のログが出るとヒストリの追加が遅くなる

こんにちは。

ログ監視で、大量のログが出た場合にヒストリの追加が遅れてしまいます。
いくつか試してみたのですが、どうもうまくいきません。
他に手はあるでしょうか?

■環境
OS:CentOS 6.4
Zabbixサーバー:2.0.5
Zabbixエージェント:2.0.5 (サーバーと同じホスト)
MySQL:5.1.69 (サーバーと同じホスト)
↑Zabbixは http://kodai74.blogspot.jp/2012/05/zabbix-siarpm.html を参考にrpmからインストールしました。
MySQLはyumからインストールしました。

現在監視用に二台のサーバーがあり、それぞれに同じ設定が入っています(自動で同期などはしません)。
片方をアクティブ機、もう片方をスタンバイ機としています。実運用中なのですが他にテスト機が無いので、スタンバイ機をテスト用としています。ですが、スタンバイ機とはいえ運用中なので、できればあまり大掛かりな変更(新たなパッケージのインストールなど)は避けたいところです。

MySQLもテスト用のエージェントも、サーバーと同じホストです。
(なのでネットワーク関連の問題は無いと思っています)

テスト用のアイテム設定は以下の通りです。
 タイプ:Zabbixエージェント(アクティブ)
 キー:log[/tmp/testlog,"xxx"]
 データ型:ログ
 更新間隔:60秒

■テストの内容
/tmp/testlog に自作ツールを使って大量のログを一気に書き込みます。
ログの形式は
hh:mm:ss.nnnnnn (NNN) xxx
で、hh:mm:ss.nnnnnnはログを書き込んだ時間(nnnnnnはマイクロ秒)、NNNは連番です。
書き込んだ行数は15000行ほど。ツールによるログの書き込み自体は1秒もかかりません。
#実際には短時間で40万行くらいのログが出たことがあるんですが、
#15000行程度でも遅れることは十分確認できたので、テストはこれで行いました。
#また、テスト用なので、運用で実際に出るログとは違います(実際のログは一行200バイト程度)。

その後、以下のコマンドで、history_log内のxxxの行のうち、最新のものを1秒おきに表示し続けます。
while [ 1 ]; do
sleep 1; date;
echo "SELECT id,clock,value FROM history_log WHERE value LIKE '%xxx%' ORDER BY clock DESC, ns DESC LIMIT 1\G" | mysql -u root zabbix;
done
データの更新が無ければ同じ内容が延々と表示されることになります。

■理想の動作
MaxLinesPerSecondが100で更新間隔が60秒なので、1分当たり6000行のデータがhistory_logテーブルに追加される。つまり、1分経過ごとに上記コマンドの出力でNNNの値が6000ずつ増えていく。
その後1分間NNNは同じままで、1分後にはNNNがさらに6000増える。

■実際の動作
上記コマンドで出力されるNNNは毎秒毎秒増えていき、1秒当たり約40~60程度ずつ増えていきました。当然、後になるほどヒストリの追加が遅れていくわけです。history_logテーブルへの追加が遅れているので、Web画面のヒストリでもやはり遅れて表示されます。また、(このテストでは設定していませんが)トリガーの判定→障害時のアクションもその分遅くなることになります。

clockの値(=Zabbixサーバーが処理した時刻という認識)を見てみると、
・NNNが6000大きくなるまでclockの値は同じまま(clockが同じデータが6000個続いている)
・NNNが6000大きくなるごとに約60増えている(次の6000個は前の6000個よりもclockが60大きい)

Zabbixサーバー自体は問題なく1分置きに6000行ずつ受け取って、一瞬で(遅れなく)処理できているように思えるので、history_logテーブルにデータを追加する部分がボトルネックになっているのかなと思うわけです。

関係無さそうなこと。
・キューの画面では、キューは溜まっていないようでした(基本的に全て0で、たまに5秒のところに1が出るだけ)。
・テスト中、CPUやメモリは空きが70%~80%程度ありましたので、これが足りていないということもなさそうです。

また、ほぼ同様のlog[/tmp/testlog,"yyy"]というアイテムを作成しておいて、xxxのログの追加が遅れている最中にyyyのログを一行だけ/tmp/testlogに書き込みましたが、これはすぐにhistory_logテーブルに追加されました。→別のアイテムだと影響を受けない?

■最初の設定値
zabbix_server.conf
チューニング系は全てデフォルト

zabbix_agentd.conf
MaxLinesPerSecondは特に指定していない(デフォルトの100のはず)

my.cnf(抜粋)
innodb_file_per_table
innodb_buffer_pool_size=512M
innodb_log_file_size=64M

■試してみたこと
Zabbixサーバー
・StartDBSyncersを4から8にした
・StartTrappersを5から10にした
・HistoryTextCacheSizeを16Mから64Mにした
変更後zabbix_serverの再起動はしています。

MySQL
・innodb_buffer_pool_sizeを512MBから2GBにした
 ※メモリは全部で3.7GBくらいあるのですが、データベース以外にもサービスがあるので、80%よりは少なくしました
・innodb_log_file_sizeを64MBから128MBにした
 →set global innodb_fast_shutdown=0; としてからmysqldを停止
 →ib_logfile0とib_logfile1を削除してmysqldを起動
・InnoDB Pluginを使うようにした(以下の二行を追加)
 ignore-builtin-innodb
 plugin-load=~
 ※http://kodai74.blogspot.jp/2013/11/zabbix10000.html からコピペ
変更後mysqldの再起動はしています。

上記を全て変更してみましたが、ほぼ変化なしでした。
yyyのログだとすぐに追加されるのも同じでした。

■その他
調べた範囲で他に効果がありそうなのは以下の二つですが、どちらも難しいので試せていません。
・テーブルのパーティショニング・圧縮
 →あれこれ読んでみたのですが、まだよく理解できていません。
  試行錯誤できればいいのかもしれませんが、実運用中なので難しいです。
・Zabbix2.2にする
 →効果があることがはっきりすれば可能かもしれませんが、なかなかバージョンアップは難しいです。
  個人的にはぜひやってみたいのですが・・・。

もうこれくらいしか手はないのでしょうか?
他に何かチューニングの余地はありますか?
そもそもデータの追加は、1秒に50個程度しかできないものなんでしょうか?

#大量のログを出さないようにするor別のスクリプトなどでログをチェックして結果のまとめを送信する
#などの案も出てはいるのですが、却下されそうな雰囲気です。

書きながら気づいたんですが、2.0系の最新にするくらいならOK出そうな気もします。多少はマシになるのかな・・・?

情報が足りないなどあればご指摘ください。
よろしくお願いします。

コメント表示オプション

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

ディスクのI/Oの性能がボトルネックになってしまっている可能性
も考えられますが、CPUのiowaitの割合はどの程度になっています
か?

Zabbixサーバの各プロセスのbusy状況やキャッシュの利用率とかの
状態は確認することも可能でしょうか?
内部チェック(Zabbixインターナル)のzabbix[]アイテムを利用して取得
できると思います。

CPUの処理能力に余裕があり、ディスクのI/Oがボトルネックになっ
ているのであれば、圧縮は有効かもしれません。
Zabbix 2.2に上げても、キャッシュによって設定値や少量のアイテ
ムデータの受け取る部分での改善はみられると思いますが、history
の大量書き込みに関しては、あまりパフォーマンスは改善しないの
ではないでしょうか。

ユーザー heya の写真

TNKさん、ありがとうございます。
後で試してまた結果をお知らせします。

ユーザー heya の写真

こんにちは。

諸事情により随分遅くなってしまいましたが、再度試してみました。
・MySQL と Zabbix サーバーの設定は元に戻した
・アイテム設定は前回のまま
・今度は、Zabbix 自体の監視と MySQL の監視も追加した(※)
・やはり前回同様15000行のログを書き込み、history_log に書かれた最後のログを 1 秒おきに表示してみる

※デフォルトのテンプレートは全て削除していたので、よその Zabbix の Template App Zabbix Server と Template App MySQL を見て、(手動で)アイテムだけ同じ設定を追加しました。zabbix_agentd.conf には
UserParameter=mpt-status,sudo mpt-status --autoload -s
と書いてあります。

ファイル自体への書き込みは1秒もかからず完了、 history_log に15000行全部書き込みが終わったのは、行の追加が始まってから6分20秒後でした。そして最後の行が実際に書き込まれた時間は clock の値より約4分後でした(理想なら2分半程度で終わるはずで、実際に書き込まれた時間と clock の差は最大でも60秒以内のはずです)。

このときの関係ありそうな値は以下の通りでした。
・項目にもよりますが、6分20秒の間、だいたい値は同じでした。
・【】は普段のおよその値です。
  (h) は一時間おきに値が大きくなっており(ハウスキーパー?)、そのときの値です。
  (max) や (min) は、一度そういうことがあったという値(でも異常な動きはしていない(と思う))。

system.cpu.util[,iowait]     10% 【1 (h 4~6)】
system.cpu.util[,idle,avg1]   77% 【98 (min 72)】
vm.memory.size[pavailable]  72% 【75 (min 70)】

zabbix[process,history syncer,avg,busy]      25% 【0.8 (max 20)】
zabbix[process,icmp pinger,avg,busy]        98.5~100% 【95~100】
zabbix[process,poller,avg,busy]             3.5~4.5% 【3 (max 35)】
zabbix[process,unreachable poller,avg,busy]  100% 【50~100 (min 0)】
zabbix[wcache,history,pfree]               92% 【99-100】
zabbix[queue]                          0~2 【5~12 (max 250)】
zabbix[queue,10m]                      0 【0 (max 247)】
zabbix[wcache,text,pfree]                 98.4%【99.5~100】

mysql.status[Com_begin]    40qps 【2 (max 25)】
mysql.status[Bytes_received] 34KBps 【6.2 (h 15~20)】
mysql.status[Bytes_sent]    78KBps 【20 (h 25~35】
mysql.status[Com_commit]   40qps 【1.9 (max 25)】
mysql.status[Com_insert]    45qps 【1.3】
mysql.status[Questions]     250qps 【50 (h 200~250)】
mysql.status[Com_select]    70qps 【25 (h 150~200)】
mysql.status[Com_update]   54qps 【13.5】

>ディスクのI/Oの性能がボトルネックになってしまっている可能性
>も考えられますが、CPUのiowaitの割合はどの程度になっています
>か?
iowait は 10% 程度でした。ただ、これをどう解釈(判断)したらいいのかがよく分かりません。
I/O が遅くて 10%(も?)待たされている、ということでしょうか?

(参考 http://qa.atmarkit.co.jp/q/604
>CPUがidleであった時間のうち、I/Oが進行中であった時間は I/O wait として
>記録されます。

MySQL の書き込み関連は値が増えているようですが、これがどの程度の値なのかという感覚がよく分かりません。
Zabbix の方は history syncer が特に増えていますが、25% ということはまだ 75% は余裕があるということですよね?

>CPUの処理能力に余裕があり、ディスクのI/Oがボトルネックになっ
>ているのであれば、圧縮は有効かもしれません。

圧縮は、my.cnf に以下のように書き、
----
innodb_file_per_table ←これはもう書いてある
innodb_file_format=Barracuda
----
mysqld を再起動して、↓を実行すればいいのでしょうか?
alter table history_log ROW_FORMAT=Compressed;
(参考 http://www.zabbix.jp/node/2631

また、便乗ですみませんが、 icmp pinger が 100% に近いみたいですが、 zabbix_server.conf で StartPingers を増やした方がいいんでしょうか?(今はデフォルトの 1 です)
#unreachable poller が多いのは、現在いろいろテスト中で、
#つながらないホストが多数あるからだと思います。

質問ばかりですがよろしくお願いします。

ユーザー TNK の写真

iowaitが10%程度であれば、極端にディスクのI/Oで処理が遅延
しているというほどではないでしょう。

Trapperプロセスのbusy度合いはどの程度ですか?
キーは、zabbix[process,trapper,avg,busy] です。

あと、StartPingersは増やした方が良いでしょう。
100%になってしまうと、取得できずにキューに溜まってしまって、
設定した間隔で値を取得できなくなっている可能性が考えられ
ます。

ユーザー heya の写真

TNK さん、コメントありがとうございます。

zabbix[process,trapper,avg,busy] は普段が 0.08% くらいでこれまでの最大が 1.4%、そしてテスト時は約 0.14% でした(値が小さいし普段とそれほど変わってなかったので関係ないかなと思って書いていませんでした・・・すみません)。

念のため、取得していた値で上に書いていないものも書いておきます。
zabbix[process,alerter,avg,busy]            0.03% 【0~0.5 (max 1.69)】
zabbix[process,configuration syncer,avg,busy]  0.14% 【0.14 (max 0.22)】
zabbix[process,escalator,avg,busy]          0~0.03% 【0.03~0.05 (max 1)】
zabbix[process,housekeeper,avg,busy]       0% 【0 (h 25~50)】
zabbix[process,self-monitoring,avg,busy]      0.02% 【0.02 (max 0.07)】
zabbix[process,timer,avg,busy]              0.04% 【0~0.02 (max 0.2)】
zabbix[process,trapper,avg,busy]            0.14% 【0.08 (max 1.4)】
zabbix[wcache,trend,pfree]                 97.58% 【97.58~】

I/O でないとすると、他に何か考えられますか?

StartPingers については、増やすように提案してみます。

ユーザー KAZ の写真

heyaさん、TNKさん

横から失礼します。


■理想の動作
MaxLinesPerSecondが100で更新間隔が60秒なので、1分当たり6000行のデータがhistory_logテーブルに追加される。つまり、1分経過ごとに上記コマンドの出力でNNNの値が6000ずつ増えていく。
その後1分間NNNは同じままで、1分後にはNNNがさらに6000増える。

ZabbixエージェントからZabbixサーバに送る動作ですが、上記と異なるかと…

■zabbix_agentd.confで関係する値
MaxLinesPerSecond:読込バッファの行保持数
BufferSize:送信する行数
BufferSend : 送信間隔

Zabbixエージェントは監視間隔で読込バッファ(MaxLinesPerSecond ☓ 4)にログを読み込みます。(デフォルト:400行)
※:それ以上は読み込みません。

Zabbixサーバへの送信は以下の条件をクリアした時に送信します。
・読込バッファが空じゃない
・BufferSize / 2の行数が読込みバッファに溜まっている(デフォルト:50行)
・前回の送信からBufferSendに指定されている秒数が経過している。(デフォルト5秒)

と言う訳で、更新間隔が60秒でzabbix_agentd.confの関連の設定がデフォルトの場合、
1アイテム毎に1回の送信に最大400行をZabbixサーバに送信します。

ログ監視アイテムが1つなら、更新間隔60秒で400行が送信されます。

なので、読込が遅いようでしたら、MaxLinesPerSecondを増加させると1回のログ取得量が上がります。

ユーザー heya の写真

KAZさん、ありがとうございます。

確認ですが、
>Zabbixエージェントは監視間隔で読込バッファ(MaxLinesPerSecond×4)にログを読み込みます。(デフォルト:400行)
こういう理解で合ってますか?
・バッファに読んだ後でアイテムで指定したパターンにマッチするかを判定する
・マッチしたものを送信するので、必ず400行送信されるわけではなく、最大で400行送信される可能性がある
・更新間隔が60秒であれば「1秒当たり100行」は「60秒当たり6000行」なので、400行あっても全部送信できる
・更新間隔が1秒なら、400行あったら(MaxLinesPerSecond が 100 なので)最初の100行だけを送信して、残りは次回に回される

とにかく、MaxLinesPerSecond と更新間隔を変更して試してみました。

ログに15000行書き込んだときに以下のスクリプトを実行して直接 history_log テーブルを見た結果を添付します。
まとめは後ろに書きますが、この結果から何か分かることはありますでしょうか?
------------------------------
#!/bin/sh
sql="select clock,ns,value from history_log where value like '%xxx%' order by clock desc, ns desc limit 1"
while [ 1 ]; do
now=`date +%H:%M:%S`
result=`echo $sql | mysql -u root --skip-column-names zabbix`
echo [$now] $result
sleep 1
done
------------------------------
最初の投稿でも書きましたが、一応出力の見方を例で書いておきます。
例:[14:50:44] 1420695923 699563968 14:45:10.003028 (13494) xxx
  [14:50:44] → 実行した時刻(date コマンドの結果※)
  1420695923 → clock の値(Zabbix サーバーが処理した時刻?)
  699563968 → ns の値
  14:45:10.003028 → 【ログの内容の先頭部分】ログを記録した時刻
  (13494) → 【ログの内容の続き】何行目のログか
   xxx → 【ログの内容の続き】固定

※sleep 1 としていますが、SQL の実行に時間がかかっているためか、必ずしも 1 秒ずつ大きくなるのではなく、2 秒大きくなることもあります。

以下、結果のまとめです。

■MaxLinesPerSecond 100、更新間隔 60
最初の書き込み 16:10:14
最後の書き込み 16:16:29
→書き込みに要した時間は 6分15秒

clock がほぼ同じもの(1420701011,1420701012)が6000行書き込まれ、
その後 clock が約60増えたもの(1420701072)が6000行書き込まれ(たぶん)、
さらに clock が約60増えたもの(1420701132)が3000行書き込まれていました。
→clock 60秒で6000行(これは MaxLinesPerSecond(100) * 60 と同じ)

■MaxLinesPerSecond 1000、更新間隔 60
最初の書き込み 16:21:47
最後の書き込み 16:27:58
→書き込みに要した時間は 6分11秒

15000行全ての clock が同じでした。
→clock 60秒で MaxLinesPerSecond(1000) * 60 = 60000行?

■MaxLinesPerSecond 100、更新間隔 1
最初の書き込み 15:54:01
最後の書き込み 16:00:25
→書き込みに要した時間は 6分24秒

clock は少しずつ大きくなっています。
全体で見ると、5行目で 1420700041、15000行目で 1420700190 。
約150秒大きくなっています。
→だいたい clock 1秒当たり100行(これは MaxLinesPerSecond と同じ)

■MaxLinesPerSecond 1000、更新間隔 1
最初の書き込み 14:45:10
最後の書き込み 16:27:58
→書き込みに要した時間は 6分11秒

clock が同じものは、だいたい1000行ぐらいずつ続いています。
全体で見ても、2行目で 1420695910、15000行目で 1420695924 。
約15秒大きくなっています。
→だいたい clock 1秒当たり1000行(これは MaxLinesPerSecond と同じ)

■その他
>ログ監視アイテムが1つなら、更新間隔60秒で400行が送信されます。
>なので、読込が遅いようでしたら、MaxLinesPerSecondを増加させると1回のログ取得量が上がります。
とのことですが、MaxLinesPerSecond を増やしたり更新間隔を 1 にしたりしても、
ログを書き終わるまでにかかる時間はそれほど変化がありませんでした。
15000行で6分強なので、60秒当たりだと2500行弱ということになり、400行よりは多くなります。

実時間ではなく clock で見ると、更新間隔60秒の場合は1分経過ごとに (MaxLinesPerSecond * 60) 行ほど記録されていました。

そもそも clock (と ns)の値は Zabbix サーバーで処理した時刻と思っているのですが、これは正しいですか?

またしても質問ばかりですが、よろしくお願いします。

ユーザー KAZ の写真

heyaさん

>こういう理解で合ってますか?
>・バッファに読んだ後でアイテムで指定したパターンにマッチするかを判定する
>・マッチしたものを送信するので、必ず400行送信されるわけではなく、最大で400行送信される可能性がある
いえ、マッチしたもののみバッファに読み込むはずです。

>・更新間隔が60秒であれば「1秒当たり100行」は「60秒当たり6000行」なので、400行あっても全部送信できる
ソース再確認しました。
1アイテム更新間隔1回でBufferSize行を送信します。(デフォルト100行)
なので、更新間隔が60秒であれば、「1アイテムで更新間隔当たり100行」となります。(400行間違いでした、すいません。)

>・更新間隔が1秒なら、400行あったら(MaxLinesPerSecond が 100 なので)最初の100行だけを送信して、残りは次回に回される
読み込みバッファ行数と送信行数は別パラメータです。わかりにくいですが…A(^^;
・MaxLinesPerSecond:読込バッファの行保持数
・BufferSize:送信する行数
・BufferSend : 送信間隔

更新間隔単位に読み込みバッファ(MAX:MaxLinesPerSecond☓4)に400行あったら最初の100行(送信行数:BufferSize)だけを送信して、残りは次回に回されます。

>■その他
>>ログ監視アイテムが1つなら、更新間隔60秒で400行が送信されます。
>>なので、読込が遅いようでしたら、MaxLinesPerSecondを増加させると1回のログ取得量が上がります。
>とのことですが、MaxLinesPerSecond を増やしたり更新間隔を 1 にしたりしても、
>ログを書き終わるまでにかかる時間はそれほど変化がありませんでした。
>15000行で6分強なので、60秒当たりだと2500行弱ということになり、400行よりは多くなります。
BufferSizeが低いためにZabbixエージェントでログは読んでいるけれどもs,送信待ちになっていると思います。

送信行数:BufferSizeを増やしてみてください。
※:MaxLinesPerSecond>= BufferSizeが効率が良いです。
BufferSizeを増やしすぎるとZabbixエージェント・アクティブ・プロセスからZabbixサーバへの通信時間が長くなって、全体的なパフォーマンスが下がるので徐々に上げてみてください。

>実時間ではなく clock で見ると、更新間隔60秒の場合は1分経過ごとに (MaxLinesPerSecond * 60) 行ほど記録されていました。
>
>そもそも clock (と ns)の値は Zabbix サーバーで処理した時刻と思っているのですが、これは正しいですか?
エージェントがの取得した時間のはずです。

また、ZabbixエージェントからZabbixサーバに送られた値はトラッパプロセスが受け取ると直ぐにDBにかかれず値(バリュー)キャッシュに積まれます。
その後に、History syncerプロセスが定期処理で値キャッシュから情報を取得し、DBに書き込みます。

ユーザー heya の写真

KAZさん、ありがとうございます。

私がいろいろ勘違いしていた部分があるようですね・・・。

>送信行数:BufferSizeを増やしてみてください。
>※:MaxLinesPerSecond>= BufferSizeが効率が良いです。

増やしてみたのですが、相変わらず全部書き込まれるまで6分強かかりました。
詳細は省きますが、こんな感じです(どれも BufferSend はデフォルトの 5 です)。
BufferSize 200、MaxLinesPerSecond 100、更新間隔 60 → 6分18秒
BufferSize 1000、MaxLinesPerSecond 100、更新間隔 60 → 6分43秒
BufferSize 1000、MaxLinesPerSecond 1000、更新間隔 60 → 6分11秒
BufferSize 1000、MaxLinesPerSecond 1000、更新間隔 1 → 6分16秒
BufferSize 10000、MaxLinesPerSecond 1000、更新間隔 1 → 6分13秒

BufferSize の最大は 65535 まで指定できるようですが、10000 でダメならそこまで増やしてもあまり効果が無さそうな気もします。
なぜ全然変わらないのでしょうか?
もしかして、zabbix_agentd.conf を書き換えてからエージェントを再起動しても、しばらく値が反映されないとかありますか?

実時間で考えると、仮に6分15秒=375秒とすると、15000÷375=40 で、だいたい1秒当たり40行ずつ書き込んでいる計算になります。

ちなみに、iowait は最大で10~12% 程度、zabbix[process,history syncer,avg,busy] も最大で 25% 程度、zabbix[process,trapper,avg,busy] は 0.1~0.4% 程度と、BufferSize を増やす前とほとんど同じでした。

ユーザー KAZ の写真

heyaさん

>増やしてみたのですが、相変わらず全部書き込まれるまで6分強かかりました。
Zabbixエージェント側の問題じゃないようですね…
因みに更新間隔1秒にしてもBufferSendが5秒だと1回の送信後5秒は送信されませんので、注意してください。
DBのclockとnsがZabbixエージェント側の読みこんだ時の時間なので、それが同じ時刻=一気に読まれた数になります。

もしかするとText historyキャッシュとかValueキャッシュの値を増やした方がよいかもしれません。
※:Zabbixサーバ側のキャッシュが少なくてDBに書くのが遅くなっているかも…

>もしかして、zabbix_agentd.conf を書き換えてからエージェントを再起動しても、しばらく値が反映されないとかありますか?
それは無いです。A(^^;

ユーザー heya の写真

KAZさん、いろいろありがとうございます。

BufferSize 10000、MaxLinesPerSecond 1000、BufferSend 5、更新間隔 1 のままで、 zabbix_server.conf の HistoryCacheSize(デフォルト 8M)と HistoryTextCacheSize(デフォルト 16M)をどちらも 64M にして Zabbix サーバーを再起動しましたが、書き込みにかかる時間は 6分17秒 と、ほぼ同じでした。
例によって iowait その他の各種値もこれまでとほぼ同じ程度の変化でした。

いったい何が原因なんでしょうね・・・。

>>もしかして、zabbix_agentd.conf を書き換えてからエージェントを再起動しても、しばらく値が反映されないとかありますか?
>それは無いです。A(^^;
これについては、安心しました。

ユーザー heya の写真

ミスです。削除できないので・・・。

ユーザー KAZ の写真

heyaさん

長くなったのでスレッド変えます。A(^^;

Zabbixの設定はあっているようなのでOSかMySQL側の設定ですかね…

ちなみにMySQLのDBが置いてあるディスクのフォーマットってext3ですか?ext4ですか?
ext4だとI/Oバリヤーが聞いてしまうので書き込み遅くなるはずです。

参考URL
http://db2.jugem.cc/?eid=2485

ユーザー heya の写真

KAZさん、ありがとうございます。いろいろ参考になります。

ext4 です。
試すなら barrier=0 をつけてマウントしなおし、ということになるんでしょうが・・・、スタンバイ機とはいえ一応実運用中なのでちょっと怖い。上と相談してみて、可能そうなら試してみます。

ユーザー KAZ の写真

heyaさん

>試すなら barrier=0 をつけてマウントしなおし、ということになるんでしょうが・・・、スタンバイ機とはいえ一応実運用中なのでちょっと怖い。上と相談してみて、可能そうなら試してみます。
そうですね。

一つの要因ですので、ext4のI/Oバリア無効にしても劇的に改善はしないかもしれませんが…
OS起動流の電源断なんて起きない(電源引っこ抜き等)場合は運用としてI/Oバリア無効もあるかと…A(^^;

ユーザー heya の写真

こんにちは。
#また間違えてスレッドを切ってしまいました。

許可が出たので試してみました。
が、結果は変わらず・・・。

barrier=0
HistoryCacheSize 64M、HistoryTextCacheSize 64M
BufferSize 10000、MaxLinesPerSecond 1000、更新間隔 1
→6分23秒
各種値も barrier=0 なしの場合とほぼ同じ。

ダメ元で、上に加えて MySQL の設定も変更してみました。
innodb_buffer_pool_size=512M → 2GB
innodb_log_file_size=64M → 128M
InnoDB Plugin を使うようにする
→7分05秒
やっぱりダメでした。
少し遅くなっていますが、今日は(私とは別に)あれこれ試験をしていて、障害/回復がたくさん出ていたようなので、そのせいかもしれません。
#一応追加で2回ほどテストしてみましたが、7分38秒、7分15秒と、やはり遅くなっていました。

MySQL の設定変更後の各種値は mysql.status[Bytes_sent] が 10KBps くらい増えましたがその程度、mysql.status[Bytes_received] を含めそれ以外の mysql.status はほとんど変化なし、iowait や zabbix[process,~,avg,busy] 、CPUやメモリの空き率もほぼ同じでした。
(MySQL の設定を戻してみても、mysql.status[Bytes_sent] は増えたままなので、この設定変更は関係ないのかも。来週になって mysql.status[Bytes_sent] が戻っていれば、もう一回テストするかもしれません)

ユーザー heya の写真

こんにちは。

tcpdump とってみました。
結果を添付します(ホスト名部分は xxxxx に変えています)。

設定を再度書いておきます。
  innodb_buffer_pool_size=512M
  innodb_log_file_size=64M
  InnoDB Plugin 未使用
  barrier=0
  HistoryCacheSize 64M、HistoryTextCacheSize 64M
  BufferSize 10000、MaxLinesPerSecond 1000、更新間隔 1
#mysql.status[Bytes_sent] は戻っています。

何もせずに tcpdump の出力を見ていると、普段は2分おきに14パケットずつ何らかの通信をしているようです。

15000行のログを書き込んで、例のシェルスクリプトで history_log のデータを表示しながら眺めていると、書き込み開始が 11:27:28 、終了が 11:34:06 で、かかった時間は6分38秒でした。

その前後の tcpdump を見ると、何回かに分けて通信しているようでした。
左から順に、一連の通信の時刻、直前との時間差、パケット数 です。
11:26:27.868266~11:26:27.869358 -  14  (1)
11:27:23.878719~11:27:23.878984 56秒 14  (2)
11:27:28.991972~11:27:28.994151 5秒 24  (3)
11:27:29.066524~11:27:29.066606 1秒 5   (4)
11:27:33.381343~11:27:33.441521 4秒 51  (5)
11:27:38.551889~11:27:38.626595 5秒 94  (6)
11:27:43.644239~11:27:43.659578 5秒 34  (7)
11:28:27.666787~11:28:27.667556 44秒 14  (8)
11:30:27.684194~11:30:27.685069 2分 14  (9)
11:32:27.702030~11:32:27.702944 2分 14  (10)
11:34:27.720597~11:34:27.721682 2分 14  (11)
11:36:27.742698~11:36:27.743913 2分 14  (12)

想像ですが、(1) は普段の通信、(2) はデータ送信前の準備か何か?、(3)~(7) がログ監視のデータ送信、(8) で以降がまた普段の通信ではないかと思います((2)~(8) の時間差を足してみると 120 になるので)。
この想像が正しいなら、エージェントからサーバーへのデータ送信は30秒弱で終わっているわけで、サーバー側で遅くなっているということになります。

zabbix_server.conf で DebugLevel=4 にすると、何か分かりますかね?
ログのこの辺に注目して見たらいいとかあればお願いします。
#ただ、ログは膨大な量になるだろうから、人間の目で追いきれるかは疑問ですが。

ユーザー kdkzyjp の写真

heyaさん KAZさん TNKさん

横から失礼します。

mysqlはデフォルト設定だと大量の書き込み処理はすごく遅いため
一回に大量の書き込みが発生する処理をする場合
下記のパラメータを設定にしていただくと解決するかもしれません。

innodb_flush_log_at_trx_commit = 2

ユーザー kdkzyjp の写真

すみません記載漏れました

innodb_flush_log_at_trx_commit = 2

の設定ですが、my.cnfの[mysqld]にて記載する必要があります。

オンラインのまま設定変更するようであれば

mysql> set global innodb_flush_log_at_trx_commit=2

で可能です。

ディスクへの書き込みタイミングを調整する設定になりますので、
サーバダウン時に最後の1秒間のデータがロストする可能性がありますので
本番適用をする場合は注意いただければと思います。

ユーザー heya の写真

kdkzyjpさん、情報ありがとうございます。

信頼性を取るか速度を取るか、ですね。
でもここの環境だとアクティブ/スタンバイといいつつどちらもほぼ同じデータを取得しているはずなので、試してみる価値はありそうです。上と相談してOKが出れば試してみようと思います。

ユーザー heya の写真

こんにちは。

他の条件は同じままで、 innodb_flush_log_at_trx_commit = 2 にして試してみました。
効果抜群でした!

11:07:46~11:08:05 → 19秒(1秒1000行と考えるとだいたい理想通り)
[11:07:44] 1421807258 643881776 11:27:23.070762 (15000) xxx
[11:07:46] 1421892463 71713949 11:07:42.811563 (1) xxx
[11:07:48] 1421892463 71713949 11:07:42.811563 (1) xxx
[11:07:51] 1421892463 83096319 11:07:42.811712 (6) xxx
[11:07:53] 1421892463 83096319 11:07:42.811712 (6) xxx
[11:07:55] 1421892463 83096319 11:07:42.811712 (6) xxx
[11:07:57] 1421892467 165663785 11:07:42.850210 (4001) xxx
[11:07:59] 1421892469 312675934 11:07:42.879021 (7000) xxx
[11:08:01] 1421892472 360068145 11:07:42.900516 (9241) xxx
[11:08:03] 1421892474 502202771 11:07:42.926975 (12000) xxx
[11:08:05] 1421892477 555273699 11:07:42.955702 (15000) xxx

他の設定値も変更しつついろいろテストしてみましたが、 zabbix_server.conf の HistoryCacheSize と HistoryTextCacheSize 、 zabbix_agentd.conf の BufferSize、 /var のマウントオプション barrier は、(この環境では)関係無かったようで、最終的に効果があったのは innodb_flush_log_at_trx_commit=2 だけだったみたいです。

これで、更新間隔と MaxLinesPerSecond の値によって、当初の想定通りの動きをすることが確認できました。

実際 innodb_flush_log_at_trx_commit=2 で運用するかどうかは分かりませんが、とにかく解決です。
みなさんありがとうございました。

ユーザー TNK の写真

ご参考までに、以前、Zabbix用のMySQL設定として話題になった
ブログをご紹介しておきます。

Optimizing MySQL for Zabbix
http://www.percona.com/blog/2014/11/14/optimizing-mysql-zabbix/

--- 追記 ---
もう一つ、Zabbixのバージョンが古いので、Zabbix自体のキャッシュ
処理の改善によって傾向は変わってきているかもしれませんが、大規
模環境の参考になるかもしれませんので、こちらもご紹介しておきます。

Zabbixで10,000台のサーバーを監視する
http://kodai74.blogspot.jp/2013/11/zabbix10000.html