Linux
infrastructure
メモリ
インフラ
SRE

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

More than 1 year has passed since last update.

この記事はフロムスクラッチ Advent Calendar 2016の6日目の記事です。


想定読者

 1. サーバーとかを立てたことないアプリ開発者

 2. インフラとは何か?と悶々としている人

 3. インフラリソースを気にしない開発者に違和感を感じている人

 4. 業務でLinuxコマンド叩いているけど、必要最低限しか使っていない人


自己紹介


  • ITベンチャー2年目。25歳。

  • インフラエンジニア。

  • 東工大大学院 化学専攻修了。

  • 新薬合成研究から、プログラミングまで。

  • NHK(日本放送協会)大好き♥

  • 東京生まれ。東京育ち。

  • 最近のマイブームは、ランニング。


とある日・・・

A: 「なんか開発環境のバッチが落ちてるんだけど」

B: 「???なんで?」

A: 「とりま、ログみよ。」

A: 「ん・・・あー・・・」


"Cannot allocate memory"

or

"OutOfMemoryError"


こいつのログを見るたびに

憤怒、悲嘆とも言い切れない気持ちになって

叫びたくなる。

訴えてやる.png


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


1. お金を使う。

豚の貯金箱のアイコン.png

極論言うと、これしかない。

サーバーのスペックを上げるだとか、

まぁとはいえ、そんなことも言ってられないので

うーうー言いながら、考えていろいろ対策を考えました。


メモリ不足の時に、インフラとして「それっぽく」対応できる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言語とかは

まぁある一定難しい分、メモリ管理を適切にできる。(はず)

ちなみに

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

スクリーンショット 2016-12-06 23.23.51.png

(参照)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

これ読も。


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