`デフォルトの128から減らせよ! 減らした方がパフォーマンス上がるぞ!'
的なことが書かれている割に、
どれくらい減らして良いのか、減らすと何が起きるのか
ほとんど情報の無いinnodb_rollback_segments。。
http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_rollback_segments
取り敢えず5.5のソースにこんな記載が。
storage/innobase/include/trx0sys.h
/* Max number of rollback segments: the number of segment specification slots
in the transaction system array; rollback segment id must fit in one (signed)
byte, therefore 128; each slot is currently 8 bytes in size. If you want
to raise the level to 256 then you will need to fix some assertions that
impose the 7 bit restriction. e.g., mach_write_to_3() */
#define TRX_SYS_N_RSEGS 128
/* Originally, InnoDB defined TRX_SYS_N_RSEGS as 256 but created only one
rollback segment. It initialized some arrays with this number of entries.
We must remember this limit in order to keep file compatibility. */#define TRX_SYS_OLD_N_RSEGS 256
in the transaction system array; rollback segment id must fit in one (signed)
byte, therefore 128; each slot is currently 8 bytes in size. If you want
to raise the level to 256 then you will need to fix some assertions that
impose the 7 bit restriction. e.g., mach_write_to_3() */
#define TRX_SYS_N_RSEGS 128
/* Originally, InnoDB defined TRX_SYS_N_RSEGS as 256 but created only one
rollback segment. It initialized some arrays with this number of entries.
We must remember this limit in order to keep file compatibility. */#define TRX_SYS_OLD_N_RSEGS 256
5.1のソースを見ると、確かにTRX_SYS_N_REGSが256で定義されてて、
5.5にはあるinnodb_rollback_segmentsの数を判定するようなものがごっそり無い(あたりまえ
取り敢えず直感的に、
5.5のソースに前は1つだけって書いてあった。TRX_SYS_N_RSEGSが256ってことは、同時に256のトランザクションを扱える?
— ts. yokuさん (@yoku0825) 9月 25, 2012
だとすると、5.5のTRX_SYS_N_RSEGSは128なので、128 * innodb_rollback_segmentsが同時に扱える最大のトランザクション数、で良いのだろうか。。
— ts. yokuさん (@yoku0825) 9月 25, 2012
な感じがしたのでMySQL5.1でテスト。Perlで512個のプロセスをfork()して一斉に$dbh->begin_workからの$dbh->do("INSERT ..")、
SLEEPして$dbh->rollback。
SHOW PROCESSLISTもSHOW ENGINE INNODB STATUSもざっと見ちゃんとトランザクションになってる。
…つながるねぇ、何の問題もないねぇ。。
とかやっているうちにありがたい情報が。
@yoku0825 MySQL 5.5のロールバックセグメント増はCPUスケーラビリティのための機能のはずで、BEGINして放置できるトランザクションの数はもっと多いと思います (試してません
— SH2さん (@sh2nd) 9月 25, 2012
いつもありがとうございます(*-人-)
うーん、コア数変えながらベンチマーク取りたいけど、環境的に厳しい。。
それになんかロールバックセグメントそのものに対する興味がむくむくと。。
大体、128から1にしたら誤差かと思えるくらいはtpmC上がった気がするけど、
そんなに効果あるのかなこれ?
【2012/09/27 15:54】
$dbh->do("UPDATE ..")に変えてHistory list lengthをめりめりしてみたり、
Undoの数をめりめりしてみたけど限界っぽいものは掴めず。
5.5のstorage/innobase/include/trx0rseg.hにこんなのを見つける。
うーん、コア数変えながらベンチマーク取りたいけど、環境的に厳しい。。
それになんかロールバックセグメントそのものに対する興味がむくむくと。。
大体、128から1にしたら誤差かと思えるくらいはtpmC上がった気がするけど、
そんなに効果あるのかなこれ?
【2012/09/27 15:54】
$dbh->do("UPDATE ..")に変えてHistory list lengthをめりめりしてみたり、
Undoの数をめりめりしてみたけど限界っぽいものは掴めず。
5.5のstorage/innobase/include/trx0rseg.hにこんなのを見つける。
/* Maximum number of transactions supported by a single rollback segment */
#define TRX_RSEG_MAX_N_TRXS (TRX_RSEG_N_SLOTS / 2)
#define TRX_RSEG_MAX_N_TRXS (TRX_RSEG_N_SLOTS / 2)
からの、
/* Number of undo log slots in a rollback segment file copy */
#define TRX_RSEG_N_SLOTS (UNIV_PAGE_SIZE / 16)
#define TRX_RSEG_N_SLOTS (UNIV_PAGE_SIZE / 16)
1ページ16KiBだから、512 * innodb_rollback_segmentsかと思ったけどさにあらず。。
ちなみに5.1はTRX_RSEG_N_SLOTSが1024ハードコード。
よし、もうだめぽ!
楽しかったので良しとする。
0 件のコメント :
コメントを投稿