この記事はフロムスクラッチ Advent Calendar 2016の6日目の記事です。
想定読者
1. サーバーとかを立てたことないアプリ開発者
2. インフラとは何か?と悶々としている人
3. インフラリソースを気にしない開発者に違和感を感じている人
4. 業務でLinuxコマンド叩いているけど、必要最低限しか使っていない人
自己紹介
- ITベンチャー2年目。25歳。
- インフラエンジニア。
- 東工大大学院 化学専攻修了。
- 新薬合成研究から、プログラミングまで。
- NHK(日本放送協会)大好き♥
- 東京生まれ。東京育ち。
- 最近のマイブームは、ランニング。
とある日・・・
A: 「なんか開発環境のバッチが落ちてるんだけど」
B: 「???なんで?」
A: 「とりま、ログみよ。」
A: 「ん・・・あー・・・」
"Cannot allocate memory"
or
"OutOfMemoryError"
こいつのログを見るたびに
憤怒、悲嘆とも言い切れない気持ちになって
叫びたくなる。
メモリ不足の時に、インフラとして対応できる1つのこと
###1. お金を使う。
極論言うと、これしかない。
サーバーのスペックを上げるだとか、
まぁとはいえ、そんなことも言ってられないので
うーうー言いながら、考えていろいろ対策を考えました。
メモリ不足の時に、インフラとして「それっぽく」対応できる3つのこと
1. メモリを使っているプロセスの特定
# メモリの使用量の確認
free -m
# 実行プロセスのメモリ(RSS)の低い順番に並べる(一番下に一番メモリ使ってる奴が来る)
ps aux --sort rss
とりあえず、これ叩いておけば、だいたいわかる。
/proc/meminfo、とか、vmstatとか色々あるけど
そんなのはまぁドヤ顔するためのただの豆知識。
2. 開発側にpushする
原因となるプロセス特定できた。
あとは、そのプロセスを管理・開発した(してる)人に
直してもらうようにpushするのみ。
3. 無駄なメモリを解放する
# rootユーザーへ変更する
sudo su -
# ダーティー・キャッシュをディスクに落とし込む
sync
# ページキャッシュおよびディレクトリエントリー(dentry) とinode のクリア
echo 3 > /proc/sys/vm/drop_caches
(参照) http://www.shift-the-oracle.com/linux/utility/flush-buffer-cache.html
最終手段。
無駄なメモリがあれば、それを解放する。
最近流行りのRubyを始めとしたLL言語(lightweight language)は、
簡単に書ける一方でその分メモリ管理が非常に雑なところがある。
開発者がちゃんと意識して書かないと、すぐメモリリークetc...により
サーバーのメモリを解放しないで、気づいたら80 ~ 90%になっている。
cf.)
LL言語と言っても
「lightweight programming language」のC言語とかは
まぁある一定難しい分、メモリ管理を適切にできる。(はず)
ちなみに
実際に上記コマンドを実行すると、実行するとこんな感じ。
まとめ
正直
「3. 無駄なメモリを解放する」みたいな
「子供(開発者)が出したおもちゃを親(インフラ)片付ける」
ような対応は、どうせすぐまたメモリが溢れてくるし、本質的ではない。
それを開発した(してる)人
もしくは
やったこと無い人、今後引き継ぐ人が対応してこそ初めて
プロダクト的にも、組織的にも価値があるのではないでしょうか。
まぁたぶん開発者も
このクラウドファーストの時代が進んでいくと
- ログのローテートや退避
- 監視
- セキュリティ
- インフラリソース
など、インフラを意識した開発をしないと
これからの開発者は淘汰されていくんじゃないかな。
「DevOps」「SRE」然り、「OpsDev」とかいう言葉も出てきたし。
Site Reliability Engineering: How Google Runs Production Systems
https://www.amazon.co.jp/Site-Reliability-Engineering-Production-Systems/dp/149192912X
これ読も。
私も「インフラ」だけではなく、頑張らねば(`・ω・´)キリッ