前書き

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

このチュートリアルでは、アプリケーションを模倣するワークロードをシミュレートして、DigitalOceanブロックストレージボリュームのベンチマークを行うベストプラクティスを検討します。

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

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

ドロップレットの設定に関するガイダンスについては、チュートリアル「https://www.digitalocean.com/community/tutorials/how-to-create-your-first-digitalocean-droplet [最初のDigitalOceanドロップレットの作成方法]」を参照してください。ブロックストレージボリュームは、ドロップレットと同時に作成できます。場合によっては、後で*コントロールパネル*の*ドロップレット*の下にある*ボリューム*タブから作成することもできます。 ボリュームの作成と管理の詳細については、「https://www.digitalocean.com/community/tutorials/an-introduction-to-digitalocean-block-storage[DigitalOceanブロックストレージの概要]」を参照してください。

パフォーマンス要件を満たすファイルシステムでボリュームをフォーマットします。 最も一般的なデフォルトのファイルシステムはExt4です。これは、前世代のExt3およびExt2よりも高いパフォーマンスを発揮します。 XFSファイルシステムは、パフォーマンスと大きなデータファイルに特化しています。 ファイルシステムの詳細は、https://www.digitalocean.com/community/tutorials/how-to-partition-and-format-digitalocean-block-storage-volumes-in-linux#formatting-the-partitions [LinuxでDigitalOceanブロックストレージボリュームをパーティション化およびフォーマットする方法]。特定のファイルシステムまたは構成設定がない場合、ブロックボリュームの作成とマウントのプロセスはコントロールパネルで自動化されます。

image:https://assets.digitalocean.com/articles/benchmark-digitalocean-volumes/add-volume-gui.png [ボリュームを設定するためのDigitalOceanコントロールパネルビュー]

セットアップが完了したら、パフォーマンステストを最大限に活用するために使用できるベンチマークツールと構成について説明します。

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

パフォーマンスをテストするためのパフォーマンス測定ツールhttps://github.com/axboe/fio[fio]について説明します。これは非常に柔軟性が高く、ほとんどのディストリビューションでサポートされているためです。 調査および使用が必要な代替ベンチマークツールには、https://www.coker.com.au/bonnie/ [Bonnie ]、https://sourceforge.net/projects/btest/ [btest]、およびhttps://があります。 github.com/filebench/filebench/wiki[Filebench]。

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

sudo apt update
sudo apt install fio

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

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

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

Option Recommendations

iodepth

The queue depth that fio will issue to the file. In order to hit best input/output (I/O) rates, a number greater than iodepth=64 is recommended.

bs

Block size in bytes for I/O to use. File systems use 4K for metadata but tend to store files in much larger block sizes. Databases typically issue 8-16K sized I/O. For peak bandwidth tests, we recommend a block size of bs=64k or greater.

runtime

The time in seconds to run the benchmark. We recommend a runtime greater than 60 seconds, usually in the range of runtime=120s to runtime=300s.

ioengine

The ioengine option defines how the job issues I/O to the file. We recommend ioengine=libaio which refers to Linux native asynchronous I/O.

direct

Takes a Boolean value: 0 uses the filesystem cache returning a value closest to the application behavior which may result in higher than typical benchmark results; and 1 skips any file system caching behavior, returning the closest performance to what the block volume can do. We recommend direct=1.

sync

Use synchronous I/O for buffered writes. This option takes a Boolean value: 0 means not to force unit access, allowing for writeback cache behavior to operate like it does on normal disk drives with fio behaving more like a filesystem; 1 forces unit access, meaning I/O will not complete until the disk has guaranteed physical placement. We recommend sync=0.

size

Size of test file, taking an integer. We typically recommend at least 20 gigabytes. Note that DigitalOcean’s performance does not vary with volume size.

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

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

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

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

書き込み帯域幅

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

fio --filename= \
--direct=1 \
--rw=randwrite \
--ioengine=libaio \
--bs=1024K \
--iodepth=32 \
--name=bw-test \
--runtime=120s \

標準のドロップレットの場合、「+ 200MB /秒+」の出力が期待されます。 高CPUドロップレットを使用している場合、「+ 300MB /秒+」の出力が期待できます。

ランダム読み取りテスト

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

fio --filename= \
--direct=1 \
--rw=randread \
--ioengine=libaio \
--bs=4K \
--iodepth=128 \
--name=rand-r \
--runtime=120s \

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

ランダム書き込みテスト

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

fio --filename= \
--direct=1 \
--rw=randwrite \
--ioengine=libaio \
--bs=4K \
--iodepth=128 \
--name=rand-w \
--runtime=120s \

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

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

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

fio --filename= \
--direct=1 \
--rw=randread \
--ioengine=libaio \
--bs=4K \
--iodepth=1 \
--name=lat-read \
--runtime=120s \

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

書き込み遅延テスト

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

fio --filename= \
--direct=1 \
--rw=randwrite \
--ioengine=libaio \
--bs=4K \
--iodepth=1 \
--name=lat-write \
--runtime=120s \

ここでは、このテストの出力が「+ 5ms +」未満であることも期待しています。

出力の検査

テストを実行したら、結果の出力を調べて、DigitalOcean Volumesによって処理された読み取りおよび書き込み操作の数を調べます。 各テストが完了するまでにかかった時間に注意してください。

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

fio --filename=/mnt/volume-nyc3-04/test.fio --direct=1 --rw=randwrite --ioengine=libaio --bs=1024k --iodepth=32  --name=bw-test --runtime=120s
Outputbw-test: (groupid=0, jobs=1): err= 0: pid=2584: Fri Apr 20 17:14:19 2018
 write: io=22937MB, , , 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のピークレートで1MBの書き込みを実行していたため、IOPSは低くなります( ` 190iops * 1M =〜190MB / sec +`)。

読み取り遅延テストを実行すると、次のような行でメトリックスを受け取ります。

Outputlat-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, , stdev=2188.91

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

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

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

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

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

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

image:https://assets.digitalocean.com/articles/benchmark-digitalocean-volumes/impact-queue-depth-graph.png [IOPSグラフでのキュー深度の影響]

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

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

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

image:https://assets.digitalocean.com/articles/benchmark-digitalocean-volumes/read-throughput-graph.png [スループットグラフの読み取り]

image:https://assets.digitalocean.com/articles/benchmark-digitalocean-volumes/read-iops-graph.png [IOPSグラフの読み取り]

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

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

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

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

Block Size IOPS Bandwidth

4K

~5000 IOPS

~20MB/sec

16K

~5000 IOPS

~80MB/sec

32K

~5000 IOPS

~160MB/sec

64K

~3200 IOPS

~200MB/sec

256K

~800 IOPS

~200MB/sec

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

結論

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

DigitalOcean Block Storageの使用方法の詳細については、https://www.digitalocean.com/community/tutorials/how-to-create-an-encrypted-file-system-on-a-digitaloceanをご覧ください。 -block-storage-volume [DigitalOceanブロックストレージボリュームに暗号化されたファイルシステムを作成する方法]および “https://www.digitalocean.com/community/tutorials/how-to-work-with-digitalocean-block- storage-using-doctl [Doctlを使用してDigitalOceanブロックストレージを操作する方法]。