SELECT CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3)) RIBPS FROM(SELECT SUM(data_length+index_length) Total_InnoDB_BytesFROM information_schema.tables WHERE engine='InnoDB') A;
で得られるらしい。
innodb_buffer_pool_instances
mysql 5.5以上。innodbのbuffer_poolの数を増やせる。グローバルMutexの衝突が無くなるため、並列に処理できて速くなるらしい。innodb_buffer_pool_sizeが1G以下の場合は1がいいらしい(?)
多分ISUCON予選だと設定する必要なさそう。
なにをやるか
my.cnfをいい感じに設定する
なぜやるか
mysqlを高速化するため
どうやるか
高速化のための設定項目(ストレージエンジンがinnodbの場合)
innodb_flush_log_at_trx_commit
ログバッファの書き込み方式を設定する。デフォルトは1 (コミット毎にディスクフラッシュ) これを
とするとディスクフラッシュが1秒おきになって、高速になる。(その代わり、OSや電源の障害が起きた場合1秒間分のトランザクションが失われて死ぬ)
0にすると、ディスクフラッシュに加えてログバッファ->ログファイルも1秒おきになる。 高速なんだけど、mysqlのクラッシュでトランザクションが失われて死ぬ
これらはDisc I/Oを削減してくれるので、特にインスタンスがHDDの時に効く。(SSDでももちろん効く)
innodb_flush_method
innodbのログファイル/データファイルの読み書き方法の設定。 デフォルトはfsync
ISUCONでの推奨はおそらく
このオプションではDIRECT I/Oってのを使用して速いんだとか。 でもほんとはnosyncの方が速いみたい。でも公式ではサポートしてない。 O_DIRECT_NO_FSYNCってのもある。こっちはサポートしてる。多分速い。
innodb_doublewrite
Innodbは障害耐性のため、データの二重書き込みを行ってるんだけど、それを無効にできる。 推奨
innodb_max_purge_lag
innodb_log_file_size
redoログを書くファイルのサイズ。innodb_log_fileがいっぱいになると、Disk I/Oが発生する。 大きくした方がパフォーマンスが向上するが、障害発生時に、復旧時間が長くなる。
推奨
でもISUCONだとあまり効果薄いかも。(そんなにinnodb_log_fileがいっぱいにならない?)
innodb_buffer_pool_size
DBの内容を載せるメモリのプールサイズの大きさ。データ量が少ない場合は基本的にDBの全てのデータがメモリに載るように設定する。ISUCONでは1Gを設定するケースが多い。しかしデフォルトのpool_sizeは128Mなので、データ量がそれ以下とかだと、1Gに上げてもパフォーマンスは向上しない。
なおinnodbの全てのデータサイズは
で得られるらしい。
kazeburoさんいわく 王道設定1
でも現在、nosyncは This option is used for internal performance testing and is currently unsupported. Use at your own risk. だそう。
王道設定2
個人的に推したい
ところで
を忘れないこと!
参考: https://www.slideshare.net/kazeburo/mysql-casual7isucon http://d.hatena.ne.jp/hiroi10/20151210/1449731029 https://corporate.inter-edu.com/developper/1373 http://dsas.blog.klab.org/archives/50860867.html