HP ProLiant MicroServer を SQL Server のデータストレージとして使ってみるとどうなのかなと思って試してみました。
以前投稿した SQLIOSIM を使用したストレステストの実施 を見て思い出しながら検証しています。
■MicroServer と SQL Server の接続方法
MicroServer には Windows Server 2012 + iSCSI Target をインストールしています。
ML110 G6 + Windows Server 2012 + SQL Server 2012 の SQLIOSIM を使用して MicroServer を SQL Server のストレージとして使用した場合にどうなるかの計測を実施しています。
iSCSI の設定としては以下の情報を参考に多少チューニングをしています。
How to improve Microsoft iSCSI initiator performance
Configure iSCSI Network Cards as per Microsoft Best Practices PowerShell
MicrosoftR iSCSI Target 3.3 availability and performance white paper (2010)
Windows Server 2008 または Windows Server 2008 R2 環境で、遅延 ACK を有効にするようにネットワーク環境を設定し、ストレージが iSCSI を使用して接続されている場合、一般的な操作を実行すると iScsiPrt エラーがシステム イベント ログに出力される
といっても initiator 側 と target 側の以下のレジストリを変更しているぐらいですが。
- HKLMSYSTEMCurrentControlSetControlClass{4D36E97B-E325-11CE-BFC1-08002BE10318}<Instance Number>Parameters
iSCSIDisableNagle : 0x1 (DWORD) - HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParametersInterfaces<Interface GUID>
TcpAckFrequency : 0x1 (DWORD)
MicroServer の iSCSI のストレージとして使用しているディスクのパフォーマンスは以下のようになっています。
記憶域プールからストライプした仮想ディスクを切り出すよりダイナミックディスクのストライプのボリュームを使用したほうが CrystalDiskMark のスループットはよかったのですよね。
MicroServer のディスク接続は SATA2 になりますので、転送速度は 300MB/sec 程度になると思います。
今回はディスクに Intel SSD 320 120GB を使用しており、カタログスペックは こちら になります。
Capacity |
Sequential Read/Write |
Random 4KB Read/Write |
Form Factor |
120GB | 270 MB/s / 130 MB/s | 38K IOPS / 14K IOPS |
2.5 inch SATA, 7.0 and 9.5 mm |
SSD 1 本だとパフォーマンスがそれほど出そうにないので、同じ SSD を 3 本搭載して、OS のソフト RAID でストライピングをしています。
ネットワークは Giga Hub に接続をしているのですが、シングルパスだと帯域が不足してしまうので MPIO で Giga の NIC 2 本で MPIO の構成としています。
下の画像は iSCSI で接続しているディスクに対して I/O をかけている際のタスクマネージャーで両方の NIC が使用されていることを確認した状態になります。
CrystalDiskMark で iSCSI Target に接続をしているディスに対してベンチマークをとった結果がこちらです。
ローカルディスクに対して CrystalDiskMark を実行した結果がこちらです。
# 3 本のディスクで記憶域プールを作成して、ストライプした仮想ディスクを使っています。
■SQLIOSIM でパフォーマンスを計測してみる
ローカルディスクと iSCSI で接続しているディスクに対して SQLIOSIM を実行してパフォーマンスを計測してみたいと思います。
以下のグラフは NIC の I/O になるのですが、各 NIC から 120MB 程度の I/O となっているようですね。
各 NIC から 960Mbps ですので、Giga の帯域をほぼ使い切れている状態ですね。
ディスク I/O のグラフがこちらになります。
iSCSI 経由での接続となっていますので両方の NIC の I/O を足したもの (240MB 前後) と同じトレンドとなっています。
Read と Write を別でグラフ化したものがこちらになります。
Read / Write ともにそれなりの数値が出ていますね。
次にローカルディスクで SQLIOSIM を実行したものを取得してみます。
iSCSI のディスクより、高い値を示しているタイミングがありますね。
こちらも Read と Write の状態を見てみたいと思います。
最初の Write / 最後の Read 以外は iSCSI のディスクと比較して低い値となっていますね。
SQLIOSIM では最初に Performing initial Update Scan, Checkpointing initial Update Scan / 最後に Performing final Audit Scan #1 が実行されており、これらの処理に関してはローカルディスクのほうが高いパフォーマンスを示しています。
データベースファイルの初期化と DBCC アクティビティに関してはローカルディスクのほうがパフォーマンスが良いようですね。CrystalDiskMark では Sequential Read / Write の上限はローカルディスクで測定した場合、300MB 前後でしたので測定した上限値が SQLIOSIM でも出ているようです。
その他の処理 (Random Query / Read Ahead / Bulk Update) に関しては iSCSI で接続しているディスクのほうがパフォーマンスが良いようですね。
SQLIOSIM の実行結果がこちらになります。
データファイル
iSCSI | ローカルディスク | |
Target IO Duration (ms) | 100 | 100 |
Running Average IO Duration (ms) | 55 | 1,138 |
Number of times IO throttled | 30,252 | 23,145 |
IO request blocks | 579 | 99 |
Reads | 18,302 | 9,127 |
Scatter Reads | 44,496 | 30,480 |
Writes | 1,132 | 1,016 |
Gather Writes | 94,973 | 62,278 |
Total IO Time (ms) | 403,489,605 | 429,836,426 |
ログファイル
Target IO Duration (ms) | 100 | 100 |
Running Avera ge IO Duration (ms) |
1,357 | 39 |
Number of times IO throttled | 35 | 110 |
IO request blocks | 1 | 7 |
Reads | 0 | 0 |
Scatter Reads | 0 | 0 |
Writes | 18,143 | 3,291 |
Gather Writes | 0 | 0 |
Total IO Time (ms) | 630,911 | 279,448 |
ユーザー数を調整して負荷をかけた結果がこちらになります。
iSCSI
ローカルディスク
データファイル
iSCSI | ローカルディスク | |
Target IO Duration (ms) | 100 | 100 |
Running Average IO Duration (ms) | 52 | 46 |
Number of times IO throttled | 18,867 | 22,148 |
IO request blocks | 1,475 | 3,513 |
Reads | 6,691 | 6,772 |
Scatter Reads | 32,451 | 30,286 |
Writes | 782 | 1,387 |
Gather Writes | 70,175 | 63,127 |
Total IO Time (ms) | 686,027,641 | 461,113,556 |
ログファイル
iSCSI | ローカルディスク | |
Target IO Duration (ms) | 100 | 100 |
Running Average IO Duration (ms) | 41 | 43 |
Number of times IO throttled | 34 | 82 |
IO request blocks | 8 | 8 |
Reads | 0 | 0 |
Scatter Reads | 0 | 0 |
Writes | 5,862 | 5,538 |
Gather Writes | 0 | 0 |
Total IO Time (ms) | 1,020,710 | 339,656 |
こちらのグラフにはディスクのキューも追加してみたのですが、ユーザー数を増やすと、ディスクキューのトレンドが変わってくるようですね。
# Network に関してはキューはたまっていませんでした。
iSCSI で I/O が停止しているタイミングがあり、その影響で SQL Server の I/O 数にも影響が出てきています。
少量の OLTP 処理であれば MicroServer でパフォーマンスを出せそうですが、同時接続数が上がると少し厳しい感じがしますね。