日本ヒューレット・パッカード株式会社
ここでは、DBT-3をMySQLで実行した結果に関す る考察を述べると共に、OSDL DBT-3 version 1.9 のMySQLへの 移植作業を行なう中で分かったことも報告する。
移植作業および評価実施時に以下の知見が得られた。
本考察では、以下の試験結果(表1)について考察する。
各測定結果については「4.このデータの性能データ」から参照できる。
| 測定結果番号 | 測定結果タイトル |
|---|---|
| 1 | DBT-3によるMySQL5.0.26のSATAディスク利用x86-64環境に関する測定結果 |
| 2 | DBT-3によるMySQL5.0.26のディスクアレイ利用x86環境に関する測定結果 |
| 3 | DBT-3によるMySQL5.0.26のディスクアレイ利用x86-64環境に関する測定結果 |
| 4 | DBT-3によるMySQL5.0.26のディスクアレイ利用x86-64環境でのチューニング有りに関する測定結果 |
本考察のソフトウェア環境を以下に示す。
| オペレーティングシステム | RedHat Enterprise Linux AS 4 for x86 |
|---|---|
| データベース | MySQL 5.0.26 Community Server x86用(32bit)バイナリ(standard-5.0.26-linux-x86-glibc23)を利用 |
| 負荷ツール | DBT-3 version 1.9.ipa.mysql.01.00 |
| オペレーティングシステム | RedHat Enterprise Linux ES 4 for x86-64(AMD64/EM64T)(測定結果番号1) RedHat Enterprise Linux AS 4 for x86-64(AMD64/EM64T)(測定結果番号3,4) |
|---|---|
| データベース | MySQL 5.0.26 Community Server AMD64/EM64T用(64bit)バイナリ(standard-5.0.26-linux-x86_64-glibc23)を利用 |
| 負荷ツール | DBT-3 version 1.9.ipa.mysql.01.00 |
ハードウェア環境は、「表1: 考察対象の測定結果」で示す測定結果毎に異なる。 それぞれの環境の詳細は、以下「表4:ハードウェア環境」を参照されたい。
表1の測定結果と表4 のハードウェア環境は「測定結果番号」をキーとして対応している。 また、本考察においてハードウェア環境を参照する場合は下表の「環境識別名」を用いる。
| 測定結果番号 | 環境識別名 | H/W | CPU | メモリ | ストレージ | 環境 | MySQLバッファサイズ |
|---|---|---|---|---|---|---|---|
| 1 | DL145 | HP ProLiant DL145 | AMD Opteron252 2.6GHz×2 | 4GB | SATA 80GB | x86-64 | 3GB |
| 2 | DL385A | HP ProLiant DL385 | AMD Opteron252 2.6GHz×2 | 14GB | Fiber HP MSA-1000 RAID-10 72GB | x86 | 2GB |
| 3 | DL385B | HP ProLiant DL385 | AMD Opteron252 2.6GHz×2 | 14GB | Fiber HP MSA-1000 RAID-10 72GB | x86-64 | 2GB |
| 4 | DL385C | HP ProLiant DL385 | AMD Opteron252 2.6GHz×2 | 14GB | Fiber HP MSA-1000 RAID-10 72GB | x86-64 | 14GB |
表4のMySQLバッファサイズの値は、MySQL の InnoDB 用バッファプールサイズ(innodb_buffer_pool_size)に設定した値である。 その他のMySQL設定は同一となっている。
本考察では、MySQL5.0で動作するように移植したDBT-3 version 1.9.ipa.mysql.01.00 での測定結果に 関して論じていくが、このDBT-3のバージョンのことを以下では「MySQL版DBT-3」と記述する。 一方、MySQLに移植する元となったPostgreSQLが動作するDBT-3は、OSDL DBT-3 version 1.9 であり、 こちらについては以下では「オリジナルDBT-3」と記述する。
MySQL版DBT-3は移植作業時に判明した知見を元に、オリジナルDBT-3から以下の変更を行っている。
OSDL DBT-3 version 1.9のMySQLへの移植作業詳細については「DBT-3 version 1.9 MySQL5.0への移植作業報告書」を参照されたい。
Loadテストを実施したところ試験実施時間が非常に長かった。 原因の調査を行ったところ、以下の事実が判明した。
上記の事実から、インデックスの作成実施後にデータを投入する試験を実施した。 図1に「DL145」の環境で試験した結果を示す。
図1の通り、MySQLではインデックスを作成してからデータを投入した方がデータ投入処理が高速になる。 この違いは ALTER TABLE の処理方法に起因すると推定される。
上記結果より、MySQL版DBT-3ではLoadテストでのデータ投入とインデックス作成順序を入れ替え、インデックスを作成してからデータを投入することにした。
MySQL版DBT-3を用いてスケールファクタ1でPowerテストを実施したところ、1日経過後も試験が完了しなかった。
調査したところ、Powerテストにて実行される22個のクエリの中の1つのクエリ、クエリ18の 実施処理が異常に長いために試験が先に進んでいないことが分かった。 そして、このクエリ18はIN句とサブクエリを組み合わせた複雑なクエリであった。
この問題をMySQL AB.へ問い合わせたところ、使用したMySQL5.0.26ではサブクエリの最適化に一部問題があり、 特にIN句とサブクエリを組み合わせた場合のパフォーマンスに問題が発生する可能性が高いことが分かった。
そこで、この問題を回避するためのワークアラウンドとして以下の2つの方法を検討した。
上記の2つの方法を確認したところ、 いずれも妥当な時間でクエリの実施を完了することが出来た。 そこで2つの方法のうちより高速であった2番目テンポラリテーブルを利用する方法を MySQL版DBT-3 で採用することにした。 以下に変更前と変更後のクエリ18の概要を示す(表5参照)。
| 修正前 | 修正後 |
|---|---|
SELECT …
FROM customer, orders, lineitem
WHERE o_orderkey in
(SELECT l_orderkey FROM lineitem
GROUP BY l_orderkey
HAVING sum(l_quantity) > :1)
AND …
GROUP BY …
ORDER BY …;
|
CREATE TEMPORARY TABLE
tmp_l_orderkey (t_orderkey integer);
INSERT INTO tmp_l_orderkey
SELECT l_orderkey FROM lineitem
GROUP BY l_orderkey
HAVING sum(l_orderkey) > :1;
SELECT …
FROM customer, orders, lineitem, tmp_l_orderkey
WHERE o_orderkey = t_orderkey
AND …
GROUP BY …
ORDER BY …;
|
MySQLの将来のバージョンでサブクエリの最適化がより良くなる予定である。 この問題の改善を期待したい。
DBT-3をスケールファクタ1かつストリーム1の条件で実施したところ、 Powerテストの結果に比較してThroughputテストの結果が異常に低かった。
PowerテストとThroughputテストの結果指標の計算方法が異なるため 厳密にはこれら結果指標が一致することはないが、このテストは ストリーム数を1にして試験したので、PowerテストとThroughputテストの 実施結果はほぼ同等になる予想であった。
調査したところThroughputテストはPowerテストと異なり、計測対象として各クエリのEXPLAIN実施時間を含めていることが分かった。また、特にクエリ22のEXPLAINの実施時間が異常に長いことも分かった。 表6にスケールファクタ1の時のクエリ22のEXPLAIN実施時間とクエリ実施時間を示す。
| スケールファクタ | クエリ22のEXPLAIN実施時間 | クエリ22のクエリ実施時間 |
|---|---|---|
| 1 | 5540秒(約1.5時間) | 0秒 |
他のクエリのEXPLAIN実施時間は大半が1秒以内で完了し、長いものでも十数秒で完了しているにも かかわらず、表6に示すとおりクエリ22のEXPLAIN実施時間が約1.5時間となっている。 一方、クエリ22のクエリ実施時間は1秒以内で完了しているので、クエリの実施自体には問題が無いと考えられる。 また、クエリ22は二重のサブクエリを含む複雑なクエリであり、DBT-3のすべてのクエリの中で二重のサブクエリを 持つものはクエリ22のみである。
以上から、MySQLにおいては二重のサブクエリを含むような複雑なクエリのEXPLAIN処理に 問題が発生する場合があることが考えられる。
この問題はDBT-3の測定を進める上で大きな影響を与えると考えたため、 MySQL版DBT-3ではクエリ22のEXPLAIN実施を取りやめることとした。
DBT-3のPowerテストを同一条件で複数回実施し、そのクエリ実施時間の合計を比較したところ、 いくつかの試行でクエリ実施時間合計が他と比較して2倍近い値となっている結果があった(図2参照)。
調査の結果、クエリ8の実施時間が特に大きく異なっていることが分かった。 クエリ8について調査を行ったところ、EXPLAIN実施によって得られるクエリ実施計画が 上記の2つの試行で全く異なることが分かった。 そこで、この結果の違いがクエリ実施時間に大きく影響していると推定した。
MySQLでクエリのEXPLAINを実施すると、そのクエリを処理する際のテーブル参照順序、 利用インデックス、処理コストを得ることができる。
MySQLではインデックスを利用するためのヒント情報として、 クエリ中の各テーブルに USE INDEX、FORCE INDEX、IGNORE INDEX を指定することができる。 この機能を利用することで、 MySQLが策定するクエリ実施計画がクエリ実施時間が短かい場合と同一になるように インデックス利用ヒントを設定することにした。また、この修正による影響も確認した。(図3参照)
図3中の試行番号1および2は、図2のものと同一である。 試行3、4および5は、インデックス利用ヒントを指定した測定結果である。
図3に示すとおり、インデックス利用ヒントを指定することによりクエリ8の実施時間は安定した。 また変更後のすべてのDBT-3の実施において、クエリ実施時間が異常に大きくなることはなくなった。
MySQL版DBT-3では以上の結果を元に以下のクエリにインデックス利用ヒントの指定を追加している。
クエリ: 1, 3, 4, 5, 6, 7, 8, 9, 10, 12, 21
ハードウェア性能の違いが測定結果に与える影響を見るために、環境DL145と環境DL385Cの試験結果を比較する。 ここでは、特にPowerテストの結果を比較した(図4参照)。 比較した2つの試験の環境のCPUは同一であるが、メモリサイズ、MySQLのバッファサイズ、利用ディスクシステムが以下のように異なる。
| 環境識別名 | H/W | CPU | メモリ | ストレージ | 環境 | MySQLバッファサイズ |
|---|---|---|---|---|---|---|
| DL145 | HP ProLiant DL145 | AMD Opteron252 2.6GHz×2 | 4GB | SATA 80GB | x86-64 | 3GB |
| DL385C | HP ProLiant DL385 | AMD Opteron252 2.6GHz×2 | 14GB | Fiber HP MSA-1000 RAID-10 72GB | x86-64 | 14GB |
この結果からは、基本的に環境DL145より、多くのメモリを登載し良いディスクシステムを使用している 環境DL385Cの方が良い結果となっている。 そして、それぞれのスケールファクタにおける環境DL145の結果を1とした時の、環境DL385Cの結果の比率を 比べてみると、スケールファクターが大きくなるに従いその差(倍率)も大きくなる傾向が見られる。
次にPowerテスト実施時のCPU使用率を見てみる。(図5参照)。
この結果から、多くのメモリと良いハードディスクシステムを使用することで、 CPUのiowaitに費やす率が下がっている事が確認出来た。
しかし、今回の試験結果だけでは、これらの違いがメモリとハードディスクシステムの どちらにどの程度依存したものであるかということまでは特定することは出来なかった。
以上からMySQLを利用する場合、より大きなメモリと高性能ディスクを利用することで、より高いパフォーマンスを期待することが可能であると考えられる。 しかし、今回の試験結果だけでは、これらの違いがメモリとハードディスクシステムのどちらにどの程度依存ているかや、 メモリ量と性能との関係を特定することは出来なかった。
x86環境とx86-64環境の違いを調査するため、x86環境で実施した環境DL385Aと x86-64環境で実施した環境DL385BのPowerテストの結果を比較した。(図6参照)。
ここで言うx86環境とx86-64環境の違いとは、具体的に以下のような違いを差している。
| 環境 | RedHat Enterprise Linux AS 4 | MySQL |
|---|---|---|
| x86環境 | x86版(32bitOS) | x86用(32bit)バイナリ |
| x86-64環境 | x86-64(AMD64/EM64T)版(64bitOS) | AMD64/EM64T用(64bit)バイナリ |
図6に示す通り、DBT-3のPowerテストの結果指標は環境を変更してもほとんど同じ結果となる。 しかし、クエリ実施時間を比較すると、x86-64環境のクエリ実施時間はx86環境のクエリ実施時間と 比較してSF=2で約10%、SF=4で約20%、SF=8で約30%の遅くなっている(図7参照)。
このように図6と図7で結果が矛盾しているように見えるため、 スケールファクタ8におけるPowerテストのクエリ実施時間などについて 両環境での比較調査を行ったところ、以下のことが分かった。
このことから、 少数のクエリの実施時間が極端に遅くなることでクエリ実施時間の合計自体が大きくなっても、 より多くのクエリの実施時間が短くなる場合にDBT-3のPowerテストの結果指標の値が 良くなるために、図6と図7のような差が生じたと考えられる。
したがって、x86-64環境を使用した場合はx86環境を使用した場合と比べ、 クエリ実行時間が長くなりパフォーマンスが低下する可能性があることが分かる。 しかしこのような結果になった原因については、CPUのアーキテクチャ、 オペレーティングシステムやMySQLのバイナリなど様々な要因が考えられるが、 現時点では原因を特定できていない。
x86環境と異なり、x86-64環境ではMySQLのバッファサイズ(innodb_buffer_pool_size)を2GB以上に設定することができる。 バッファサイズを2GBに設定した場合とより大きく14GBに設定した場合の違いを比較するため、 バッファサイズが2GBである環境DL385Bと14GBに設定したDL385CのPowerテストの結果を比較した(図8参照)。 どちらの環境もOSは64bitである。
図8のPowerテストの結果におけるDL385Cのスケールファクタ2の突出した結果は、 データベース上のすべてのデータ(スケールファクタ2で約6GBのデータサイズ)が 14GBに設定されたMySQLのバッファ上に配置できていたためであると考えられる。 一方DL385Bのスケールファクタ2の結果は、MySQLのバッファが2GBしかないため、 データベース上のすべてのデータをMySQLバッファに配置できなかったために低下したと考えられる。
また、スケールファクタ8におけるデータベース上のデータサイズは約24GBとなるが、 このときのDL385BとDL385Cの結果を比較しても分かるとおり、 すべてのデータをMySQLバッファに配置できない場合であっても MySQLのバッファの大きさは有意な差としてパフォーマンスに現れている。
以上からMySQLを利用する際、十分なメモリサイズがあるならばより大きなMySQLのバッファを確保することで、パフォーマンス向上を期待できる。
MySQL版DBT-3では「考察2.3. 二重のサブクエリを含むクエリに対するEXPLAIN実施時間」 で説明したとおり、異常に長いEXPLAIN実施時間を必要とするクエリ22のEXPLAIN実施を行わないようにしている。 しかしストリーム数1でPowerテストの実施結果とThroughputの実施結果を比較すると、Throughputテストの実施結果が非常に低いことが分かる(図9参照)。
原因を調査したところ、全クエリのEXPLAIN実施時間の合計がスケールファクタに応じて増加していることが分かった(図10参照)。
22個の各クエリのEXPLAIN実施時間を調査したところ、 DBT-3で使用されるほとんどのクエリでEXPLAINの実施は1秒以内で完了するが、 いくつかのクエリでスケールファクタに依存して実施時間が増加していた。
以下に5秒以上の実施時間を必要としたクエリとその実施時間を示す(図11および表7参照)。 トータルは、全クエリのEXPLAIN実施時間の合計である。
| スケールファクタ | クエリ7 | クエリ8 | クエリ9 | クエリ13 | クエリ18 | その他合計 |
|---|---|---|---|---|---|---|
| 1 | 0.10分 | 0.12分 | 0.18分 | 0.10分 | 0.10分 | 0.02分 |
| 2 | 0.18分 | 0.25分 | 0.42分 | 0.23分 | 0.20分 | 0.03分 |
| 4 | 9.10分 | 1.48分 | 3.83分 | 0.47分 | 0.40分 | 0.03分 |
| 8 | 16.57分 | 14.52分 | 14.52分 | 1.03分 | 0.83分 | 0.12分 |
上記の各クエリを調査したところ以下の事実が判明した。
クエリ7,8,9,13のEXPLAIN実施時間の問題は「考察2.3. 二重のサブクエリを含むクエリに対するEXPLAIN実施時間」と同じく、 MySQLのサブクエリのEXPLAIN処理に関する最適化の問題が原因だと考えられる。 将来バージョンでの改善を期待したい。
個々のクエリ実施時間のスケールファクタによる影響を調査するため、 スケールファクタ8でPowerテストを実施した時のクエリ実施時間を環境DL385Bと環境DL385Cの測定結果を用いて比較調査した(図12参照)。
図12では、DL385BとDL385Cにおいてクエリ8、9、14の実施時間が長いという共通な傾向がある。 一方、クエリ14について見るとDL385Cで一番遅がDL385Bでは3番目に遅いクエリとなっている。 このため、DL385BとDL385Cでのクエリ実施時間に関して共通の傾向を見つけることは出来なかった。
そこで、Powerテストの各クエリの実施時間をスケールファクタ1の時と、 スケールファクタ8のときで比較をし、その増加率についてなんらかの共通の 傾向がないか調査した(図13参照)。
図13にあるとおり、クエリ14とクエリ2の増加率が他のクエリに比較して大きいことが分かった。 原因を調査するため、図13と同じスケールファクタ1とスケールファクタ8の増加率のグラフを ストリーム数1の時のThroughputテストのクエリ実施時間について作成した(図14参照)。
Powerテストの場合とThroughputテストの場合でその傾向が極端に異なっており、 Powerテストにおいて増加率の大きかったクエリ14とクエリ2がThroughputテストでは他に比較しても さほど増加率は大きいとはいえない結果となった。 一方、Throughputテストではクエリ20の増加率は非常に大きくなっている。
この原因の調査するために、PowerテストとThroughputテストそれぞれの実施方法の違いを調査した。
2つのテストの実施手順と、上記増加率の大きいクエリの間には、次のような関係が見られた。
Powerテストにおいては、クエリの実施順番と増加率には何らかの関係があるように見えるが、 Throughputテストではその傾向を見ることが出来なかった。
残念ながら、ここまでの分析ではクエリ実施時間に関する一般的な傾向を導き出すことは出来なかった。