Percona Server 機能紹介 (1) InnoDB I/O Scalability

Percona Serverの追加機能はたくさんありますが、とても便利なものから実験的なものまで様々です。ドキュメントに設定やStatusは存在するけど説明が全くないものも多く、そういった機能は”提供するけど自由に解釈して使ってね”という程度にとらえて挑戦するとよいです。

そんな多くの機能を少しずつ紹介できればと思います。



ドキュメント

このページにキッチリまとまっています。とても面白いのでちょこちょこ読むのをオススメします。
  • Percona Server – Documentation

  • DeviceI/O対策

    こちらからの紹介です。
  • Improved InnoDB I/O Scalability

  • checkpoint I/O 平均化

    データ更新量が大きくなると、WALからテーブルスペースへの反映のために 瞬間的にDiskI/Oを食うようになりますが、この負荷を均してくれる機能です。
    古い名前 innodb_adaptive_checkpoint は5.5.8 で削除され、innodb_adaptive_flushing_method に変更されています。

  • Improved InnoDB I/O Scalability
  • Adaptive checkpointing – MySQL Performance Blog
  • XtraDB 5.5版 性能調整中 – DB改造屋雑記
  • keep_averageは従来の1.0秒おきのフラッシュを0.1秒おきにすることでiowaitの波を穏やかにしてくれ、むしろHDDの時に真価を発揮してくれます。他にも条件が複雑な設定値があり興味深いところですが、私はkeep_averageで長いことうまくやっていけて満足しています。

    データ・ログファイルのアクセス方式

    O_DIRECTによりページキャッシュの二重化を防ぐというものですが、速くなるか遅くなるかは環境次第です。参考資料はこちら。
  • MySQL innodb_flush_method = O_DIRECTの検討 – SH2の日記
  • 本家MySQLに既に組み込まれており、Perconaでは 5.1.54 から ALL_O_DIRECT という値が追加されていますが、ベンチマークをとっても性能面で劇的な変化が観測できる類のものではなく、私は長い間 O_DIRECT を使い続けています。

    隣接dirty_pageのフラッシュ

    dirty_pageのフラッシュ時に、近くのpageも同時にフラッシュすることで、処理速度を向上します。ただし、これはHDDのようなヘッドシークによる遅延があるハードの場合で、SSDのようなヘッドのないものは無効(=none)の方がパフォーマンスを発揮する場合があります。

    私はioDriveの時はnone, HDDではareaとして使い分けています。

    先読みページ読み込み

    デバイスからのReadが発生した時、ある程度近いページをまとめて読みだす機能で、主にHDDの読み込み回数を減らしてパフォーマンスをあげるためのものです。SSD/ioDriveだと回数を減らして余計なデータを読み込んでしまうよりは、必要な分だけ取り出したほうが速かったりメモリ効率が良い場合があります。

    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 が有力とされており、それに合わせてブロックサイズについてまとめると

    DefaultRecommend
    ioDrive 512 4096
    FileSystem(XFS)40964096
    InnoDB Data 16KB16KB
    InnoDB Log 512 4096

    とはいえ劇的な変化があるわけではないので、初期設定をするタイミングでできるならこうしたらいいという程度で、途中から無理に変える必要はありません。


    I/O 回数表示 (※MySQL5.0.x系のみ)

    主にINDEXのRead/Write回数の把握に利用します。これを確認することで、INDEXの要不要の判断がより適確になるはずです。

    ただし、MySQL5.0にしかないのですが、面白いので書いてみました。
  • Data Page I/O Activity

  • インデックス

    高速インデックス構築

    デフォルトで有効になっていて、要はインデックス構築が速くなったよという恩恵。拡張版もあってなお楽しそう。
  • Fast Index Creation
  • Expanded Fast Index Creation
  • MySQL :: Fast Index Creation in the InnoDB Storage Engine
  • InnoDB Pluginことはじめ。快適ストレージエンジン生活はじまる! – 漢(オトコ)のコンピュータ道
  • 5.5.27からinnodb_merge_sort_block_sizeがついてパフォーマンス調整ができるということで楽しそうだけど、この話は速くなるだけで、サービスへの影響を考慮しなくてよくなる、というものではないので、深く気にせず速くなってくれてるんだなと知っておけばよいのかなと。



    HDDで運用しててiowaitに困ったとき、ioDriveにして一気に解決するのも1つの手ですが、Percona ServerにしてI/O設定を調整すればいくらかマシになるはずですので、それで十分なキャパシティになるのであればHDDで運用を続けるという選択もありえるかもしれません。

    実際、ioDriveにする直前は助けられた時期もありましたし、全てioDriveにするわけではないので非常に重宝しています。