[10月三木会技術ブログ]TPCHハードウェアチューニング
毎月大阪で第三木曜に行っている勉強会、「三木会」でお話した内容をまとめます。
今回のテーマは
「Oracleのdirect path read (diskからメモリにのせずreadし続ける) でTPCHを10GB/sが可能か?」になります。
Oracleからのdirect path readで読み出すということですが、まずDBで読み出す前に、ハードウェア的に10GB/sの性能を出す必要があるため、hardwareボトルネック中心のお話になります。
*** 検証の経緯
9月の検証では、oracleのdirect path readで1GB/secを計測しました。
500MB/secのSSDをRAID0でつなげていたので、当時の最大スループットがでていたということになります。
その時のマシン構成は以下の通りです。
(1GB/sec)デスクトップマシンの構成 CPU AND FX 8320 8core/8thread motherboard msi 970 gaming memory Memoria G.SKILL VALUE 16GB (2X8GB) 240P DDR3 1600 PC3 12800 F31600C11D16GNT 4枚 8Gx4 = 32G SSD SanDisk Ultra II 2枚 max read 550 / max write 500 RAiD 0 を2枚で構築 oracle datafileのみを置く HDD SEAGATE ST1000VX001 [1TB SATA600] OS用やoracle等アプリケーション用のHDD グラフィックカード 電源650W OS CentOS7.1
この構成で10万相当のマシンになります。
もともと検証用に購入したものでないため、メモリを多めにつんでいる以外は、データベース向けの構成にはなっていません。
これでSSDのread性能を限界まで引き出せるのなら、パーツを更に追加してどこまで行けるのか?(目標は10GB!)という疑問に答えるのが今回の検証です。
今回は、このマシンにプラス20万の予算で行います。
*** 基本的な方針
まず、基本的な方針を以下のように考えました
- SSDを20枚、RAID 0(500M/sec x 20)でつなぐ - 残りの予算でRAIDcardを購入 - motherboard、CPUでネックがでるかもしれないので様子を見て購入
最初はoracleを使わず、ハードウェア的にシーケンシャルディスクリード性能を上昇させます。
そのために、現状のハードウェアでボトルネックとなりそうな箇所を割り出します。
*** ボトルネックの割り出し
ハードウェアの知識が浅いため、基本的なところから考えました。
ボトルネックになりそうな箇所の洗い出し。 1. CPU処理性能 2. マザーボードチップセット (間の帯域) 3. SSD 最大読み出し速度 (500M/s 以上で20枚) 4. SATA3.0 (最大転送速度を6Gbps実効速度600MB/s) 5. HBA/raid card (PCIexpressの規格 gen2x16なら8GB/s) 6. SATAport 20確保
まず最初に考えるべきなのは、チップセットとCPU間のバス帯域。
ここが10GBない場合は、motherboardを取り替える必要があります。
msi 970 gamingでの各バス規格と最大帯域 (双方向) northbrige (チップセット) -> CPU HyperTransport 3.0 20GB/sec PCIExpress -> northbrige PCIExpressの対応規格がgen2x16のため8GB/s southbrige -> northbrige A-Link Express II 2GB/sec motherboardのSATAポートはここを通るため2GBで頭打ちになる
*** 追加購入部品の選定
以下のような条件でパーツ探しました。極力安いことも条件です。
RAIDcard PCIExpress2.0x16 SATAport16個以上に相当するポートが取れること。 SSD シーケンシャルリード 500MB/sec以上のもの SATAケーブル SATA3.0相当の性能
これを受けて、以下のパーツを購入しました。
RAIDcard HighPoint SAS/SATA RAID CARD 6Gb/s RocketRAID 2740 SASport4 (内部16port) PCI Express 2.0 x16 ¥26,000と定価の半額で安いものがあったため決定 SSD SSDplus SDSSDA-120G-J25C read:520 MB/s write:180 MB/s (writeはTPCHの場合遅くても良い) ¥5,000~6,000 と安い 20枚買うと¥110,000程度 SAS→SATAケーブル miniSAS → SATAファンアウトケーブル SATA4portに変換できるSASケーブル ¥1,000程度
合計¥140,000
*** 測定
以上のパーツを組み合わせて測定してみました。
fioというベンチマークツールを走らせ、処理中のiostatの監視を行い計測。
iostat -mx Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util sdb 0.00 0.00 21297.00 0.00 1632.50 0.00 128.00 1.58 0.14 0.07 83.60
1.5GB/sec程度しか出ていない!
原因を割り出すために幾つかのチューニングを試します。
*** 原因調査
原因を切り分けていくため、幾つかの確認とチューニングを施しました。
1. SSDは一枚read 500MB/sec でるのか?
新しく購入したSSDのread性能を一枚で (raid0無し) で確認しました。
hdparm -Tt /dev/sda 522.43 MB/sec
SSDは悪くないようです。
2. ディスクチューニングをしてみる
TPCHでよくやるチューニングと同等のチューニングを行いました。
このチューニングでパフォーマンスの上昇が見られるのか、どこで頭打ちになるのかを確認します。
ブロックサイズの調整 (上昇) チャンクサイズの調整 (上昇) Parallels度の調整 (実行プロセス数) 結果 | | ChunkSize64k | CS256k | CS1024k | | | xfs | xfs | xfs | | | (MB/s) | (MB/s) | (MB/s) | |---------------+--------------+--------+---------| | Seq-Read-32k | 1372.3 | 1242.3 | 653.6 | | Seq-Read-128k | 1814.4 | 1817.5 | 1090.5 | | Seq-Read-256k | 1845.4 | 1988.5 | 1747.7 | | Seq-Read-512k | 1999.5 | 2199.7 | 2185.7 | | Seq-Read-1m | 2052.6 | 2397.6 | 2585.7 | | Seq-Read-2m | 2414.2 | 2538.9 | 2592.1 | | Seq-Read-4m | 2273.5 | 2530.2 | 2600.5 | | Seq-Read-8m | 2197.5 | 2527.6 | 2595.9 | | Seq-Read-16m | 2115.1 | 2526.8 | 2605.5 | | Seq-Read-32m | 2350.1 | 2524.1 | 2603.8 | | Seq-Read-128m | 2117.4 | 2502.9 | 2590.4 | | Seq-Read-256m | 2265.2 | 2484.2 | 2565.1 | | Seq-Read-512m | 2138.7 | 2429.8 | 2510.1 |
fioの場合、設定のiodepthがParallels度に当たります。iodepth=10として
ブロックサイズを上昇、チャンクサイズを上昇させながら測ったところ2.6GB/sec近くまで上昇しました。
しかし、この2.6GBで頭打ちとなってしまい、これ以上はどうやってもでません…
この辺りで時間も残り少なくなってきました。
*** 頭打ちの原因のポイント
最も原因として怪しいのはRAIDcardチップセットではないかと思われます。
その根拠は以下のように考えました
1. SSD、SASケーブルは問題ない 2. PCIExpressの規格の処理限界より大きく下回るためPCIExpressも問題はない 3. CPU利用率も限界ではない 4. SSDを一枚から順番に足していくと2.5GBまでは順調に上昇するが、2.5GBから急に上がらなくなる。request数も4,0000程度で制限される。 5. 別のASUS系のマザーボードでWindows7環境のベンチマークをとったときも同じように2.5Gで頭打ちとなった (カーネルパラメータなどで抑えられている可能性も低い) ==> RAIDCard のコントローラーチップセットの処理限界が濃厚
*** 10GB/secを実現させるには?
勉強会最後に弊社のハードウェア部門の方に実績のあるサーバーで、実演していただきました。
弊社がデータベースアプライアンスとして売り出している「Insight Qube」を使用して、Oracleからのdirect path readで10GB/secを見事に成功させていただきました。
そこで頂いたアドバイスなどから、10GB/secへ近づくための注意点をまとめました。
1. raidcardのコントローラーの処理性能は公開していないことも多い 2. 規格的に8GB/secのパフォーマンスとされているが、実際の処理性能は測るまではわからない 3. SSD,RAIDcardは、実際にベンチマークでの結果がでているものから試算する 4. RAIDcardはコントローラー限界があるため、複数枚さすことを考えてmotherboardのPCIExpress最大リンク幅は多いほうが良い 5. Oracleを使用した場合はCPU使用率も大きく上がった 10GB/secではCPUがネックになる可能性が高い
これらの実現には
RAIDcardの追加購入 (実績あるもの)、motherboardの変更 (PCIExpressの最大リンク幅が狭いため)、CPUの変更 (次にネックになる可能性が高い)
が必要となるのですが、予算的に購入は難しいため今回のベンチマークは以上となりました。
今回の失敗を踏まえて、最初から多くのディスクリードを見積もってパーツを選定すればもっと良い結果にできそうです。
11月の三木会では今回作成したマシンを使用して、SQL Server2016のパフォーマンステストを行いたいと思います。
最後に、今回の検証に使用したマシンと記念に一枚