Zabbix の MySQL が重いのをどうにかして

Zabbix という様々なノードを監視するためのツールがある。オープンソースである。手軽にどんどん監視できるのでとてもステキである。僕も調子に乗って導入している。

現在40台ほどのPCサーバを監視というか日々の状態を蓄積しているのだが、このデータを蓄積しているすなわち Zabbix Server だが、近頃どうにも動きが遅い。 top などで状態を見ていると、あきらかに mysql が頑張りすぎているように見える。

mysql は CentOS5 付属のパッケージを入れてから全くいじっていないので様々なパラメータの詰めが甘いのであろう。 よろしいどうにかしよう。

と思っていたら、ZABBIX-JP のフォーラムにそのものずばりの内容があったのでこれに従って作業してみた。

まずは zabbix の DB のダンプを取ってから drop

# service zabbix_server stop
# mysqldump -uroot zabbix > zabbix.dump
# mysql -uroot
mysql> drop database zabbix;
mysql> quit
# service mysqld stop
# rm -rf /var/lib/mysql/ib_logfile0
# rm -rf /var/lib/mysql/ib_logfile1
# rm -rf /var/lib/mysql/ibdata1

ここで /etc/my.conf にパラメータ追加をする。 キャッシュサイズが小さいとディスクIOに依存しまくるので遅くなるのだという。innodb_buffer_pool_size の初期値は 8MB だそうだ。そんなばかな。メモリをたくさん積んでいるのに使われてないだと!というわけで増やすのだ。ついでに、何でもかんでも一つのファイルに詰め込むのを避けてもらう。以下のような値を my.conf の [mysqld] に追記だ。

innodb_file_per_table
innodb_buffer_pool_size=512M
innodb_log_file_size=128M

では起動してデータを戻そう。

# service mysqld start
# mysql -uroot 
mysql>create database zabbix;
mysql>grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix password';
mysql>flush privileges;
mysql>quit

ここででてくる 'zabbix password' というのは、/etc/zabbix/zabbix_server.conf の DBPassword= に書いてあるのをそのまま転記だ。

# mysql -uroot zabbix < zabbix.dump
# service zabbix_server start

これで全部フレッシュになって戻ってきたはずだ。自身で蓄積している状況を見てみよう。

まずは CPU Load。真ん中のへんのグラフが抜けてるのが作業中だ。停止していた時間だ。停止の前後で CPU Load がずいぶん低くなったのがわかるだろう。

つぎに Disk IO。これが顕著に出た。やはりキャッシュが効いてなかったのだ。そりゃあ遅いはずだ。メンテ前は 秒間10MBほどのデータ読み込みが発生している。これがメンテ終了後はキャッシュが効いたのだろう、秒間1MB以下に減っている。快適である。

どうにも重い。なんだこれは。と思ったならこういうメンテを試してみても良いだろう。くれぐれもバックアップは慎重に。