EBS Standard Volumeの性能特性

最近@namikawaさんと@con_mameさんがEBSの性能測定をされていて、少し気になったので追試をしました。

測定環境です。

  • ap-northeast-1c
  • m1.small (Spot Instance)
  • Amazon Linux AMI 2013.03.1
  • EBS Standard Volume 16GB
  • ext4 (relatime、nobarrier)

測定用スクリプトです。EBS Standard Volumeに対してランダムI/Oの測定のみを行います。

#/bin/bash

for SIZE in 1g 2g 4g 8g; do
    for IODEPTH in 1 2 4 8; do
        rstat/rstat_start.sh localhost

        fio -direct=1 -ioengine=libaio -readwrite=randread -blocksize=4k \
            -filename=/fio/fio.dat -loops=1000 -runtime=180 \
            -size=${SIZE} -iodepth=${IODEPTH} -name=fio_s${SIZE}_q${IODEPTH} | tee -a fio_s${SIZE}.log

        rstat/rstat_stop.sh
        sleep 30
    done

    mkdir fio_${SIZE}
    mv *.log *.csv fio_${SIZE}
done

ポイントは、測定時間を16秒から180秒に伸ばしたところです。ファイルサイズが8GBのときの結果を時系列のグラフにすると、以下のようになります。

数秒から数十秒経過したところで、性能がストンと落ちています。この挙動はドキュメントに記載されているとおりのものなのですが、なかなかダイナミックな制御が行われているようです。

スタンダードボリュームは、I/O 要件が中程度またはバースト性であるアプリケーション用のストレージに適しています。スタンダードボリュームの平均パフォーマンスは約 100 IOPS であり、ベストエフォートで数百 IOPS のバーストも可能です。スタンダードボリュームは、ブートボリュームとしての使用にも適しており、バースト可能であることからインスタンス起動時間が短縮されます。

ファイルサイズが8GB、非同期I/OのQueue Depthが8の場合はバースト時に14,000 IOPS、それが終わると300〜600 IOPSとなりました。Standard Volumeがコンスタントに1,000 IOPS以上出せてしまうとProvisioned IOPSの意味がなくなってしまいますから、1,000 IOPS未満に落ち込むことがあるという点は致し方ないのかもしれません。振れ幅が大きいのでデータベースの格納先として使用すると突然の性能低下に悩まされそうですね。ルートデバイスには適していると思います。

バースト制御のアルゴリズムがどうなっているのかはよく分からないのですが、今回の測定条件ではfioコマンドの終了後に30秒ほど休ませると再びバーストするようになりました。また読み取りはアクセス範囲が狭い場合にバーストが継続する傾向があり、書き込みについてはアクセス範囲が広くても180秒間ずっとバーストしたままとなっていました。他のパターンのグラフをいくつか載せておきます。


ファイルサイズが1GBの場合は、バーストが継続しています。


書き込みの場合は、ファイルサイズが8GBでもバーストが継続しています。

もっと詳しく調べたいところですが、お財布がどんどん軽くなるのでこのあたりにしておきます。個人的には、データベースの格納先としてはProvisioned IOPSをおすすめします。