MySQL 5.6から加わった INFORMATION_SCHEMA.INNODB_METRICS のテスト。
mysql56> SELECT name, subsystem, count, status FROM information_schema.innodb_metrics;
+------------------------------------------+---------------------+-----------+----------+
| name | subsystem | count | status |
+------------------------------------------+---------------------+-----------+----------+
| metadata_table_handles_opened | metadata | 0 | disabled |
| metadata_table_handles_closed | metadata | 0 | disabled |
| metadata_table_reference_count | metadata | 0 | disabled |
| metadata_mem_pool_size | metadata | 8388608 | enabled |
| lock_deadlocks | lock | 0 | enabled |
| lock_timeouts | lock | 0 | enabled |
..
| icp_no_match | icp | 0 | disabled |
| icp_out_of_range | icp | 0 | disabled |
| icp_match | icp | 0 | disabled |
+------------------------------------------+---------------------+-----------+----------+
214 rows in set (0.32 sec)
全部で214もの項目があり、17のサブシステムに分けられていて、それぞれdisabled, enabledが指定できる。
今までSHOW ENGINE INNODB STATUS(InnoDB Monitor)でしか取れなかったような情報や、載っていない情報もぽちぽち取れたりするので、可能なら全enabledにしておきたい所存。
enableの仕方はSET GLOBAL innodb_monitor_enable= で設定する。INFORMATION_SCHEMAなので、performance_schemaみたいに UPDATE information_schema.innodb_metrics SET status= 'enabled'というわけには *いかない*。
mysql56> UPDATE information_schema.innodb_metrics SET status= 'enabled' WHERE subsystem= 'metadata';
ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'information_schema'
mysql56> SET GLOBAL innodb_monitor_enable= icp_out_of_range;
Query OK, 0 rows affected (0.00 sec)
mysql56> SET GLOBAL innodb_monitor_enable= module_metadata;
Query OK, 0 rows affected (0.13 sec)
mysql56> SELECT name, subsystem, count, status FROM information_schema.innodb_metrics;
+------------------------------------------+---------------------+-----------+----------+
| name | subsystem | count | status |
+------------------------------------------+---------------------+-----------+----------+
| metadata_table_handles_opened | metadata | 0 | enabled |
| metadata_table_handles_closed | metadata | 0 | enabled |
| metadata_table_reference_count | metadata | 0 | enabled |
| metadata_mem_pool_size | metadata | 8388608 | enabled |
| lock_deadlocks | lock | 0 | enabled |
| lock_timeouts | lock | 0 | enabled |
..
| icp_no_match | icp | 0 | disabled |
| icp_out_of_range | icp | 0 | enabled |
| icp_match | icp | 0 | disabled |
+------------------------------------------+---------------------+-----------+----------+
214 rows in set (0.19 sec)
イメージ的な"WHERE subsystem= 'xx'"にあたるのがinnodb_monitor_enable= module_xx で、イメージ的な"WHERE name= 'yy'"にあたるのがinnodb_monitor_enable= yyになる。全部いっぺんにenabledにするにはinnodb_monitor_enable= allだし、%記号を使ってワイルドカード指定もできる様子。
無効化するには、SET GLOBAL innodb_monitor_disable= ..で、指定の仕方はenableの時といっしょ。
で、問題はこれがどれくらい性能劣化を引き起こすか。
取りあえずざっくりtpcc_load WH= 1(INSERTのみのワークロードで、1スレッドしかなく、データはすべてバッファプールに収まるサイズ)で試してみる。
$ time ./tpcc_load localhost tpcc root "" 1 > /dev/null
【innodb_monitor何もいじらない】
real 1m22.414s
user 0m9.885s
sys 0m4.890s
real 1m23.739s
user 0m9.927s
sys 0m5.046s
real 1m23.227s
user 0m10.031s
sys 0m4.877s
【SET GLOBAL innodb_monitor_enable= all】
real 1m21.462s
user 0m9.690s
sys 0m4.939s
real 1m21.057s
user 0m9.781s
sys 0m4.803s<
real 1m22.970s
user 0m9.939s
sys 0m5.069s
【SET GLOBAL innodb_monitor_disable= all】
real 1m23.818s
user 0m9.949s
sys 0m4.990s
real 1m19.556s
user 0m9.386s
sys 0m4.844s
real 1m21.829s
user 0m9.824s
sys 0m4.904s
よさげ。
ちゃんとtpcc_startでもオーバーヘッドはからないとだけど、取りあえず
my.cnfにinnodb_monitor_enable= allで全部ONにしちゃおうかなと思いつつ(オンラインで変えられるし)