Ephemeral Diskを贅沢にswapに使ってみる

記事タイトルとURLをコピーする
こんにちは、サーバーワークスの三井です。 いよいよ寒くなってきて、物理サーバの温もりが恋しくなってきましたね。ラックの裏側は温かいし、常に一定のトーンで鳴り響くファン音があらゆる雑念を振り払ってくれるので集中するには持ってこいの場所ですよね(遠い目
 
さて閑話休題、今日はEC2インスタンスのEphemeral Diskをswap領域として贅沢に使う方法について簡単に紹介します。

Ephemeral Diskとは

今更かもしれませんが確認です。 Ephemeral Diskとは、インスタンスストア(Instance Store)とも呼ばれる、揮発性のストレージです。揮発性なので、EC2インスタンスを停止するとデータは削除されます。 EC2インスタンスが稼働する物理ホストのディスクアレイの一部を切り出してアタッチするので、ネットワーク経由でアタッチされるEBSと比較して速度が早いという特徴があります。そして何より、利用料金はEC2インスタンスのランニングコストの中に含まれているため、実質追加コストなしで使うことが出来るので非常にお得なのです。 上記の特性より、Ephemeral Diskはworkerなどで処理用の一時データを置いておく場所として最適です。消えちゃ困るデータの長期保存はEBSですね。 このEphemeral Diskにもいろいろあり、インスタンスタイプごとに割り当て可能な容量が決まっています。インスタンスタイプごとの容量は以下のドキュメントにまとめられています。 http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/InstanceStorage.html 呼び方もいくつかあり、どうやらインスタンスストアと呼ぶのが公式なようですが、個人的には何となくEphemeral Diskと呼ぶほうがしっくりくるのでこのまま続けます。  

使ってますか?

意外とその存在に気づかないこともあるようです。インスタンスタイプにもよるようですが、デフォルトでEphemeral Diskがアタッチされていなかったり、アタッチされていても利用可能な本数が全てアタッチされていない場合もあります。なので、インスタンス作成時にきちんと追加してあげるのが確実です。 Add_Ephemeral_Disk Management Consoleのインスタンス作成ウィザードで追加したところです。(やっぱりInstance Storeが正式名称だったか…!)
ここではm3.xlargeインスタンスを例に用いています。m3.xlargeは40GBのSSDボリュームを2つ、Ephemeral Diskとして使えるので、それぞれ /dev/sdb と /dev/sdc としてマッピングするようにしました。 AWS CLIを使ってインスタンスを立ち上げる場合には、以下のような感じになります。
 

aws ec2 run-instances 
--count 1 
--image-id ami-4985b048 
--key-name mitchang-ikemen 
--security-group-ids "sg-xxxxxxxx" 
--instance-type m3.xlarge 
--subnet-id subnet-xxxxxxxx 
--block-device-mappings '[{"DeviceName":"/dev/xvda","Ebs":{"VolumeSize":40,"DeleteOnTermination":true,"VolumeType": "gp2"}},{"DeviceName":"/dev/sdb","VirtualName":"ephemeral0"},{"DeviceName":"/dev/sdc","VirtualName":"ephemeral1"}]'


JSON部分をバラすと以下のようになっています。
 

[
     {
          "DeviceName" : "/dev/xvda",
          "Ebs": {
               "VolumeSize":40,
               "DeleteOnTermination":true,
               "VolumeType": "gp2"
          }
     },
     {
          "DeviceName":"/dev/sdb",
          "VirtualName":"ephemeral0"
     },
     {
          "DeviceName":"/dev/sdc",
          "VirtualName":"ephemeral1"
     }
]

これはつまり、/dev/xvda(ルートボリューム)は40GBのEBSを利用し、2つのEphemeral Diskをそれぞれ/dev/sdbと/dev/sdcとしてアタッチするよ、ということになります。  

どんぐらい早いのかな

上記で立ち上げたAmazon Linuxインスタンスでその違いを試してみました。 まずは /dev/xvda (EBS) から。

# hdparm -ft /dev/xvda

/dev/xvda:
 Timing buffered disk reads: 272 MB in  3.02 seconds =  90.10 MB/sec

さすがgp2、まずまずのパフォーマンスが出ています。 では、次に /dev/sdb (Ephemeral Disk) のパフォーマンスを見てみることにします。

# hdparm -ft /dev/sdb

/dev/sdb:
 Timing buffered disk reads: 2610 MB in  3.00 seconds = 869.56 MB/sec

おお!めっちゃ早い!gp2も早いけどそれより10倍ぐらい早いぞ!  

swapにする

さて、とりあえずアタッチしてみたはいいものの、特に使い道もないのでこの爆速ディスクをswapとして贅沢に使ってみることにします。(とはいえ実際、ローカルストレージにあまり重きを置かないようなサーバ構成であれば、swapに使うぐらいしか使い道がないのかなとも思います。)以下、Amazon Linuxでの作業です。

  1. /etc/fstabの設定を変えます。

    デフォルトでは、以下のように /media/ephemeral0 としてマウントされています。

    /dev/sdb     /media/ephemeral0     auto     defaults,nofail,comment=cloudconfig     0     2
    

    これを、こう

    /dev/sdb none swap sw,nobootwait,comment=cloudconfig 0 2
    
  2. /etc/cloud/cloud.cfgの設定も変えておきます。
    mounts:
     - [ ephemeral0, /media/ephemeral0 ]
     - [ swap, none, swap, sw, "0", "0" ]

    これを、こう

    mounts:
     - [ ephemeral0, swap, swap ,"defaults", "0", "0"]
    
  3. swapの有効化

    これで準備はできましたが、swapの設定がされていないので、mkswapしてswaponする必要があります。 rc.localにでも書いておきましょう。

    cat >> /etc/rc.local << 'EOF';
    mkswap /dev/sdb
    swapon -a
    EOF
    
  4. 再起動して確認 確認してみます。

    cat /proc/swaps
    Filename                      Type        Size  Used  Priority
    /dev/sdb                               partition     39313404    0     -1
    

40GBという無駄な贅沢なswap領域ができました。

 

これでOOM Killerに怯える必要はなくなった!!

とはいえ、せっかく40GBもあるのに全部swapにするのは正直もったいない気がします。 一部だけswapとして使い、残りを/tmpあたりにマウントして、一時データの保存領域として使うのがやっぱり限りなく正解っぽいですね。

お気づきでしょうか

m3.xlargeですので、Ephemeral Diskとして2つのSSDボリュームが使えるはず。 それらを/dev/sdbと/dev/sdcにそれぞれマッピングしたにも関わらず、使ったのは/dev/sdbのみ…

俺たちの冒険はまだ始まったばかりだ!

というわけで、今回陽の目を浴びることが出来なかった/dev/sdcもいつか有効に使ってあげないといけませんね。それはまた次回にします。