Linuxにメモリの空き容量を確認する「free」というコマンドがあるのですが、その見方について書いておきます。CentOS6での表示を理解していたら、CentOS7およびubuntu18.04では表示のされ方が違いました。
まずCentOS6でfreeコマンドをしたときの表示は以下です。単位はバイトで表示されています。
このサーバーはメモリが1ギガなので「Mem:」行のtotalを見ると、1019792バイトとなっています。
この1ギガバイトの内訳は以下です。
used(837576) + free(182216) = total(1019792)
空きメモリ(free)が182216バイトしかないように見えますが実際に使用できる空きメモリは「-/+ buffers/cache:」行にある855772バイトになります。
この実際に使用できる空きメモリの内訳ですが以下です。
free(182216) + buffers(152184) + cached(521372) = 「-/+ buffers/cache:」のfree(855772)
buffersとcachedってなんだ?ってことですが、buffersもcachedもディスクIOを低減するためのいわゆるバッファとキャッシュです。buffersがブロックデバイス用、cachedが通常ファイルのようです。名前の通りbuffersがバッファでcachedがキャッシュかと思っていたら違うみたいです。ブロックデバイス用のバッファ/キャッシュがbuffersで、通常ファイルのバッファ/キャッシュがcachedみたいです。いずれにせよbuffersとcachedに使われている領域はメモリが足りなくなったらOSが解放して使用できる領域なので、ここに割り当てられている分はfreeとみなして良いことになります。
ちなみにfreeコマンドに「-m」オプションをつけるとメガバイト単位での表示になります。どちらかというとこちらのほうが見やすいです。
上の2つの結果は同じ状態のものなのですが、このサーバーの実際に使える空きメモリは835メガバイトということになります。
なお「Swap:」行にも値がありスワップが発生しているのか?と思うのですが、メモリ全体に対してわずかな値なら気にしなくて良いようです。OSがよっぽど使わない分をディスクに追いやってるっぽいです。
次に、CentOS7およびubuntu18.04でfreeコマンドを実行したときの表示です。
「-/+ buffers/cache:」行がなくなって「Mem:」行だけの表示になりました。このサーバーもメモリは1ギガなので「Mem:」行のtotalを見ると、1014180バイトとなっています。
この1ギガバイトの内訳は以下です。
used(143772) + free(127524) + buff/cache(742884) = total(1014180)
CentOS6のときの考え方からすると、free(127524) + buff/cache(742884) = 870408バイトが空きメモリとして使える容量になるのですが、そうではないみたいです。新しいfreeコマンドにはavailableという列があり、こちらの値を空きメモリ量として見るようです。この場合では689392バイトになります。どういうことかと言うと、バッファとキャッシュは解放して良いメモリではあるものの即時で解放すると困る分もあり(まさに今、使っているものがあるということだろう)、それを考慮して本当に使えるメモリ量をavailableに表示しているようです。正直、availableの算出方法はよくわかりませんでしたが・・。
ただそうやって考えると、CentOS6のときのfreeコマンドで表示された「-/+ buffers/cache:」のfreeの値については、この値より少し少なめに見積もった値が本当のメモリの空き容量なのかな?とも思いました。まぁ、だいたいの量が分かれば良いのだけれど。
今後、availableについてもう少し理解できたら追記します。