MySQLバージョンアップ後のディスクI/O増加について(ver 5.1→5.6)

いつもお世話になっております。

Zabbix Web画面上の「最新データ」画面のレスポンス向上を期待して
MySQLをCentOS 6.5デフォルトの5.1から最新の5.6にアップデートを行いました。
(order by時のLIMIT句のパフォーマンス向上の恩恵を受けるため)

バージョンアップによって、パフォーマンスを向上することは叶ったのですが
以下の事象が発生しており、原因を突き止めたいと思い投稿させてもらいます。

□パージョンアップ後発生した事象
 Zabbix ServerのDiskI/O(Writeのみ)が常に発生するようになった。

 ※vfs.dev.write[,sps,avg1]の値
 バージョンアップ前:
  通常時)10~100 sector 程(ほぼ皆無)
  housekeeper動作時)100K sector
 バージョンアップ後:
  通常時)150K sector 程
  housekeeper動作時)500K sector

バージョンアップ前後で、ホストやアイテム等は増やしておらず、
監視方法も変更していないため、MySQLバージョンアップにによる
デフォルトパラメータの変化によるものだと思われますが、
どのパラメータが起因しているのか分からず、ご助力いただけないでしょうか。
現状、これが原因でパフォーマンスが劣化しているとは感じられませんが
今後ホスト・アイテムともに数倍に増やしていく予定なため、抑えられえる
負荷は可能な限り抑えたいと思っております。

□環境
 OS:CentOS 6.5
 Zabbix:2.2.3
 Zabbix 登録ホスト数:約300
 Zabbix 登録アイテム数:約55000
 Zabbix 登録トリガー数:約15000
 Zabbix 1秒あたりの監視項目数:661
 MySQL:5.1.71→5.6.17
 MySQL Storage Engine:InnoDB
 MySQL my.cnf:添付ファイルをご確認ください(その他はデフォルト設定です)
 その他:Zabbixの以下履歴系のテーブルは、range(clock)によりpartition化しています(1partition/1日)
  (history / history_uint / history_str / history_log / history_text / trends / trends_uint)
  
  
ご教授のほど、よろしくお願い致します。

コメント表示オプション

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

パラメータ的には、特に問題はないように見受けられますが、
具体的に、どのような手順で5.1.71から5.6.17まであげられ
ましたか?

例えば、5.1から5.6直接のアップグレードは推奨されていない
ということも聞いたことがあるので、5.1 -> 5.5 -> 5.6と段階
を踏んでバージョンアップされたかと、mysql_upgradeなどを
どのタイミングで実行されたかとかも関係があるかもしれません。

とはいえ、何らかの障害が発生している可能性も考えられない
わけではないので、MySQLのログにも何らかのエラーや警告など
出力されていないかも確認してみてください。

ユーザー TF0814 の写真

返信ありがとうございます。

5.1→5.6は推奨されてないのですね・・・確認不足でした・・・
(検証環境なので、安易に作業してしまいました)

手順は以下のように実施しました。

1.zabbix関連サービス停止
2.zabbix DBバックアップ
 mysqldump -uroot zabbix > zabbix.dump
3.zabbix DB削除
 drop database zabbix;
4.mysqld停止
5.yumリポジトリインストール
 yum install http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm
6.yum update mysql(5.1→5.6)
  ※アップデートしたもの
  mysql-community-server
  mysql-community-client
  mysql-community-libs
  mysql-community-libs-compat
  mysql-community-common
  mysql-connector-odbc
  postfix
7.my.cnfの修正(最初の投稿の添付)
8.mysql起動
9.zabbix DBリストア
 mysql -uroot zabbix < zabbix.dump
10.mysql_upgrade実行
11.zabbix起動

起動後mysqlのエラーは出力されておりません。
mysql一旦削除して、入れなおした方が良いでしょうか・・・。

ユーザー TNK の写真

監視項目数の大きな環境を別途用意することは困難であったため、
小さな環境を新規に作成して試してみましたが、桁が変わるほどの
vfs.dev.write[]の値の大きな増加は見られませんでした。
# 320sps → 420sps程度の変化

メモリなども小さなサーバしか用意できませんでしたので、ご提示
頂いたmy.cnfとはメモリ関連の設定が異なります。

あと、アップグレード手順として、以下のものが異なります。

 ・yum updateで更新されたのは以下のパッケージ
   mysql-community-common-5.6.17-4.el6.i686
   mysql-community-libs-5.6.17-4.el6.i686
   mysql-community-client-5.6.17-4.el6.i686
   mysql-community-server-5.6.17-4.el6.i686
   mysql-community-libs-compat-5.6.17-4.el6.i686

 ・MySQLのパッケージを更新してmy.cnfを修正してmysqld起動後
  すぐmysql_upgradeを実行とmysqld再起動。
 ・MySQL上にデータベースzabbixを作成してからdumpからのロード
  を実行。

手順として大きく違うのは、Zabbixのデータベースのダンプを読み
込む前に、mysql_upgradeを実行しmysqldを再起動した点です。

mysqld起動時のログにもあった通り、各種管理テーブルの構造に問
題があるというエラーが出ていたと思いますので、Zabbixのテーブ
ルをロードする前に各種管理テーブルをアップグレードする手順を
優先して実行してみました。

最低限の環境であれば、MySQL 5.1から5.6に上げたからといって、
vfs.dev.write[]の値が極端に増加するわけではないようです。

規模による問題である可能性も考えられますが、DBのアクセス以外
にもMySQLに限らず、他のアプリケーションも合わせてログファイ
ルなどの出力が増加していないかもご確認ください。

ユーザー TF0814 の写真

環境構築及びご確認頂きありがとうございます。
バージョンアップを実施しても、そこまで変化はなかったのですね。
やはり手順の問題・・・?
ただ、若干ですが増加しているのは少し気になりました。
(誤差程度かもしれませんが・・・)

あと、私も色々確認しています。

まず、write i/oの原因が本当にmysqlなのか確認しました。
dstatを使用して、1時間程確認したところ、やはりi/oの原因はmysqlのようです。
※添付txtをご確認ください。

また、vfs.dev.writeの推移を確認したところ、日を跨ぐと一旦writeが減少し
その後数時間をかけて150K sectorまで上昇するような挙動でした。
※添付画像をご確認ください。

日を跨ぐことに関連しそうなのは、partition化したテーブルの切り替わりが考えられます。
ということは、partition化に関連してwrite i/oが増加していると推察できます。
mysql5.6でデフォルトパラメータの設定値が結構変更されているようなので、
そのあたりを修正して変化が無いか確認してみよう思います。
TNK様で、何か思い当たる設定値等はありませんでしょうか・・・?

改善が見られない場合は、mysqlを入れなおす事も最終的には検討してみます。

ユーザー TNK の写真

ログファイルの出力状態はご確認頂けましたか?
mysqldプロセスがディスクへのI/Oを多く発生させていたとしても、
ご提示いただいたdstatの情報では、それがデータベースのデータ
としてのI/Oなのか、ログファイルへの出力なのかは不明だと思い
ます。

前回ご提示頂いた手順では、MySQL自体が正常に稼働するためのシ
ステムテーブルのアップグレード行う前にダンプデータからzabbix
データベースをロードされていたと思われるので、何らかのMySQL
上の管理データ上の問題が発生していることを危惧しています。

パラメータの変更に関してですが、5.5から5.6に関しては、以下の
資料が参考になるかもしれません。

参考資料:
 MySQL 5.6 パラメータ 検討会
   http://dbstudy.info/files/20130729/mysql56_parameters_r2.pdf

ユーザー TF0814 の写真

ご回答ありがとうございます。

> ログファイルの出力状態はご確認頂けましたか?
申し訳ありません。記載するのを忘れておりました。
mysqlはbinログ等出力させていないので、特にi/oが増えるようなものは
ありませんでした。
通常のmysqlログも殆ど書き込みはありませんし、その他のアプリログ
(といってもほぼないのですが・・・)も出力が増えているようなものは
ありませんでした。

やはり、update手順の不備を疑うべきですかね・・・。
ご提示頂いた資料はすでに確認しております。
ioに関わりそうなパラメータ*はある程度調整してみましたが大きな変化は
ありませんでした。
*innodb_io_capacityやinnodb_max_dirty_pages_pctなど

mysqlの再インストールも検討しようと思います。

ユーザー fripper の写真

デフォルト値の変化、Version毎の対応関係‥あたりまで把握しきれていませんが‥

innodb_checksums
innodb_doublewrite
innodb_file_format=Barracuda
innodb_flush_method=O_DIRECT
innodb_flush_log_at_trx_commit = 1
innodb_max_dirty_pages_pct = 90

私は 5.5/5.6 あたりを使っていますが、それらのサーバで利用している my.cnf にて、
これらパラメータを調整しつつ使っています

innodb_doublewrite

innodb_flush_method
あたりのデフォルト値が変わっているのかもしれません‥

ユーザー TF0814 の写真

ご回答ありがとうございます。

> innodb_max_dirty_pages_pct = 90
このパラメータですが、5.6ではデフォルトが75%になっており
もしかしてこれか!と思って修正してみたのですが、特に変化ありませんでした・・・
innodb_doublewriteや innodb_flush_methodのデフォルト値は
5.1と変わりなかったので、おそらく関係はないと思います。

5.1から比べると5.6は凄まじくパラメータ数が増加しており
どれが原因なのか特定が非常に難しそうです。
一旦、mysqlの再インストールを行って、まずupdateの不備なのかパラメータの
問題なのか切り分けをしようと思います。

ユーザー TF0814 の写真

MySQLを一旦アンインストールし、再度インストールを行ってみましたが
Write I/Oに変化はありませんでした。
やはり、手順の問題ではなさそうです。

再インストールした環境で、MySQLのshow statusの"innodb_buffer_pool"系の値を
確認していたところ、MySQL再起動後から2回目のhousekeeperが動作した直後から
dirty pageのフラッシュが常に行われているような状態が見て取れました。

innodb_buffer_pool_page_dirtyの値が2000程度になると、即時にフラッシュされ
値が0になり、innodb_buffer_pool_page_dirtyの値が2000程度→フラッシュ・・・
という挙動がずっと繰り返されているようです。
innodb_max_dirty_pages_pctの値は90に設定しており、buffer poolにある程度
データが溜まらないとdiskへのフラッシュはされないものだと思っていたのですが、
dirty pageのフラッシュ間隔?に関するその他の設定パラメータ等が関係しているのでしょうか?