[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のパフォーマンステストを行いたいと思います。

最後に、今回の検証に使用したマシンと記念に一枚
DSC_0413