MySQL 5.1.46リリース InnoDB Pluginが正式版に

出ました。今回は機能追加が1件、バグ修正が55件あります。バグ修正のうちセキュリティに関するものが1件、パーティショニングに関するものが5件、レプリケーションに関するものが7件となっています。
MySQL 5.1.38から本体に付属するようになったInnoDB Pluginですが、バージョンが1.0.7に上がりRCからGA(Generally Available、正式版)となりました。ついに正式リリースです。というわけで何度か繰り返している話題ですが、今回はInnoDB Pluginについて再度おさらいをしておきたいと思います。

InnoDB Pluginの使い方

MySQL 5.1.38以降であればInnoDB Pluginを使うように設定するのは簡単です。/etc/my.cnfに以下の設定を書き加えることでInnoDB Pluginが有効化されます。

ignore-builtin-innodb
plugin-load = innodb=ha_innodb_plugin.so;innodb_trx=ha_innodb_plugin.so;
innodb_locks=ha_innodb_plugin.so;innodb_lock_waits=ha_innodb_plugin.so;
innodb_cmp=ha_innodb_plugin.so;innodb_cmp_reset=ha_innodb_plugin.so;
innodb_cmpmem=ha_innodb_plugin.so;innodb_cmpmem_reset=ha_innodb_plugin.so
(plugin-loadは実際には1行)

Windowsの場合は拡張子が.dllとなります。my.iniに以下の設定を書き加えてください。

ignore-builtin-innodb
plugin-load = innodb=ha_innodb_plugin.dll;innodb_trx=ha_innodb_plugin.dll;
innodb_locks=ha_innodb_plugin.dll;innodb_lock_waits=ha_innodb_plugin.dll;
innodb_cmp=ha_innodb_plugin.dll;innodb_cmp_reset=ha_innodb_plugin.dll;
innodb_cmpmem=ha_innodb_plugin.dll;innodb_cmpmem_reset=ha_innodb_plugin.dll
(plugin-loadは実際には1行)

InnoDB Pluginが有効化されたことは、起動時のログで確認できます。

100425 22:22:44 InnoDB Plugin 1.0.7 started; log sequence number 80684451285

Bug #47621とBug #47622について

MySQL 5.1.41のエントリでYasufumi先生に指摘いただいて、さらにid:hirose31さんにメモ: InnoDB Pluginのバグ - (ひ)メモで追試していただいているように、InnoDB Plugin 1.0.6には大きなバグが2つ残っていました。

  • Bug #47621 MySQL and InnoDB data dictionaries will become out of sync when renaming columns
  • Bug #47622 the new index is added before the existing ones in MySQL, but after one in SE

これら二つとも、MySQL 5.1.46+InnoDB Plugin 1.0.7で修正されました。一安心ですね。

InnoDB Pluginの特長

再掲します。

まだ解説していない残り二つの特長ですが、今回はそのうちCPUスケーラビリティについて確認していきたいと思います。

CPUスケーラビリティとは

もしかしたら馴染みのない言葉かもしれないので説明しておきます。CPUスケーラビリティとは「CPUあるいはCPUコアの数を増やすことによって、どこまでリニアに性能を伸ばすことができるか」という概念です。シングルコアに比べてデュアルコアで2倍、クアッドコアで4倍へと性能が伸びれば話は早いのですが、残念ながら世の中にはアムダールの法則というものがあって、性能がCPU数に完全に比例して伸びることはまずありません。特にMySQLはCPUスケーラビリティが他のRDBMSに比べて悪く、これが改善されることを多くのユーザが待ち望んでいました。

Dimitri KRAVTCHUK氏による検証結果

私は残念ながらCPUスケーラビリティを測定できるようなサーバを持ち合わせていないので、今回はDimitri KRAVTCHUK氏の検証結果をご紹介したいと思います。Dimitri氏はSun Microsystemsのエンジニアで、db_STRESSというベンチマークツールの作者でもあります。Dimitri氏のウェブサイトにはdb_STRESSを用いたベンチマーク結果が多数掲載されています。
一番分かりやすいところで、2009年4月のMySQL Performance: MySQL-5.4.0 and other InnoDB engines @dbSTRESS BenchmarkからFull Benchmark Result ListのRead-Only results、Avg-TPSの結果を引用します。
3枚のグラフはCPUコア数を8、16、32と増やしていった様子を表しています。それぞれのグラフにおいて横軸はMySQLに対する同時接続数、縦軸は1秒あたりの処理トランザクション数を示しています。グラフの系列がたくさんあるのですが、ここでは青のビルトインInnoDB、それから赤のInnoDB Pluginに注目してください。



一見して、青のビルトインInnoDBがかなり悪いことが分かると思います。

  • 同時接続数8をピークとして、それ以上同時接続数を上げると性能が落ちてしまう
  • 同時接続数を8に固定しても、サーバのCPUを16コア、32コアと増やすと性能が落ちてしまう

この「CPUを増やせば増やすほど性能が落ちる」というのはなかなかに衝撃的だと思います。現実はアムダールの法則よりも厳しいのです。あまりに衝撃的なので、InnoDB Pluginが正式リリースされるまでこのブログではあえて紹介しませんでした。ようやく解禁です。
一方、赤のInnoDB Pluginでは性能が大きく改善されています。少なくとも8コアまでは安心して使えますし、同時接続数やinnodb_thread_concurrencyをきっちりチューニングすれば16コアでも問題なく運用できると思います。
今年はIntelから6コアおよび8コア、AMDからは12コアのCPUが発表されています。こうしたCPUが真の実力を発揮するには、InnoDB Pluginの利用が不可欠と言えるのではないでしょうか。

おまけ

MySQL 5.1.46から、mysqlコマンドラインクライアント起動時のメッセージが変更されました。

MySQL 5.1.45
$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.45-community-log MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
MySQL 5.1.46
$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 155
Server version: 5.1.46-community-log MySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Oracleさん…