s3fsとは
S3バケットをEC2からマウントすることができる便利ソフト。
長い間、AWSにはNFSマウントが可能なストレージサービスが登場する気配がなく、複数のEC2から同じファイルを参照したいけど各サーバでファイルを共有したい(ローカルにファイル置きたくない)ようなケースで、s3fsを利用してS3バケットをDISKとみなしてマウントすることで解決していたのです。
s3fsには、動作が非常に不安定という欠点がありました。
勝手にマウントが外れるとか、メモリ使用量が異常に多いとか、大事な本番サービスにそんなソフト普通は使いたくありませんが、他に代替手段がないので、使うときだけautofsでマウントするといったTipsを併用して使うというのが慣例でした。
私自身もマウント外れ問題への対処のため、定期的にumount→mountする&プロセス生死確認→死んでたら前述の処理を実行するお手製バッチを動かしていました。
しかし先日ついにElastic File Systemが発表されました。年内には正式利用開始がアナウンスされているので、今後はこちらの利用が増えていくでしょう。
EFSの普及に伴いs3fsの利用が減っていくことは想像に難くなく、これから書くことが誰かの役に立つ可能性は非常に低いです…。
とはいえ、仮にEFSの利用料金がS3のそれと大きく乖離した場合、s3fsをこれまで通り使いたい方もいるかもしれませんので、s3fsがこれまで抱えていた問題とその解決についてまとめたいと思います。
s3fsのメモリリーク問題
放っておくとメモリがどんどん減っていく
私が管理していたサーバでは、HTTPSでマウントするオプションを使っていましたが、s3fsを使用している間メモリ使用量が毎日右肩上がりになっていき、だいたい1週間で空きメモリを食いつぶしてs3fsがOOM-Killerに殺されるという現象が起きていました。
Nov 26 07:15:09 ip-***-***-***-*** kernel: [1540952.633902] Killed process 3434 (s3fs) total-vm:622496kB, anon-rss:247320kB, file-rss:0kB
始めはzabbixから空きメモリ低下のアラートを受けて再マウントしていましたが、面倒になってメモリがどうであろうと日次でマウントを外して再度マウントするバッチを回しておくというバッドノウハウで乗り切っていました…
issueは立っているけど解決出来てなかった
根本的に解決する方法を探したところ、Google Codeで同様のケースを扱ったissueを発見!
Issue 314:Out of Memory process killed
SSL経由で利用していると、HEAD(lsするなど)リクエストが行われるたびにメモリ消費量が増えていくバグが存在している模様です。修正が試みられますが、libcurlとlibnssを組み合わせて使用した場合に起きるバグっぽいから、ライブラリが直らないとs3fsもどうにもならないぜ。とのこと。
(前略)
So, I think that this means leaking memory at libnss+libcurl.
But it is not enough solution for this problem, the cause is deep in lib curl and libnss.
I think it is hard to fix this issue and takes a lot of times.
https://code.google.com/p/s3fs/issues/detail?id=314#c18
ここでissueは途切れており…というのが筆者の認識だったのですが、今日久々に見に来たら約5ヶ月後に解決策が提示されていました!
7.21.4より新しいバージョンの(最新の)libcurlをwith NSSでビルドすれば良いようです。
On my case, the libcurl version is under 7.21.4, this version has a bug about memory leaking.
(For example, cent-os uses yum repository, it does not have latest curl(libcurl) version.)
The bug is only a case of built with NSS library.
I tried to update latest libcurl with NSS, and test with s3fs.
After that, it worked good for me, it seems memory leaking does not increase.
https://code.google.com/p/s3fs/issues/detail?id=314#c19
まだ試してないです
解消方法をがんばって調べたりしたので、再現環境を作って試してみたいんですが一旦ここまで!