私の少ない予算だとVirtual Machineのメモリが不足気味なので、メモリ消費量の少ないLinuxディストリビューションを探してみた。
AzureでB1sサイズのVirtual Machineを作成して、起動後しばらくしてからfreeコマンドでメモリ消費量を比較した。条件を揃えるためDockerデーモンとMicrosoft Azure Linux Agentは起動させている。
availableの差
このavailableのサイズが、いわゆる空きメモリのサイズと考えてよいだろう。
man free(1) - Linux manual pageによると、availableとは新しいアプリケーションの起動時にスワップせずに使えるメモリ量とのこと。
available Estimation of how much memory is available for starting new applications, without swapping. Unlike the data provided by the cache or free fields, this field takes into account page cache and also that not all reclaimable memory slabs will be reclaimed due to items being in use (MemAvailable in /proc/meminfo, avail‐ able on kernels 3.14, emulated on kernels 2.6.27+, otherwise the same as free)
manの記述を信じるならGentooは省メモリということになる。一方CoreOSはavailableが極端に少ないバックグラウンドで何か管理用のソフトが動いているのだろうか。
CoreOSについて
CoreOSはメモリ消費が少ないという情報があったので期待していたが、usedメモリは240MBということでいたって平凡である。availableも少ない。 この記事だとメモリ消費量は160M程度だと書かれているのだけれど。 qiita.com
totalの差
ちょっと興味深いのが、同じサイズのインスタンスなのにtotalメモリに差があること。
man freeによると、totalは/proc/meminfo
のMemTotal
とSwapTotal
を参照している。
total Total installed memory (MemTotal and SwapTotal in /proc/meminfo)
さらにMemTotal
とは、man proc(5) - Linux manual pageによると、物理メモリから予約分とカーネルを差し引いたものだそうだ。
MemTotal %lu Total usable RAM (i.e., physical RAM minus a few reserved bits and the kernel binary code).
Gentoo Linuxはなぜかtotalメモリが多い。使用したGentoo Linuxは、特にカーネルをチューニングしているわけではなく、Hyper-Vとdockerのオプションを追加した程度である。
Gentoo LiveDVDのカーネルコンフィグは結構オプションが削減されているようで、vmlinuzのサイズはgentoo-sourcesベースが6.6MBで、LiveDVDベースが4.3MBだった。LiveDVDはオプションてんこ盛りになっているのと思ってたので意外。
ちなみに最初、Hyper-Vの動的メモリ割り当ての影響があるのかもと思ったが、Hyper-Vの動的メモリはusedで調整されるようだ。(メモリ割り当てが削減されるとusedが増える)
結論
意外とGentooが省メモリだった。
CoreOSは事前情報に反してメモリ消費が多くて、メモリが512MBのインスタンスだと起動すらできなかった。。。大きいインスタンス上での、複数のdockerイメージの運用を想定しているのだろうか。