Zabbixを利用していて、仕様はそこそこなのにやたら遅い。Webフロントの詰まりや、"Utilization of history syncer processes over 75%"などの警告が出る。
CPUもメモリも優先度余裕あるのに…これ、DB周りが原因かもと詳しく調べてみた。
発見したポイント
MariaDBの innodb_buffer_pool_size
が、なんと 128MB のまま。これが大問題だった。
innodb_buffer_pool_size って何者なのか
ざっくり言うと:
「InnoDB のデータやインデックスをメモリに保持するためのキャッシュプールの大きさ」
データベースの実態はディスクベース。これをこまめに読み書きするのは非実用的なので、InnoDBは可能な限りメモリにだけ管理させる。
その主役が innodb_buffer_pool
であり、そのサイズを指定するのが innodb_buffer_pool_size
。
小さいと何が起きるのか
Zabbixの場合、つまり:
- 多数の INSERT (history 系) が DB に飛ぶ
- MariaDBがそれをメモリでうまくさばけない
- ディスクへの直接書きが増える
- 結果、I/O で詰まる
これが「Utilization of history syncer processes over 75%」の原因である可能性大。
実際の現場
# grep StartHistoryPollers /etc/zabbix/zabbix_server.conf
StartHistoryPollers=50
# MariaDB側
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
-> 128MB
完全にバランスがおかしい状態。。。
解決策
innodb_buffer_pool_size
を増やす
# /etc/my.cnf
[mysqld]
innodb_buffer_pool_size = 4G
メモリに余裕があれば 8G もOK
StartHistoryPollers
を減らす
StartHistoryPollers=12
DBが受け渡れる範囲に要調整
innodb_log_file_size
も見直し
innodb_log_file_size = 512M
書き込み性能の向上
まとめ
- Zabbixが遅い時は DB周りも見るべし
-
innodb_buffer_pool_size
は InnoDBデータベースの性能の要 - 小さすぎると、いくらCPUやメモリに余裕があっても、Zabbixは遅くなる
- 詰まってるのは「ZabbixではなくMariaDB」かも