20
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

zabbixで6万itemに耐えれるようにパフォーマンスチューニングをしてみた

Posted at

zabbixで6万itemに耐えれるようにパフォーマンスチューニングをしてみた

TL;DR

Mysqlが仮想メモリで動いていてI/O wait多発。
Mysqlのメモリチューニングしたら上手くいった。

背景

zabbixで使用するitemが増える(現在6万ぐらい)につれてwebインターフェースが繋がらなくなることが多発。
自動復旧用にitemを設定しているためitem自体を減らすことが難しく、zabbixサーバー自体のチューニングをすることにしました。

使用環境

  • zabbix 3.4
  • AWS上のubuntu端末で運用
  • item 6万・ホスト数500程度
  • t2.largeで運用
  • zabbix proxyは使用せずzabbix serverのみの運用
  • apache2/zabbix server/mysqlの構成

調査

zabbixの標準的なログとして

  • apache2のログ /var/log/apache2/access.log
  • zabbix serverのログ /var/log/zabbix/zabbix_server.log
  • mysqlのログ /var/log/mysql/mysql.log

今回は事の発端がweb インターフェースから繋がらない、が問題だったのでapache2のログから調査を始めました。
/var/log/apache2/error.logに以下のようなログが吐かれてました。

[mpm_prefork:error] [pid 22269] AH00161: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting

このエラーはapacheのMaxスレッド数を超えてアクセスが来た時に吐かれるエラーになります。
じゃあこの時間にめっちゃアクセスが来てるのを調べるべく、/var/log/apache2/access.logのアクセス数をshellで解析

LOG_FILE=$1
function print_apachelog () {
    DATE=$1  #24/Oct/2018
    for h in {0..23};
    do
        if [ ${h} -le 9 ]; then
            h=0${h}
        fi
        for m in {0..59};
        do
            if [ ${m} -le 9 ]; then
                m=0${m}
            fi
            DATETIME=`echo "${DATE}:${h}:${m}"`
            COUNT=`cat ${LOG_FILE}  | grep -c ${DATETIME}`
            echo "${DATETIME} ${COUNT}"
        done
    done
}

print_apachelog 25/Oct/2018
print_apachelog 26/Oct/2018

上記みたいにざっくりとしたアクセス数を解析。
該当時間帯には100程度しかアクセス数が無い。。じゃあ次はzabbix serverとmysql。

zabbix serverのログには目立ったエラーログがない。。
なのでもっと多くの情報を得るべく、zabbixでzabbixのインフラ情報を得ることにしました。
zabbix server自体に
Template OS LinuxTemplate App Zabbix Serverのtemplateを追加。
標準的なcpu/memoryの状況とzabbixの内部チェックができます。
latest dataGraphから各メトリクスの状況を確認できます

内部チェックの詳しい仕様は以下で確認できます
https://www.zabbix.com/documentation/3.4/manual/config/items/itemtypes/internal

該当時間帯に発生していたこととしては

  • cpu load average が5に達している
  • cpu I/O waitの値も高い(60 ~ 80%)
  • zabbixのqueueがめちゃくちゃ溜まってる(多い時で4000!!)
  • zabbix history write cacheの値が該当時間帯に0%になっている
  • history syncer processesもbusyになっていた。

どうやら

  1. zabbixサーバー上のhistory syncer processesがI/O待ちで滞留
  2. httpコネクションも滞留する
  3. apacheのMaxリクエスト制限に引っかかりweb インターフェースが使えなくなる
    という流れのようです。

ではhistory syncer processesはどのような役割をしているのか?
zabbix japanの社長によると

収集したデータをメモリキャッシュからDBに書き込むためのプロセス

とのこと。なるほど。ということは

  • zabbix serverのprocessが仮想メモリ上で動いており、I/Oが waitが発生
  • Mysqlが仮想メモリ上で動いており、I/Oが waitが発生

の二択に絞られそうです。なんとなくcpuを食っているのはMysqlが怪しい気がするので、Mysqlのcpu使用率を調べてみます
zabbixのitemに以下のようにitemを追加。

  • zabbxi agent item
  • system.run[ps auwx | grep -v grep | grep mysql | awk '{print $3}']

結果としてMysqlがcpu食ってました。実memory自体は全然消費していなかったので、仮想メモリでsqlを実行しているので、I/Oが数値が跳ね上がったで間違いなさそうです。

結論

メモリの空きも結構あったので実際の変更点としては

innodb_buffer_pool_size 1024 -> 4096

に変更をしました。これだけ調査したのに、変更点これだけ。。
zabbixに繋がらなくなった時はまずはDB起因を疑ってもいいかもしれません。

実際のzabbix用のmysqlのチューニングは以下のサイトが参考になりそうです。
https://www.percona.com/blog/2014/11/14/optimizing-mysql-zabbix/

20
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?