Percona Serverの追加機能はたくさんありますが、とても便利なものから実験的なものまで様々です。ドキュメントに設定やStatusは存在するけど説明が全くないものも多く、そういった機能は”提供するけど自由に解釈して使ってね”という程度にとらえて挑戦するとよいです。
そんな多くの機能を少しずつ紹介できればと思います。
ドキュメント
このページにキッチリまとまっています。とても面白いのでちょこちょこ読むのをオススメします。DeviceI/O対策
こちらからの紹介です。checkpoint I/O 平均化
データ更新量が大きくなると、WALからテーブルスペースへの反映のために 瞬間的にDiskI/Oを食うようになりますが、この負荷を均してくれる機能です。古い名前 innodb_adaptive_checkpoint は5.5.8 で削除され、innodb_adaptive_flushing_method に変更されています。
1 2 |
innodb_adaptive_flushing = true innodb_adaptive_flushing_method = keep_average |
keep_averageは従来の1.0秒おきのフラッシュを0.1秒おきにすることでiowaitの波を穏やかにしてくれ、むしろHDDの時に真価を発揮してくれます。他にも条件が複雑な設定値があり興味深いところですが、私はkeep_averageで長いことうまくやっていけて満足しています。
データ・ログファイルのアクセス方式
O_DIRECTによりページキャッシュの二重化を防ぐというものですが、速くなるか遅くなるかは環境次第です。参考資料はこちら。
1 |
innodb_flush_method = O_DIRECT |
本家MySQLに既に組み込まれており、Perconaでは 5.1.54 から ALL_O_DIRECT という値が追加されていますが、ベンチマークをとっても性能面で劇的な変化が観測できる類のものではなく、私は長い間 O_DIRECT を使い続けています。
隣接dirty_pageのフラッシュ
dirty_pageのフラッシュ時に、近くのpageも同時にフラッシュすることで、処理速度を向上します。ただし、これはHDDのようなヘッドシークによる遅延があるハードの場合で、SSDのようなヘッドのないものは無効(=none)の方がパフォーマンスを発揮する場合があります。
1 |
innodb_flush_neighbor_pages = none |
私はioDriveの時はnone, HDDではareaとして使い分けています。
先読みページ読み込み
デバイスからのReadが発生した時、ある程度近いページをまとめて読みだす機能で、主にHDDの読み込み回数を減らしてパフォーマンスをあげるためのものです。SSD/ioDriveだと回数を減らして余計なデータを読み込んでしまうよりは、必要な分だけ取り出したほうが速かったりメモリ効率が良い場合があります。
1 |
innodb_read_ahead = none |
linearで有効にしておくと、read_aheadにより読みこまれたページ数が STATUS : Innodb_buffer_pool_read_ahead に記録され、通常の読み込みページ数である Innodb_buffer_pool_reads の値が少なくなります。
noneの場合は Innodb_buffer_pool_read_ahead がゼロになり、Innodb_buffer_pool_reads のみ記録されます。
具体的な効果としては、極端な例として、暖機運転で全参照を実行した場合は linear の方が速くなります。例えばメモリに全く載っていない150,000ページのデータに対して全参照した場合、Innodb_buffer_pool_readsが5,000、Innodb_buffer_pool_read_aheadが145,000とreads回数が圧倒的に少なくなりますが、noneにするとreadsがそのまま150,000となり効率的でなくなり遅くなります。
しかし平時の本番運用においては細かいランダムアクセスが多いでしょうから none が速い(≒無駄が少ない)場合があります。とはいえ、データを大きく読み出すことが多い場合は有効にした方が速いかもしれなく、結局は参照クエリ次第であり、メモリに全部載ってしまえば必要のないものでもあります。
InnoDBログファイルブロックサイズ
ioDrive+MySQLにおいてはioDriveブロックサイズは 4096 が有力とされており、それに合わせてブロックサイズについてまとめるとDefault | Recommend | |
ioDrive | 512 | 4096 |
FileSystem(XFS) | 4096 | 4096 |
InnoDB Data | 16KB | 16KB |
InnoDB Log | 512 | 4096 |
とはいえ劇的な変化があるわけではないので、初期設定をするタイミングでできるならこうしたらいいという程度で、途中から無理に変える必要はありません。
1 |
innodb_log_block_size = 4096 |
I/O 回数表示 (※MySQL5.0.x系のみ)
主にINDEXのRead/Write回数の把握に利用します。これを確認することで、INDEXの要不要の判断がより適確になるはずです。ただし、MySQL5.0にしかないのですが、面白いので書いてみました。
インデックス
高速インデックス構築
デフォルトで有効になっていて、要はインデックス構築が速くなったよという恩恵。拡張版もあってなお楽しそう。
1 |
fast_index_creation = true |
5.5.27からinnodb_merge_sort_block_sizeがついてパフォーマンス調整ができるということで楽しそうだけど、この話は速くなるだけで、サービスへの影響を考慮しなくてよくなる、というものではないので、深く気にせず速くなってくれてるんだなと知っておけばよいのかなと。
HDDで運用しててiowaitに困ったとき、ioDriveにして一気に解決するのも1つの手ですが、Percona ServerにしてI/O設定を調整すればいくらかマシになるはずですので、それで十分なキャパシティになるのであればHDDで運用を続けるという選択もありえるかもしれません。
実際、ioDriveにする直前は助けられた時期もありましたし、全てioDriveにするわけではないので非常に重宝しています。