はじめに
EC2インスタンスでインスタンスストアのボリュームを使う際は、最初に初期化をしなければなりません。
このことを知らず、初期化をしないで使い続けた結果、サーバに負荷をかけてしまったことと、初期化によって解決したことの記録です。
起きたこと
・Webアプリの画面に、2時間ほど接続できなくなった
・Webアプリのバッチが、通常2分ほどで終わるものが30分かかった
・これらのことが不定期に起こった
調査
sarコマンドで調べたところ、iowaitとロードアベレージの負荷が高いことはわかりました。
しかし、根本的な原因がわからないため、AWSサポートへ質問したところ、
・インスタンスストアがボトルネックになった可能性がある
・インスタンスストアが高いディスクパフォーマンスを必要とする場合には一度初期化が必要だが、実施しているか
との回答をいただきました。
インスタンスストアとは
インスタンスに刺さっているストレージです。高速に読み書きができる一方、サーバを再起動するとデータが消えてしまうという特徴があります。
本件では一時ファイルの置き場として利用しています。
詳しくは公式ドキュメントを参照してください。
AWSドキュメント - インスタンスストア
初期化とは
インスタンスストアボリュームへの最初の書き込みは、速度が遅いという特性があります。
先にすべての場所に書き込みを行うことで、パフォーマンスを上げることを「初期化」と呼ぶようです。
数年前までは、EBSも同じように「プレウォーミング」と呼ばれる初期化を必要としていましたが、現在は不要になっています。
対応
インスタンスストアボリュームの初期化を実行しました。
方法は、 dd
コマンドでインスタンスストアボリュームに書き込みをします。一度書き込むことで、そのあとの読み書きがスムーズになるという寸法です。
!!!注意!!!
インスタンスを作成した直後に行うこと。
既に運用が始まっている場合は、バッチやCGIに影響を与えないよう、一時ファイル置き場の参照先を変更するなどの対策が必要です。
$ dd if=/dev/zero of=/dev/sdb bs=1M
$ dd if=/dev/zero of=/dev/sdc bs=1M
$ dd if=/dev/zero of=/dev/sdd bs=1M
$ dd if=/dev/zero of=/dev/sde bs=1M
結果
不定期に起きていたサーバの高負荷が起きなくなくなりました。
注意点
インスタンスストアボリュームの初期化は、インスタンスを停止/起動(再起動)したときに都度行う必要があります。
起動スクリプトを組んでおくとよいでしょう。
参考
AWSドキュメント - インスタンスストアボリュームのディスクパフォーマンスの最適化
2019/5/24 追記
先日、Amazon Linux の c3.xlarge から c3.2xlarge へスケールアップし、
またインスタンスストアの初期化をしたので時間を計測してみました。
c3.2xlargeのインスタンスストレージは 80GB が2つ。
2つのボリュームに対し初期化を実行。
計測結果は、片方は45分、もう片方は35分でした。
$ dd if=/dev/zero of=/dev/sdb bs=1M # 約45分で終了
$ dd if=/dev/zero of=/dev/sdc bs=1M # 約35分で終了
80GB のインスタンスストアボリュームを初期化するのに、40分くらいかかると想定しておくと良さそうです。