2012年9月25日火曜日

innodb_rollback_segmentsを探る(探りきれなかった)

リファレンスマニュアルにきっちり、
`デフォルトの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

5.1のソースを見ると、確かにTRX_SYS_N_REGSが256で定義されてて、
5.5にはあるinnodb_rollback_segmentsの数を判定するようなものがごっそり無い(あたりまえ


取り敢えず直感的に、
な感じがしたのでMySQL5.1でテスト。
Perlで512個のプロセスをfork()して一斉に$dbh->begin_workからの$dbh->do("INSERT ..")、
SLEEPして$dbh->rollback。

SHOW PROCESSLISTもSHOW ENGINE INNODB STATUSもざっと見ちゃんとトランザクションになってる。

…つながるねぇ、何の問題もないねぇ。。

とかやっているうちにありがたい情報が。
いつもありがとうございます(*-人-)


うーん、コア数変えながらベンチマーク取りたいけど、環境的に厳しい。。
それになんかロールバックセグメントそのものに対する興味がむくむくと。。

大体、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)

からの、

/* Number of undo log slots in a rollback segment file copy */
#define TRX_RSEG_N_SLOTS        (UNIV_PAGE_SIZE / 16)

1ページ16KiBだから、512 * innodb_rollback_segmentsかと思ったけどさにあらず。。
ちなみに5.1はTRX_RSEG_N_SLOTSが1024ハードコード。

よし、もうだめぽ!
楽しかったので良しとする。

0 件のコメント :

コメントを投稿