[Linux] メモリ不足の時に、インフラとして対応できる1つのこと


この記事はフロムスクラッチ 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言語とかは
まぁある一定難しい分、メモリ管理を適切にできる。(はず)

ちなみに
実際に上記コマンドを実行すると、実行するとこんな感じ。


(参照)http://grafana.org/

まとめ

正直
「3. 無駄なメモリを解放する」みたいな
「子供(開発者)が出したおもちゃを親(インフラ)片付ける」
ような対応は、どうせすぐまたメモリが溢れてくるし、本質的ではない。

それを開発した(してる)人
もしくは
やったこと無い人、今後引き継ぐ人が対応してこそ初めて
プロダクト的にも、組織的にも価値があるのではないでしょうか。

まぁたぶん開発者も
このクラウドファーストの時代が進んでいくと
- ログのローテートや退避
- 監視
- セキュリティ
- インフラリソース
など、インフラを意識した開発をしないと
これからの開発者は淘汰されていくんじゃないかな。
「DevOps」「SRE」然り、「OpsDev」とかいう言葉も出てきたし。

Site Reliability Engineering: How Google Runs Production Systems
https://www.amazon.co.jp/Site-Reliability-Engineering-Production-Systems/dp/149192912X
これ読も。

私も「インフラ」だけではなく、頑張らねば(`・ω・´)キリッ