Amazon Elastic File System

EFSでスループット拡張用に設置したダミーファイルがライフサイクル管理により勝手にIA移動されちゃう問題

はじめに

SRE課の栩野です。

以前、EFSでバースト性能を確保したままスループットを拡張する方法について紹介させていただきました。

Amazon EFS でバースト性能を確保したままスループットを拡張する

しかし今回、拡張していたはずのスループットが急に拡張できなくなり、更にはバーストクレジットが枯渇し、EFSがまともに機能しなくなる事象が発生してしまいました。

本記事ではその原因と対策について迫ります!

発生した事象

EFSをライフサイクル管理が有効な状態(デフォルト)で作成し、バースト性能を確保したままスループット性能を拡張するため、数十GB分のダミーファイルを設置して利用していました。

▼設定内容

ところがある日、EFSのバーストクレジットが枯渇したとのアラートを検知し、実際に確認すると拡張したはずのスループットが拡張できておらず、バーストクレジットを消費し使い切った状態になっていました。

原因

スループットを拡張するためのダミーファイルは、必ずスタンダードストレージに設置しておく必要があり、今回ライフサイクル管理の設定により、30日間以上アクセスされなかったダミーファイルがIAストレージへと自動移動されたことで、スループットが拡張できない状態になってしまっていました。

※以下EFSの用語説明

  • スタンダードストレージ
    高い耐久性と可用性を必要とする頻繁にアクセスされるデータ向けのストレージ (デフォルト)

  • IAストレージ (スタンダード-低頻度アクセス)
    アクセス頻度の低いデータ向けストレージ
    スタンダードストレージよりもGBあたりの費用が安い

  • ライフサイクル管理機能
    スタンダードストレージからIAストレージへのファイル移動を自動化します。
    EFSを作成する際にデフォルトで有効となっており、前回のアクセスから30日間アクセスのないファイルはIAへと自動で移動されます。

解決手法

解決方法は2通りあります。

1. ライフサイクル管理機能を無効化する
1つめの方法は、そもそもライフサイクル管理機能を無効化してしまう方法です。

そうすることで、そもそもIAストレージに移行されるような問題自体発生しません。

ただしデメリットとして、全てのファイルがスタンダードストレージに留まるため、余分に費用が発生してしまいます。

2. 定期的にダミーファイルにアクセスする
2つめの方法は、定期的にダミーファイルにアクセスすることで、ライフサイクルでIAストレージに自動移行されないようにします。

もし既にIAストレージに移行されたファイルがあり、スタンダードストレージに戻す必要がある場合はライフサイクル管理により、自動でスタンダードストレージへと戻す設定を有効にしておく必要があります。

そうすることで、ダミーファイルにcatやhead等のコマンドで定期的にアクセスするだけで、スタンダードストレージにファイルを留めることが可能です。

ここで一つ問題が発生しました。

ダミーファイルに対してcatやheadコマンドを実行しても、アクセスとしてカウントされず、IAに移行されてしまう問題が発生しました。

原因として、NFSクライアント側メモリ上のキャッシュからファイル内容が読み取られている可能性があり、この場合はEFSへのアクセスとしてカウントされない状態となります。

そのため、確実にダミーファイルにアクセスする場合は以下3つのコマンドの実行が必要になります。

sync
echo 3 | sudo tee /proc/sys/vm/drop_caches
head -c 1 /ダミーファイルがあるディレクリまでのパス/*

コマンドについての説明...

  • sync
    キャッシュに存在する未処理のデータをディスクに書き込むコマンド

  • echo 3 | sudo tee /proc/sys/vm/drop_caches
    メモリ上のページキャッシュ、dentry、inode を解放するコマンド

  • head -c 1 /ダミーファイルがあるディレクリまでのパス/*
    ダミーファイルの先頭にだけアクセスするコマンド
    (cat等で開いた場合、サイズによっては時間がかかるので、head -c 1 を利用することで短縮できる)

上記のコマンドで、確実にEFS上のファイルにアクセスすることができます。

自動でダミーファイルにアクセスさせる

ダミーファイルへのアクセスを手動で行うのはしんどいので自動化します。
EFSをマウントしているEC2に以下のスクリプトを作成しCronに仕込みます。

#!/bin/sh

sudo sync
echo 3 | sudo tee /proc/sys/vm/drop_caches > /dev/null 2>&1
head -c 1 /var/www/vhosts/dummy/* > /dev/null 2>&1

※headでアクセスするファイルパスは、各自のダミーファイルディレクトリのパスに変更する

作成したスクリプトに実行権限を付与し、crontabに仕込みます。
スクリプトのパスやファイル名、実行時間は各自の環境に合わせ任意の設定でお願いします。

今回は月に2回(1日,15日)、AM02:00 にダミーファイルへ自動アクセスするよう設定しています。

# chmod 755 accessDummy.sh
# crontab -e
0 2 1,15 * * cd /root/script; ./accessDummy.sh

以上の設定により、タイトルの問題は無事解消することができました。

さいごに

EFSのバーストやスループット周りは難解な部分が多いですが、少しでも本記事が参考になれば嬉しいです。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA