SQL ServerディスクテストのSQLIO編(二)

8348 ワード

前回の記事では、ディスククラスタサイズのデフォルト4 KBとカスタム64 KBについてテストを行いました。テスト内容はランダムと順番に読み書きされ、サイズは8 KBと64 KBで、SQL ServerのすべてのIOの使用状況に配慮していないという人もいます。このテスト記事では、SQL Server IOの動作をできるだけシミュレートし、クラスタサイズ4 KB、8 KB、64 KBを全方位で検証します。今回はクラスタサイズ8 KBを追加しました。


注意:本テストでは2つのSSDからなるRAID 1を使用しています.
まず、SQL ServerのIO動作を分析します.参考URL:Choosing what SQLIO tests to Run and Automating the Tests
以下の点は私が文章に基づいて整理したもので、完全に翻訳したわけではありません.
1、SQL Serverは論理CPUごとに1つのスケジューラを割り当て、各スケジューラにはシステム負荷によって複数のWorker Threadがあるが、同じ時点で、各スケジューラには1つのWorker Threadしか実行できない.すなわち、各論理CPUは同じ時点で1つのWorker Threadしか作業を支配できない.つまりSQLIO Paramですtxtファイルで定義するtestfile.dat 8 0×0 5000はテストサーバーのロジックCPUの数を超えてはいけません.私がテストしたサーバーは:2物理CPU*6コア*デュアルスレッド=24ロジックCPUで、つまり最大設定は:testfile.dat 24 0×0 5000
2、SQL Serverは間欠的にデータを書き込み、データを書く行為はCheckPointまたはLazy Writer(メモリに圧力がある場合)によって完成する.両者が実行をトリガと、メモリ内の汚れたページが単一のスレッドでディスクに書き込まれるため、「書き込み」をテストするときにParam.txtで1つ以上のスレッドを構成するのは意味がありません.この動作は、複数のデータベースでもシリアルであるためです(もちろん、スレッド数2を構成してIO書き込み能力の限界を絞り出すことができます).また、SQL Serverは、データを書き込む際に、32個のpageである256 Kのデータを一度に書き込む場合が多いので、256 KのSizeを設定する必要があります.ただし、例外として、データベース・リカバリ・モードを「大容量ログ・モード」に設定した場合、レコード・ログを最小化した場合にトリガーされます.この動作の書き込みSizeは8 KB(または64 KB)です.
3、SQL Serverは連続してデータの読み取り操作を行い、ほとんどの読み取り操作は8 KB単位であり、プリフェッチのブロックサイズは64個のpageである512 KBであり、ゾーン全体を直接読み取るExtentである64 KBも比較的よく見られるため、読み取り操作については8 KB、64 KB、512 KBをテストすればよい.
4、ログの書き込みについては、システムの負荷の大きさに依存するため、テストSizeを決定するのは非常に難しい.しかし、一般的には60 KBを超えることはないが、テストについては、Eager WriterとLog Writerをカバーする8 KBをテスト単位として使用することをお勧めします.マイクロソフトのアジア太平洋ブログのこの文章の中で:SQL serverの各ログの書き込み(log write)はいったいどれくらいの大きさですか?、私達も知ることができて、SQL Serverのログの書くのは確かにとても固定していないで、1つの簡単なcommitは512 byteで、負荷が高い時、60 KBに近くて、ここで、私は勝手に512 byteに近い1 KBをテストの大きさとして使うことを決定して、しかも実際には、私はProcessMonitorで生産環境でしばらくLog Writerをつかんだ後、ほとんどのログは1 K以下に書かれています.
5、著者の第5条はSANストレージは、巨大なキャッシュがあり、かつ読み書きのメカニズムを最適化しているため、読み書きの差はそれほど大きくないので、Randomのみをテスト方式として使用することを提案した.この点は、著者と同じではなく、DataとLogの読み書きの特性に従ってテストを行い、ランダムと順序が配慮されることにした.
以上のように、個人の知識点に基づいて、テストの要点は以下のようにまとめられています.
1、我々はまず二つのParaを創立する.txtファイル、1つのThreadは論理CPU数24、もう1つのThreadは1に設定し、上図の「使用スレッド数」の内容に対応し、また、testfile.をテストします.datのサイズは5000 Mに調整した.
今回は誤差を避けるために、同じRAID 1のセットだけを使って、この3つのクラスタがそれぞれ4 KB/8 KB/64 KBサイズのテストを完了しました.
ParamMT.txt
D:\testfile.dat 24 0x0 5000

ParamST.txt
D:\testfile.dat 1 0x0 5000

2、以下はテストスクリプトです.-oパラメータを1から増やし、2倍にしてIOの最大能力をテストします.
次の一連のテストを行う前に、後の書き込みファイルCluster_4KB_testの4 KBはすべて8 KBまたは64 KBに置き換えればよい.
echo ****** Read Tests *****

echo ******random_R_8KB**********
sqlio -kR -s300 -frandom -o1 -b8 -LS -BH -FparamMT.txt > Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o2 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o4 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o8 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o16 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5


echo ******random_R_64KB**********
sqlio -kR -s300 -frandom -o1 -b64 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o2 -b64 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o4 -b64 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o8 -b64 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o16 -b64 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5



echo ******random_R_512KB**********
sqlio -kR -s300 -frandom -o1 -b512 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o2 -b512 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o4 -b512 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o8 -b512 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kR -s300 -frandom -o16 -b512 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5



echo ******random_W_8KB**********
sqlio -kW -s300 -frandom -o1 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o2 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o4 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o8 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o16 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5



echo ******random_W_256KB**********
sqlio -kW -s300 -frandom -o1 -b256 -LS -BH -FparamST.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o2 -b256 -LS -BH -FparamST.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o4 -b256 -LS -BH -FparamST.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o8 -b256 -LS -BH -FparamST.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -frandom -o16 -b256 -LS -BH -FparamST.txt >> Cluster_4KB_test.txt
timeout /T 5



echo ******sequential_W_1KB**********
sqlio -kW -s300 -fsequential -o1 -b1 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o2 -b1 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o4 -b1 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o8 -b1 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o16 -b1 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5



echo ******sequential_W_8KB**********
sqlio -kW -s300 -fsequential -o1 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o2 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o4 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o8 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5
sqlio -kW -s300 -fsequential -o16 -b8 -LS -BH -FparamMT.txt >> Cluster_4KB_test.txt
timeout /T 5


 
3、長い待ち時間の後、私たちはついに3つのファイルを揃えて、SqlioAnalyzerでファイルにエクスポートしました.txtファイルをインポートするとき、エラーを報告して、「1 thread」をすべて「1 threads」に置き換えて、再びインポートすればいいことに注意してください.
4、整理し、各グループのテスト最大値を取り出し、得られた結果は以下の通りである.
結果を見て、私は呆然として、できるだけSQLServer IOの行為を模擬する前提の下で、私達のこのSSDの構成のRaid 1はもうクラスタが64 KBの時性能が全面的にリードするのではありません!
  • まず2番目のヒストグラムについて言えば、順番に書くと、3つのクラスタの大きさの下でほとんど差がないことがわかります.
  • の最初のヒストグラムは、64 KBと512 KBをランダムに読み取る場合、クラスタが4 KBであることが他の2つの場合に比べて優位である.他の読み書きの場合、クラスタが8 KBと64 KBの場合が優勢です.
  • SQL Serverのランダムリードは、ほとんどが8 KB単位であると述べていますが、この点から見ると、依然としてクラスタが8 KBと64 KBの比クラスタが4 KBであることは、全体的に優位を占めていますが、クラスタが64 KB対8 KBの優位性は、わずかです.

  • そして必要に応じて比較した項目をヒストグラムにし,IOS/secをランダムに見,MB/secを順番に見た.
     

    テストのまとめ:


    SQL Server IOの動作を可能な限りシミュレートすることを前提として、私たちがテストした2つのSSDハードディスクからなるRAID 1は、最初のテスト記事とは異なるパフォーマンス動作を示しています.
    SSDの特性は、物理的なシーク形式でデータを取得するのではなく、電子記憶チップの粒子が直接読み書きされ、磁気ヘッドの移動にかかる時間がなくなり、また、SSDハードディスクの同時読み書き能力はマルチスレッド上に構築されており、同じ時点での作業は決して1つの粒子上に限定されない.本例では、テストする最大スレッドは24(テストサーバの論理CPU数)である.このSSDハードディスクが最大の効果を発揮していないことを制約しているのかもしれません.それでも,クラスタが64 KB対4 KBの場合に優位であることが分かる.
    もし違う意見があれば、提出してください.私たちは引き続き討論します.
    手元にSASハードディスクのRAIDがないので、興味があれば試してみてください.差はもっと大きいはずです.