インフラ運用・保守を行ってゆく上で重要な負荷についての話題です。 同様メモリの使い方について考えてみます。今回は負荷というよりもメモリリソースの効率的な利用方法について触れていると言えるかもしれません。
メモリは高速でこの能力を 100% 活かせればアプリケーションの性能向上に繋がることは言うまでもありません。ただ、100% ギリギリまで使い続けてるようなシステム等見たことがありません。
だれでもスワップを恐れてこのような使い方は避けるでしょう。それでも常に 20% 程度しか利用されていないというのではあまりに勿体ない状況です。このような場合、どのようにこれらのメモリリソースを利用できるのでしょうか。
tmpfs を使ってみる
tmpfs をご存知でしょうか?tmpfs は ram を拡張したようなものです。ram は通常のファイルやディレクトリ(フォルダ)を扱っているようで実はメモリを使っているというようなファイルシステムで次のような特徴を持ちます。
- メモリを利用する為、高速
- 物理メモリが許す限り利用可能
- OS(電源)が停止すると中の情報(ファイル等)は全て消去される
このような特徴を持っているため、消去されても構わない小さなファイル(キャッシュ等)を何度も読み書きするようなケースで非常に役立ちます。ただ、「物理メモリが許す限り利用可能」と記載したようにメモリが足りなくなるとメモリ確保に失敗してしまいます。
この点を解消したのが tmpfs です。tmpfs ではメモリが足りなくなった場合、自分からスワップします。
その為、スワップしてしまうと速度は落ちますが、利用可能容量が飛躍的に大きくなります。この tmpfs は主に Linux に限定されますが、CentOS(Redhat) 等では /dev/shm 等にマウントされ、例えば以下のような簡素なコマンドでももう使っていることになります。
$ echo "aaaa" > /dev/shm/test.txt
$ cat /dev/shm/test.txt
aaaa
最近はオンメモリデータベースが流行りだしてきていますが、例えば sqlite 等を /dev/shm 配下で使うだけでもオンメモリデータベースとなってしまいます(ただ、OS を再起動すると消えるのでこれだけでは何もできないでしょう)。要件に応じてこれら tmpfs を使ってみるのもいいかもしれません。