序章

ベンチマークを使用すると、インフラストラクチャのパフォーマンスを見積もることができるため、特定のセットアップがワークロードのニーズに対応できるかどうかを判断できます。 これは、増大するコンピューティングニーズを満たすために、高いサーバーパフォーマンスとスケーリングを維持するための重要なコンポーネントです。 ベンチマークテストを使用すると、サーバーリソースを監視し、パフォーマンスを最適化し、使用率を管理し、発生する可能性のある問題を予測できます。

このチュートリアルでは、アプリケーションを模倣するワークロードをシミュレートすることにより、DigitalOceanブロックストレージボリュームのベンチマークを行うためのベストプラクティスについて説明します。

ドロップレットとブロックストレージのボリュームテストのセットアップ

適切なドロップレットとブロックストレージボリュームのセットアップを構成するために、テストしているワークロードの仕様を決定する必要があります。 DigitalOcean Volumesを代替製品に対してベンチマークする場合は、より近い比較ができるように、同様の構成のプランを選択するようにしてください。

ドロップレットの設定に関するガイダンスについては、チュートリアル「最初のDigitalOceanドロップレットを作成する方法」を参照してください。 ブロックストレージボリュームは、ドロップレットと同時に作成できます。場合によっては、コントロールパネルドロップレットの下にあるボリュームタブから後で作成できます。 ボリュームの作成と管理の詳細については、「DigitalOceanブロックストレージの概要」を参照してください。

パフォーマンス要件を満たすファイルシステムでボリュームをフォーマットします。 最も人気のあるデフォルトのファイルシステムはExt4で、前世代のExt3およびExt2よりもパフォーマンスが高くなっています。 XFSファイルシステムは、パフォーマンスと大きなデータファイルを専門としています。 ファイルシステムの詳細については、「LinuxでDigitalOceanブロックストレージボリュームをパーティション分割およびフォーマットする方法」を参照してください。 特定のファイルシステムや構成設定がない場合は、ブロックボリュームの作成とマウントのプロセスがコントロールパネルで自動化されます。

DigitalOcean Control Panel view of setting up volumes

セットアップが整ったら、パフォーマンステストを最大限に活用するために使用できるベンチマークツールと構成の説明に進むことができます。

ベンチマークツールと構成

パフォーマンスをテストするためのパフォーマンス測定ツールfioについて説明します。これは、非常に柔軟性があり、ほとんどのディストリビューションでサポートされているためです。 調査して使用する可能性のある代替ベンチマークツールには、 Bonnie ++ btest 、およびFilebenchがあります。

Ubuntuサーバーにfioをインストールするには、最初にパッケージリストを更新してから、次のコマンドを使用してインストールする必要があります。

  1. sudo apt update
  2. sudo apt install fio

各ベンチマークツールには、テストに最適なパフォーマンスを得るために調整できるさまざまなパラメーターが付属しています。

調整する価値のあるパラメーターの1つは、キューの深さです。これは、ボリュームが最高のパフォーマンスを発揮する並列処理です。 通常、キューの深さが1の場合は、前のトランザクションが完了するまでワークロードが別のトランザクションを開始できないことを示します。 高度に並列化されたアプリケーションをシミュレートする場合は、テストに低いキュー深度の数値のみを使用してください。 それ以外の場合は、アプリケーションに必要なパフォーマンスが得られるまで、キューの深さを増やし続けます。

ベンチマークツールfioでは、いくつかの一般的な構成オプションが含まれます。

オプション 推奨事項
iodepth fioがファイルに発行するキューの深さ。 最高の入出力(I / O)レートを達成するには、iodepth=64より大きい数値をお勧めします。
bs I /Oが使用するブロックサイズ(バイト単位)。 ファイルシステムはメタデータに4Kを使用しますが、ファイルをはるかに大きなブロックサイズで保存する傾向があります。 データベースは通常、8〜16KサイズのI/Oを発行します。 ピーク帯域幅テストでは、bs=64k以上のブロックサイズをお勧めします。
runtime ベンチマークを実行するための秒単位の時間。 通常はruntime=120sからruntime=300sの範囲で、60秒を超えるランタイムをお勧めします。
ioengine ioengineオプションは、ジョブがファイルにI/Oを発行する方法を定義します。 Linuxネイティブ非同期I/Oを指すioengine=libaioをお勧めします。
direct ブール値を取ります。0は、ファイルシステムキャッシュを使用して、アプリケーションの動作に最も近い値を返します。これにより、通常のベンチマーク結果よりも高くなる可能性があります。 1は、ファイルシステムのキャッシュ動作をスキップし、ブロックボリュームが実行できるパフォーマンスに最も近いパフォーマンスを返します。 direct=1をお勧めします。
sync バッファリングされた書き込みには同期I/Oを使用します。 このオプションはブール値を取ります。0は、ユニットアクセスを強制しないことを意味し、ファイルシステムのように動作するfioを備えた通常のディスクドライブの場合と同じようにライトバックキャッシュの動作を実行できます。 1はユニットへのアクセスを強制します。つまり、ディスクが物理的な配置を保証するまでI/Oは完了しません。 sync=0をお勧めします。
size 整数を取るテストファイルのサイズ。 通常、少なくとも20ギガバイトをお勧めします。 DigitalOceanのパフォーマンスは、ボリュームサイズによって変化しないことに注意してください。

これらの構成を念頭に置いて、実行したいベンチマークテストの例をいくつか見ていきましょう。

ベンチマークテストの実行

実行できるベンチマークの例を次に示します。 このチュートリアルの次のセクションでは、受け取った出力をより詳細に検査する方法について説明します。

次のコマンドでは、NYC3データセンターに基づくボリューム上のfio.testファイルを指しています。使用する特定のファイルシステムを指すように、必ず更新してください。

書き込み帯域幅

このテストでは、ブロックボリュームに1MBのランダム書き込みを実行します。

  1. fio --filename=/mnt/volume-nyc3-04/fio.test \
  2. --direct=1 \
  3. --rw=randwrite \
  4. --ioengine=libaio \
  5. --bs=1024K \
  6. --iodepth=32 \
  7. --name=bw-test \
  8. --runtime=120s \

標準のドロップレットの場合、200MB/secの出力が期待されます。 高CPUドロップレットを使用している場合は、300MB/secの出力を期待する必要があります。

ランダム読み取りテスト

これにより、デバイスから複数の小さなファイルを読み取る速度が測定されます。

  1. fio --filename=/mnt/volume-nyc3-04/fio.test \
  2. --direct=1 \
  3. --rw=randread \
  4. --ioengine=libaio \
  5. --bs=4K \
  6. --iodepth=128 \
  7. --name=rand-r \
  8. --runtime=120s \

標準のドロップレットの場合、1秒あたりの5000 I / O操作(IOPS)の出力が期待されます。 高CPUドロップレットの場合、6000IOPSを超える出力が期待されます。

ランダム書き込みテスト

これにより、複数の小さなファイルをどれだけ速く書き込むことができるかが測定されます。

  1. fio --filename=/mnt/volume-nyc3-04/fio.test \
  2. --direct=1 \
  3. --rw=randwrite \
  4. --ioengine=libaio \
  5. --bs=4K \
  6. --iodepth=128 \
  7. --name=rand-w \
  8. --runtime=120s \

5000 IOPSの出力は、標準のドロップレットに期待されるものですが、6000 IOPSより大きい出力は、高CPUドロップレットに期待されるものです。

レイテンシーテストを読む

読み取り遅延テストを使用して、ディスク上の適切なデータブロックを見つけてアクセスするために必要な時間を決定します。

  1. fio --filename=/mnt/volume-nyc3-04/fio.test \
  2. --direct=1 \
  3. --rw=randread \
  4. --ioengine=libaio \
  5. --bs=4K \
  6. --iodepth=1 \
  7. --name=lat-read \
  8. --runtime=120s \

このテストでは、5ms未満を返す出力が期待されます。

レイテンシーテストを書く

このテストでは、ディスク書き込み要求が作成されてから完了するまでの遅延を測定します。

  1. fio --filename=/mnt/volume-nyc3-04/fio.test \
  2. --direct=1 \
  3. --rw=randwrite \
  4. --ioengine=libaio \
  5. --bs=4K \
  6. --iodepth=1 \
  7. --name=lat-write \
  8. --runtime=120s \

ここでも、このテストでは5ms未満の出力が期待されます。

出力の検査

テストを実行すると、結果の出力を調べて、DigitalOceanボリュームによって処理された読み取りおよび書き込み操作の数を調べることになります。 各テストが完了するまでにかかった時間に注意を払う必要があります。

以下は、書き込み帯域幅テストの出力例です。

  1. fio --filename=/mnt/volume-nyc3-04/test.fio --direct=1 --rw=randwrite --ioengine=libaio --bs=1024k --iodepth=32 --name=bw-test --runtime=120s
Output
bw-test: (groupid=0, jobs=1): err= 0: pid=2584: Fri Apr 20 17:14:19 2018 write: io=22937MB, bw=195468KB/s, iops=190, runt=120160msec slat (usec): min=54, max=622, avg=135.46, stdev=23.21 clat (msec): min=7, max=779, avg=167.48, stdev=26.28 lat (msec): min=7, max=779, avg=167.62, stdev=26.28 clat percentiles (msec): | 1.00th=[ 101], 5.00th=[ 155], 10.00th=[ 159], 20.00th=[ 163], | 30.00th=[ 165], 40.00th=[ 167], 50.00th=[ 167], 60.00th=[ 167], | 70.00th=[ 169], 80.00th=[ 169], 90.00th=[ 172], 95.00th=[ 178], | 99.00th=[ 306], 99.50th=[ 363], 99.90th=[ 420], 99.95th=[ 474], | 99.99th=[ 545] bw (KB /s): min=137730, max=254485, per=100.00%, avg=195681.88, stdev=9590.24 lat (msec) : 10=0.01%, 20=0.03%, 50=0.37%, 100=0.58%, 250=97.55% lat (msec) : 500=1.44%, 750=0.03%, 1000=0.01% cpu : usr=1.76%, sys=1.83%, ctx=22777, majf=0, minf=11 IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=99.9%, >=64=0.0% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.1%, 64=0.0%, >=64=0.0% issued : total=r=0/w=22937/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0 latency : target=0, window=0, percentile=100.00%, depth=32 Run status group 0 (all jobs): WRITE: io=22937MB, aggrb=195468KB/s, minb=195468KB/s, maxb=195468KB/s, mint=120160msec, maxt=120160msec

上記の出力で強調表示されている行は、平均帯域幅をbw=195468KB/sとして示し、1秒あたりのI / O操作(IOPS)をiops=190として示しています。 この特定のシナリオでは、1秒あたり200MBのピークレート(190iops * 1M =~ 190MB/sec)で1MBの書き込みを実行していたため、IOPSは低くなっています。

読み取り遅延テストを実行すると、次のような行のメトリックが表示されます。

Output
lat-read: (groupid=0, jobs=1): err= 0: pid=2628: Fri Apr 20 17:32:51 2018 read : io=855740KB, bw=7131.2KB/s, iops=1782, runt=120001msec slat (usec): min=8, max=434, avg=16.77, stdev= 5.92 clat (usec): min=2, max=450994, avg=539.15, stdev=2188.85 lat (usec): min=53, max=451010, avg=556.61, stdev=2188.91

上記の例では、I / Oレイテンシが556usecまたはマイクロ秒(または0.5ミリ秒またはミリ秒)であることがわかります。 これは、ブロックボリュームに対して単一の4K I/Oを実行するのにかかる時間を示します。

遅延は、ストレージシステムのパフォーマンス、I / Oのサイズ、キューの深さ、トリガーされるスロットル制限など、いくつかの要因の影響を受けます。

ベンチマークテストが完了したら、ドロップレットとボリュームを削除できます。

パフォーマンス結果を理解する

:DigitalOceanブロックストレージボリュームには、通常のベンチマークよりも高くなる可能性のある追加のパフォーマンス強化機能(バーストなど)があります。 この影響は、プロファイルを数秒より長く実行することで軽減できます。

DigitalOceanブロックストレージボリュームは、SANベースのSSDストレージです。 このため、特定のボリュームのパフォーマンスは、ブロックサイズとキューの深さに比例します。 つまり、ストレージは、すべてを同時に実行するために多くの作業が与えられたときに最高のパフォーマンスを発揮します。

以下は、並列処理のパフォーマンスの例を示すグラフです。 画像をクリックすると拡大します。

Impact of Queue Depth on IOPS Graph

DigitalOceanのパフォーマンスは、最大IOPSと最大帯域幅のどちらか早い方によって制限されます。 DigitalOceanでは、パフォーマンスはボリュームサイズによって変わりません。 ただし、IOPSと帯域幅は特定のレートで制限されているため、クロスオーバー効果があります。 つまり、小さなサイズのI / Oでキューの深さを増やすと、代わりにIOPS制限に達するため、200MB/秒のピーク帯域幅に到達しません。 大きなブロックの場合、代わりに200MB /秒の帯域幅制限に達するため、5000のピークIOPSには到達しません。

経験則として、32K以上のブロックサイズを使用すると、200MB /秒の帯域幅制限に達するため、5000 IOPS未満になりますが、16K以下のブロックサイズを使用すると、帯域幅制限未満になります。 5000 IOPSに達するため、200MB/秒になります。

実際の例として、IOPSと帯域幅を比較してみましょう。

Read Throughput Graph

Read IOPS Graph

最初のグラフは、アプリケーションのブロックサイズとキューの深さを考慮した場合の一般的な帯域幅を示しています。 4Kと256Kの2つの異なるブロックサイズを検討します。

4K値を見ると、キューの深さが4で5000 IOPSに達していることがわかりますが、帯域幅が20MB/秒に達していることはこれまでにありません。 それは5000 IOPS * 4K = 20MB/secだからです。 これは、I / Oが制限されているため、4Kワークロードが20MB/秒を超えることはないことを意味します。

256Kのワークロードを見ると、キューの深さが2で200MB /秒に達していることがわかりますが、200MB/sec / 256K = 800 IOPSであるため、800IOPSを超えるIOPSレートは表示されません。

DigitalOceanブロックストレージボリュームは、16K〜64Kの一般的なファイルシステムワークロードに合わせて調整されています。 これらのブロックサイズでは、IOPSと帯域幅の間に適切なトレードオフが見られます。

ブロックサイズ IOPS 帯域幅
4K 〜5000 IOPS 〜20MB/秒
16K 〜5000 IOPS 〜80MB/秒
32K 〜5000 IOPS 〜160MB/秒
64K 〜3200 IOPS 〜200MB/秒
256K 〜800 IOPS 〜200MB/秒

シミュレートされたI/Oワークロードのベンチマークからの出力を受け取ると、アプリのニーズに基づいて最適なセットアップを分析できるようになります。

結論

このガイドでは、予想されるワークフローをシミュレートするために、DigitalOceanドロップレットとブロックストレージボリュームのベンチマークを実行する方法について説明しました。 ワークフローの一部としてベンチマークテストを組み込むことで、アプリケーションの適切なスケールを維持し、問題が発生する前に予測することができます。

DigitalOceanブロックストレージの操作方法の詳細については、「DigitalOceanブロックストレージボリュームで暗号化ファイルシステムを作成する方法」および「DigitalOceanブロックストレージを使用して操作する方法」を参照してください。 Doctl。」