zabbix速度チューニング

こんにちは。このところ私のzabbix(1.4.5)が遅いようなので相談します。

OverviewやScreenなどの表示に近頃10秒ほどかかっています。
ホストは30台+監視していて、すべてテンプレート(LinuxとSNMPv2)を使用しています。
Screenは9枚、Mapは6枚登録しました。

topコマンドを見るとmysqldが常にCPUを50%以上使っているようです。
mysqldの設定ファイルはmy-innodb-heavy-4G.cnfをベースに使っています。
(my-huge.cnfなども試して見ましたが効果はイマイチでした)
zabbix、mysql共にエラーは出力されていません。

CPUはセレロンDの3G、メモリは500MB、OSはFedora8です。
一応Fedoraをアップグレードしたりもしてみたのですが変化なし・・。
記憶は定かではないのですが、一度mysqlのパスワード設定を失敗したあたりから、
急に速度が遅くなったような気がしています。
(その頃ホストは15台ぐらいだったと思います)

何かパフォーマンスを向上させられるようなテクがあれば教えてください。
よろしくおねがいします。

コメント表示オプション

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

始めましてsktさん、KAZと申します。

topコマンドを見るとmysqldが常にCPUを50%以上使っているようです。

私が使っている環境でもMySQLが遅いとOverviewの表示が遅くなってました。

長い間(データ保持期間以上)使っているか、ホスト・アイテム削除を何回も行っている状況でデータベースのデフラグをかけていない場合はデフラグを行ってみてはどうでしょうか?

ユーザー skt の写真

返信ありがとうございます。
DBはあまり詳しく無いのですが、
optimize tableというコマンドでいいのでしょうか。
一応/var/lib/mysql/zabbix/を覗いてみたのですが、
各frmファイルのサイズは8Kぐらいのようです。

あとibdata1というファイルが気になったのですが・・・
サイズが2.9Gになっていました。
普通このくらいのサイズなのでしょうか?

ユーザー skt の写真

報告です。
アドバイスに従ってoptimize tableを全テーブルに実行して見たところ、
反応がかなり良くなりました。
しばらくはこれで様子を見てみようと思います。
ありがとうございました。

(ibdata1の方はなぜか4.9Gに膨らんでしまいちょっと気になるところですが・・)

ユーザー KAZ の写真

アドバイスに従ってoptimize tableを全テーブルに実行して見たところ、反応がかなり良くなりました。

なるほど、インデックスがソートされていなかったようですね。
ちなみに私はALTER TABLEコマンドを使用しています。
optimize tableコマンドもALTER TABLEコマンドにマップしていると有りましたので同じかもしれませんが、データファイルのデフラグは「ALTER TABLE tablename TYPE=InnoDB 」と指定するみたいです。

(ibdata1の方はなぜか4.9Gに膨らんでしまいちょっと気になるところですが・・)

ちなみにmy.cnfに下記の設定はありますでしょうか?
<code>
[mysqld]
innodb_file_per_table
</code>

innodb_file_per_tableを使用していないとデータがテーブル単位に作成されず、ibdata1がデータファイルとして全てのデータを保持します。
また、デフラグしてもファイルサイズが小さくなりません。
※:逆に巨大化する事も…(汗)

innodb_file_per_tableはcreate databaseする前に設定して無いと有効になってくれないので、その場合は以下の手順が必要です。
1.innodb_file_per_tableをmy.cnfに設定
2.データベースをバックアップ
3.zabbixデータベース削除
4.MySQL停止
5.ibdata1データファイルとib_logfileログファイル2るを削除
6.MySQL起動
7.zabbixデータベース登録
8.データベースリストア

上記を一回した後は(月1とか)定期的にALTER TABLEコマンドでメンテナンスをしてやればデータが加速的に増えていく事もないかと…

ユーザー skt の写真

アドバイスありがとうございます。
今トライしている最中なのですが、一度データベースを削除した後は、
バックアップしたデータをインポートして元にもどしてやればいいのでしょうか?

ユーザー KAZ の写真

私がやった時は下記の様な手順でした。
参考になれば幸いです。

<code>
# service zabbix_server stop

# mysqldump -u root -p<root password> -x -F zabbix > db.dmp

# mysql -u root -p<root password>
mysql>drop database zabbix;
mysql>quit

# service mysqld stop

# rm -rf <MySQLデータディレクトリ>/data/ib_logfile0
# rm -rf <MySQLデータディレクトリ>/ib_logfile1
# rm -rf <MySQLデータディレクトリ>/ibdata1

# service mysqld start

# mysql -u root -p<root password>
mysql>create database zabbix;
mysql>grant all privileges on zabbix.* to zabbix@localhost identified by '<zabbix password>';
mysql>flush privileges;
mysql>quit

# mysql -u root -p<root password> zabbix < db.dmp

# service zabbix_server start
</code>

ユーザー skt の写真

ありがとうございます。
上記試して見てさらにalter tableもやり直してみました。
特に2回目以降のアクセスが高速になったように思います。
mysqldがtopコマンドの常に上位に出てきていましたが、
今は更新時しか上がって来ません。
ibdata1は現在4.4Gです。(リストア直後は2.4Gでした)
ちょっとこれについてはよく分からんのでほっとこうと思います・・・。

ユーザー KAZ の写真

上記試して見てさらにalter tableもやり直してみました。
特に2回目以降のアクセスが高速になったように思います。
mysqldがtopコマンドの常に上位に出てきていましたが、
今は更新時しか上がって来ません。

デフラグの効果があったようで幸いです。

ibdata1は現在4.4Gです。(リストア直後は2.4Gでした)
ちょっとこれについてはよく分からんのでほっとこうと思います・・・。

そのサイズだと「innodb_file_per_table」が有効になってないような…

宜しければ、my.cnfとデータディレクトリ配下のls結果、データディレクトリ/zabbix配下のls結果を見せて頂く事は可能ですか?

ユーザー skt の写真

返信ありがとうございます。
一応自分のやったコマンドを確認したんですが、合っているような気がします。
どこかでトチったのかもしれません・・・。
よろしくお願いします。

root@zabbix zabbix]# cat /etc/my.conf | grep -e ^[^$^#]
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
old_passwords=1
innodb_file_per_table
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
port = 3306
socket = /var/lib/mysql/mysql.sock
[mysqld]
port = 3306
socket = /var/lib/mysql/mysql.sock
back_log = 50
max_connections = 100
max_connect_errors = 10
table_cache = 2048
max_allowed_packet = 16M
binlog_cache_size = 1M
max_heap_table_size = 64M
sort_buffer_size = 8M
join_buffer_size = 8M
thread_cache_size = 8
thread_concurrency = 8
query_cache_size = 64M
query_cache_limit = 2M
ft_min_word_len = 4
default_table_type = MYISAM
thread_stack = 192K
transaction_isolation = REPEATABLE-READ
tmp_table_size = 64M
log-bin=mysql-bin
log_slow_queries
long_query_time = 2
log_long_format
server-id = 1
key_buffer_size = 32M
read_buffer_size = 2M
read_rnd_buffer_size = 16M
bulk_insert_buffer_size = 64M
myisam_sort_buffer_size = 128M
myisam_max_sort_file_size = 10G
myisam_max_extra_sort_file_size = 10G
myisam_repair_threads = 1
myisam_recover
skip-bdb
innodb_additional_mem_pool_size = 16M
innodb_buffer_pool_size = 2G
innodb_data_file_path = ibdata1:10M:autoextend
innodb_file_io_threads = 4
innodb_thread_concurrency = 16
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 8M
innodb_log_file_size = 256M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[isamchk]
key_buffer = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M
[myisamchk]
key_buffer = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M
[mysqlhotcopy]
interactive-timeout
[mysqld_safe]
open-files-limit = 8192

[root@zabbix zabbix]# pwd
/var/lib/mysql/zabbix
[root@zabbix zabbix]# ls -l
合計 796
-rw-rw---- 1 mysql mysql 8716 2008-07-16 14:24 acknowledges.frm
-rw-rw---- 1 mysql mysql 8714 2008-07-16 14:24 actions.frm
-rw-rw---- 1 mysql mysql 9002 2008-07-16 14:24 alerts.frm
-rw-rw---- 1 mysql mysql 8684 2008-07-16 14:24 applications.frm
-rw-rw---- 1 mysql mysql 8748 2008-07-16 14:24 auditlog.frm
-rw-rw---- 1 mysql mysql 8730 2008-07-16 14:24 conditions.frm
-rw-rw---- 1 mysql mysql 8818 2008-07-16 14:24 config.frm
-rw-rw---- 1 mysql mysql 65 2008-07-16 10:15 db.opt
-rw-rw---- 1 mysql mysql 8746 2008-07-16 14:24 dchecks.frm
-rw-rw---- 1 mysql mysql 8734 2008-07-16 14:24 dhosts.frm
-rw-rw---- 1 mysql mysql 8738 2008-07-16 14:24 drules.frm
-rw-rw---- 1 mysql mysql 8836 2008-07-16 14:24 dservices.frm
-rw-rw---- 1 mysql mysql 8782 2008-07-16 14:24 events.frm
-rw-rw---- 1 mysql mysql 8764 2008-07-16 14:27 functions.frm
-rw-rw---- 1 mysql mysql 8962 2008-07-16 14:27 graphs.frm
-rw-rw---- 1 mysql mysql 8898 2008-07-16 14:27 graphs_items.frm
-rw-rw---- 1 mysql mysql 8596 2008-07-16 14:27 groups.frm
-rw-rw---- 1 mysql mysql 8642 2008-07-16 14:27 help_items.frm
-rw-rw---- 1 mysql mysql 8628 2008-07-16 14:27 history.frm
-rw-rw---- 1 mysql mysql 8766 2008-07-16 16:42 history_log.frm
-rw-rw---- 1 mysql mysql 8628 2008-07-16 16:42 history_str.frm
-rw-rw---- 1 mysql mysql 8688 2008-07-16 16:44 history_str_sync.frm
-rw-rw---- 1 mysql mysql 8688 2008-07-16 16:44 history_sync.frm
-rw-rw---- 1 mysql mysql 8654 2008-07-16 16:44 history_text.frm
-rw-rw---- 1 mysql mysql 8628 2008-07-16 16:44 history_uint.frm
-rw-rw---- 1 mysql mysql 8688 2008-07-16 16:45 history_uint_sync.frm
-rw-rw---- 1 mysql mysql 8908 2008-07-16 16:45 hosts.frm
-rw-rw---- 1 mysql mysql 8644 2008-07-16 16:45 hosts_groups.frm
-rw-rw---- 1 mysql mysql 8952 2008-07-16 16:45 hosts_profiles.frm
-rw-rw---- 1 mysql mysql 8656 2008-07-16 16:45 hosts_templates.frm
-rw-rw---- 1 mysql mysql 8682 2008-07-16 16:45 housekeeper.frm
-rw-rw---- 1 mysql mysql 8850 2008-07-16 16:45 httpstep.frm
-rw-rw---- 1 mysql mysql 8686 2008-07-16 16:45 httpstepitem.frm
-rw-rw---- 1 mysql mysql 9048 2008-07-16 16:45 httptest.frm
-rw-rw---- 1 mysql mysql 8686 2008-07-16 16:45 httptestitem.frm
-rw-rw---- 1 mysql mysql 8682 2008-07-16 16:45 ids.frm
-rw-rw---- 1 mysql mysql 8668 2008-07-16 16:45 images.frm
-rw-rw---- 1 mysql mysql 9980 2008-07-16 16:45 items.frm
-rw-rw---- 1 mysql mysql 8652 2008-07-16 16:45 items_applications.frm
-rw-rw---- 1 mysql mysql 8682 2008-07-16 16:45 mappings.frm
-rw-rw---- 1 mysql mysql 8784 2008-07-16 16:45 media.frm
-rw-rw---- 1 mysql mysql 8926 2008-07-16 16:45 media_type.frm
-rw-rw---- 1 mysql mysql 8790 2008-07-16 16:45 node_cksum.frm
-rw-rw---- 1 mysql mysql 8808 2008-07-16 16:45 node_configlog.frm
-rw-rw---- 1 mysql mysql 9072 2008-07-16 16:45 nodes.frm
-rw-rw---- 1 mysql mysql 8810 2008-07-16 16:45 operations.frm
-rw-rw---- 1 mysql mysql 8704 2008-07-16 16:45 profiles.frm
-rw-rw---- 1 mysql mysql 8700 2008-07-16 16:45 rights.frm
-rw-rw---- 1 mysql mysql 8662 2008-07-16 16:45 screens.frm
-rw-rw---- 1 mysql mysql 9054 2008-07-16 16:45 screens_items.frm
-rw-rw---- 1 mysql mysql 8684 2008-07-16 16:45 service_alarms.frm
-rw-rw---- 1 mysql mysql 8826 2008-07-16 16:45 services.frm
-rw-rw---- 1 mysql mysql 8686 2008-07-16 16:45 services_links.frm
-rw-rw---- 1 mysql mysql 8732 2008-07-16 16:45 services_times.frm
-rw-rw---- 1 mysql mysql 8646 2008-07-16 16:45 sessions.frm
-rw-rw---- 1 mysql mysql 8710 2008-07-16 16:45 slides.frm
-rw-rw---- 1 mysql mysql 8636 2008-07-16 16:45 slideshows.frm
-rw-rw---- 1 mysql mysql 8802 2008-07-16 16:45 sysmaps.frm
-rw-rw---- 1 mysql mysql 8984 2008-07-16 16:45 sysmaps_elements.frm
-rw-rw---- 1 mysql mysql 8898 2008-07-16 16:45 sysmaps_links.frm
-rw-rw---- 1 mysql mysql 8744 2008-07-16 16:45 trends.frm
-rw-rw---- 1 mysql mysql 8672 2008-07-16 16:46 trigger_depends.frm
-rw-rw---- 1 mysql mysql 8982 2008-07-16 16:46 triggers.frm
-rw-rw---- 1 mysql mysql 8862 2008-07-16 16:46 users.frm
-rw-rw---- 1 mysql mysql 8628 2008-07-16 16:46 users_groups.frm
-rw-rw---- 1 mysql mysql 8598 2008-07-16 16:46 usrgrp.frm
-rw-rw---- 1 mysql mysql 8602 2008-07-16 16:46 valuemaps.frm

[root@zabbix zabbix]# cd ..
[root@zabbix mysql]# ls -l
合計 4309140
-rw-rw---- 1 mysql mysql 5242880 2008-07-17 09:00 ib_logfile0
-rw-rw---- 1 mysql mysql 5242880 2008-07-17 09:01 ib_logfile1
-rw-rw---- 1 mysql mysql 4397727744 2008-07-17 09:00 ibdata1
drwx------ 2 mysql mysql 4096 2008-04-09 10:31 mysql
srwxrwxrwx 1 mysql mysql 0 2008-07-16 10:11 mysql.sock
drwx------ 2 mysql mysql 4096 2008-04-09 10:31 test
drwx------ 2 mysql mysql 4096 2008-07-16 16:46 zabbix
[root@zabbix mysql]#

ユーザー KAZ の写真

どうやら、Innodb設定がうまく言ってないかと…

気になる点があります。
my.cnfですが、[mysqld]セクションが2つあります。

最初の[mysqld]セクションにinnodb_file_per_tableエントリが指定されていますが、次の[mysqld]セクションにdefault_table_type = MYISAMが指定されています。

多分これでテーブルがMyISAMになってます。
取り合えず[mysqld]セクションは不要かと…

MyISAMとInnodbについてですが、一般的には下記のような事が言われています。

・MyISAM
 Read は速いけどテーブルロックのため並行性が低い。

・InnoDB
 MyISAMよりRead は遅いけど行レベルロックなので、並行性が高い。

私が使った感想ですが一年以上使い続けるならデータ量的にも処理的にもInnodbをお勧めします。

my.cnfですが、デフォルトのmy.cnfにinnodb_file_per_tableを加えただけのものでお試し頂ければ、Innodb化されibdata1が小さくなるかと思います。
その後、状況に応じて構成にあわせた各種設定をmy.cnfに取り込んだ方が良いかと思います。

ユーザー skt の写真

アドバイスありがとうございます。
・・・間抜けでした。おっしゃるとおり2箇所[mysqld]セクションがありました。
デフォルトのmy.cnfにinnodb_file_per_tableを追加しただけのものを試してみた所、
驚くほど早くなりました。表示までの時間が1/3程度にはなったかと。
ibdata1のサイズも一晩走らせてみて2.3Gをキープしています。
ありがとうございました。

ユーザー skt の写真

今色々見ているのですが、
なぜかevent.phpだけ応答がずーっと返って来ません・・。
再起動などしてみたのですが効果なし。
エラーもログに吐かれてません。
今までためていたイベントが多すぎるのでしょうか。
select * from events;
をするととんでもない数が出てきます・・・。

ユーザー skt の写真

自己レスでございます。
とりあえずeventsテーブルのデータを全部削除することで
乗りきりました・・。
ちょっとデータが多すぎたようです。

mysql> delete from events;
Query OK, 1396853 rows affected (49 min 15.02 sec)