はじめに

最近下記の記事を書いたのですが、

ELB暖気運転(Pre-Warming)申請についていくつかサポートに問い合わせた

直後にEBSにもPre-Warmingという概念があるのを思い出したので、
勢いそのままについでに書くことにします。

WS000001.JPG

http://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-amazon-elastic-block-store-ebs/45

EBSのPre-Warmingとは

ざっくりいうと下記のとおりです。

  • スナップショットからリストアした直後のEBSボリュームはIOがめっちゃ遅い
  • どのくらい遅いかというと5%~50%分遅い
  • 事前にコマンドによって読み込み処理を行えば上記を回避できる
  • その処理をPre-Warmingという

付け加えると下記のとおり。

  • 以前はスナップショットからのリストアだけでなく、新規ボリューム作成時にも遅かった
  • 今は遅くないのでPre-Warmingはむしろやらないほうがいい
  • Pre-Warmingというのは昔の呼称で、今は初期化(initialization)という

きちんとドキュメントで読みたい

下記をご参照ください。
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-initialize.html

新しい EBS ボリュームは、利用可能になるとすぐに最大のパフォーマンスを発揮し、初期化 (以前は事前ウォーミングと呼ばれました) を必要としません。ただし、スナップショットから復元されたボリュームのストレージブロックは、アクセスするためには事前に初期化する必要があります (Amazon S3 からプルダウンしてボリュームに書き込みます)。この準備処理には時間がかかるため、初めて各ブロックにアクセスした場合に、I/O 操作のレイテンシーの著しい増加が発生する可能性があります。ほとんどのアプリケーションにとって、ボリュームの存続期間全体でこのコストを割り当てることは、許容範囲内です。一度データにアクセスされると、パフォーマンスは元に戻ります。

ボリュームを使用する前に、そのボリュームのすべてのブロックを対象に、読み取りを実行することで、本番環境におけるパフォーマンスの低下を回避することができます。このプロセスを「初期化」と呼びます。スナップショットから作成された新しいボリュームの場合は、ボリュームを使用する前に、データのあるすべてのブロックを読み取る必要があります。

Pre-Warmingに使うコマンド

Linuxの場合

dd

$ sudo dd if=/dev/xvdf of=/dev/null bs=1M

fio

$ sudo fio --filename=/dev/xvdf --rw=randread --bs=128k --iodepth=32 --ioengine=libaio --direct=1 --name=volume-initialize

Windowsの場合

dd

C:>dd if=\.PHYSICALDRIVEn of=/dev/null bs=1M --progress --size
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/ebs-initialize.html

あと少し気になった箇所

スナップショットから復元された io1 ボリュームを初期化している間は、ボリュームのパフォーマンスが想定レベルの 50% を下回る場合があります。このため、ボリュームの [I/O Performance] ステータスチェックでは warning 状態が表示されます。これは想定の動作です。初期化中の io1 ボリュームの warning 状態は無視してかまいません。

io1とはつまり「プロビジョンド IOPS SSD」のことですが、
なぜio1だけ言及されているのか、他のボリュームタイプでは無視してはいけないのか?
というのが気になります。(詳細未確認)

おわりに

スナップショットとしてS3に保管されているデータ。
それらはリストア後のEBSボリュームの、
各ストレージブロックに初回アクセスが合った際に「プルダウン」されてくる。

「プルダウン」には少し時間がかかるので、
ボリューム全体まとめて一気に「プルダウン」しておきましょう、
というのがPre-Warming(初期化)のイメージでしょうか。

「初期化」と聞くと「え、全部データ消えちゃうの」と一瞬思いましたが、
そんなことはありませんでした。

dd ユーティリティまたは fio ユーティリティを使用します。ボリュームのすべてのデータが保持されます。

あと、あまり積極的にはやらなくてもいいよ、
というニュアンスを感じました。

実運用時は事前ウォーミングが不可能なケースもあるため、運用要件から判断して実行可能であれば取り込む程度でOK

とはいえ本番環境に適用する前には、
こういった注意事項があると頭の片隅に置いておいたほうが良さそうですね。

以上です。

TOP