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
InnoDB Pluginの特長
再掲します。
- 高速なインデックス作成。従来InnoDBのCREATE INDEXはテーブルの再作成を伴っていました
- テーブルとインデックスの圧縮 (検証結果その1、その2)
- INFORMATION_SCHEMAによるロック競合の検出 (検証結果)
- CPUスケーラビリティの向上 (1.0.3から。本エントリで解説)
- バックグラウンドI/Oスレッドの増加 (1.0.4から。検証結果)
- グループコミットの修正 (1.0.4から。Sun松信氏による検証結果)
- バッファプール管理アルゴリズムの強化 (1.0.5から。解説エントリ)
まだ解説していない残り二つの特長ですが、今回はそのうち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さん…