減り続けるlightmpdのメモリ・・・は勘違いでした。

まずは結論から言うと、前回「64ビット版も32ビット版も、音楽再生を続けているとどんどんメモリを食いつぶしているように見える。」と書いたのは、全くもって私の勘違いでした。

こういう勘違いが起こった原因は、topコマンドでlightmpの挙動を調べていると、メモリを食いつぶしているように見えたからです。
32ビット版のlightmpdではこんな感じになりました。

  • 音楽再生前:Mem: 175428K used, 1846780K free, 0K shrd, 135040288K buff, 135040336K cached
  • 音楽再生10分後:Mem: 262204K used, 1793536K free, 0K shrd, 135040176K buff, 135040224K cached
  • 音楽再生終了から5分後:Mem: 264936K used, 1777272K free, 0K shrd, 135040176K buff, 135040224K cached

これを見てメモリを食いつぶしているし、さらにはその食いつぶしたメモリは解放されていないように見えたのです。
ですから、今日はさらにもっと時間をかけて、連続して音楽再生を続ければどのような挙動を示すのか調べてみました。

  • 音楽再生約1時間後:Mem: 515668K used, 1526540K free, 0K shrd, 135040176K buff, 135040224K cached
  • 音楽再生約2時間後:Mem: 1275900K used, 766308K free, 0K shrd, 135040688K buff, 135040736K cached
  • 音楽再生約4時間後:Mem: 1989432K used, 52776K free, 0K shrd, 135039936K buff, 135039984K cached

ますますやばい感じがします。
freeコマンドでメモリの使用状況を確認してもこんな感じです。

# free
total used free shared buffers
Mem: 2042208 1988812 53396 0 25528
-/+ buffers: 1963284 78924
Swap: 0 0 0

HDは搭載されていないので当然のことながらSwapは「0」です。ですから、これを見た感じでは残された約50Mbのメモリを食いつぶした時点でシステムはダウンだな・・・と思いました。
しかし、それから1時間が経過しても音楽は何の問題もなく再生され続けています。
おかしいなと思って、再びtopコマンドで挙動を調べてみました。

今度は30秒ごとに表示させるようにしました。(to- d 30)

  • Mem: 1990912K used, 51296K free, 0K shrd, 135040704K buff, 135040752K cached
  • Mem: 1987200K used, 55008K free, 0K shrd, 135040704K buff, 135040752K cached
  • Mem: 1988060K used, 54148K free, 0K shrd, 135040704K buff, 135040752K cached

freeのメモリ領域が50Mb程度になると、それ以上は減らないようなのです。当然の事ながら、音楽は何の問題もなく再生され続けています。
と言うことは、どうやらメモリ管理に関する勘違いがあったようなので、改めてGoogle先生に教えてもらいました。

参考になったのはタイトルもそのものズバリ「減り続けるメモリ残量! 果たしてその原因は!?」でした。

freeは「空きメモリ量」ではない

まず、私が勘違いしていた最大のポイントはtopコマンドやfreeコマンドで表示される「free」の数値は「空きメモリ量」ではないということです。
それじゃ、何を表しているのかと言えば「何の用途にも使っていない物理メモリ量」と考えなければいけないようなのです。つまり、「Freeが少ない→空き物理メモリ量が少ない→利用可能な物理メモリ量が足りない」という発想は根本的に間違っているらしいのです。(^^;

では、どうしてそんな間違いを起こしたのかというと、Linuxにおけるメモリ管理の仕方を理解していなかったためです。

lightmpd(LinuxOS)がNASから音楽データを読み込んで再生するときに、CPUはそのデータを直接扱うことは出来ないのでそのデータを一度メモリ上にキャッシュする必要があります。これは、LinuxOSに限らずどのOSにおいても同様です。そして、LinuxOSではこうして読み込んだデータをページキャッシュとして再利用します。
もう少しわかりやすく言いますと、音楽再生のために一度作成したページキャッシュを音楽再生が終わってもLinuxOSはすぐには捨てずに大事にとっておくのです。何故なら、一度作成されたページキャッシュはストレージからロードする必要がないので、次にそれが必要になったときには高速処理が可能になるからです。(と言うことは、一度再生させて全てのデータをページキャッシュとしてメモリに格納させてから再度再生した方が音質的に有利なのか?・・・などという阿呆みたいな事が頭をよぎったりします。^^;)

実は、この仕様を理解していないと私のようなスカタンを引き起こしてしまいます。
つまり、LinuxOSは一度作成したページキャッシュを捨てないので、見かけ上はメモリのフリー領域をどんどん食いつぶしていくように見えるのです。

しかし、ご安心あれ、それはあくまでも見かけ上のことであって、メモリのfree領域がある一定のレベルよりも小さくなってくると(lightmpdの場合は約50Mbでした。)、不要になったページキャッシュが捨てられて不足しはじめたfree領域に充填されるという仕組みをもっているのです。

つまりは、Linuxが利用可能なメモリ領域は、「free」+「いつでも捨てられるページキャッシュの量」で求められるのです。
topコマンドで確認した経過はそのようなLinuxのメモリ管理が滞りなく粛々と実行されていることををこの目で確認しただけなのです。
言葉をかえれば、lightmpdはLinuxの流儀に従って実に安定したメモリ管理が行われていることを証明したわけです。

それじゃ実際に利用可能なメモリ領域ってどれくらいあるの?

Linuxではtopコマンドやfreeコマンドでメモリの「free」値だけを見ていても実際に利用可能なメモリ量がどの程度あるのかは分かりません。
では、どうすれば実際に利用可能なメモリ領域を調べることが出来るのでしょうか?

実は、これも上記のページで紹介されていました。
利用可能なメモリ領域を知りたければ、「/proc/meminfo」を見ればいいようなのです。

# cat /proc/meminfo
MemTotal: 2042208 kB
MemFree: 52652 kB
MemAvailable: 1901408 kB
Buffers: 25528 kB
Cached: 1853284 kB
SwapCached: 0 kB
Active: 30800 kB
Inactive: 1830420 kB
Active(anon): 1328 kB
Inactive(anon): 628 kB
Active(file): 29472 kB
Inactive(file): 1829792 kB
Unevictable: 72280 kB
Mlocked: 72280 kB
HighTotal: 1156528 kB
HighFree: 1964 kB
LowTotal: 885680 kB
LowFree: 50688 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 54720 kB
Mapped: 19144 kB
Shmem: 1156 kB
Slab: 8124 kB
SReclaimable: 5204 kB
SUnreclaim: 2920 kB
KernelStack: 552 kB
PageTables: 176 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 1021104 kB
Committed_AS: 57368 kB
VmallocTotal: 122880 kB
VmallocUsed: 304 kB
VmallocChunk: 122344 kB
DirectMap4k: 16376 kB
DirectMap4M: 892928 kB

「MemFree:52652 kB」はtopコマンドなどで表示される「free」の値と同じです。これは問題なく利用可能な領域です。
次に利用可能な領域がページキャッシュの領域なのですが。この領域には「Active」と「Inactive」の2種類があるそうです。

この内、「Active」はまだストレージとの同期が取れていない「捨てられない」ページで、「Inactive」はアクセスされてからある程度時間がたちストレージとの同期も完了していて、すぐに捨てられるページです。
つまり、ページキャッシュの中でいつでも捨てられる「Inactive」の方がいつでも利用可能なメモリ領域だと言うことになります。

ですから、7時間程度連続して音楽再生を続けても、linghtmpd利用可能なメモリ領域は

「MemFree:52652 kB」+「Inactive:1830420 kB」≒1880Mb

となります。
つまりは、デジファイさんに教えてもらった「htop」コマンドで表示される

Mem[108/1994MB] Uptime: 06:55:53

が利用可能なメモリ領域をほぼ正しく表示しているようです。

ただ、htopコマンドについてGoogle先生で調べてもそんなことを詳しく書いているページはどこにもなかったな・・・( _ _ )……….o