2014年4月7日月曜日

MySQL 5.6.17のinnodb_metricsを有効にしてみる

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にしちゃおうかなと思いつつ(オンラインで変えられるし)

0 件のコメント :

コメントを投稿