Linux記憶體佔用過高?非也

前言

今天在我的RPi2上測試GPIO程式,忽然發現機器超卡,重啟之後依然如此。於是我top了一下發現了一個問題就是記憶體爆滿!!可我還啥都沒幹呢這是咋了?於是我呵呵地開始查資料,終於找到了問題所在。

正文

先來在阿里的ECS上top一下感受記憶體爆滿的感覺,終端輸入

top

top

Linux記憶體佔用過高?非也

結合作業系統,計組等課程,以及多年以來windows培養給我的直覺,認為0。96G(1016272K)的總記憶體,使用了0。84G(880960K)的記憶體,使用率高達88%。然而我還啥都沒幹,怎麼會這樣呢?

仔細檢視還會發現後面有一個buffers,Swap後面還有一個Cached Mem。

現在我們用free來觀察下

free -m

Linux記憶體佔用過高?非也

雖然Mem顯示了0。9G左右的used,但是-/+buffers/cache(減去buffers和cache的結果)可以看到,當前程序實際佔用記憶體是0。24G(256348K),而可用空閒(free)記憶體為0。72G(759924K)。

可以這麼理解:在linux的記憶體分配機制中,優先使用物理記憶體,當物理記憶體還有空閒時(還夠用),不會釋放其佔用記憶體,就算佔用記憶體的程式已經被關閉了,該程式所佔用的記憶體用來做快取使用,對於開啟過的程式、或是讀取剛存取過得資料會比較快。

如上面的例子:共1G的記憶體,0。9G被佔用,但是buffer和cached

mem部分作為快取,可以使用命中率的方式提高使用效率,而且這部分快取是根據指令隨時可以釋放的,我們可以認為這部分記憶體沒有實際被使用,也可以認為它是空閒的。

因此檢視目前程序正在實際被使用的記憶體,是used-(buffers+cache),也可以認為如果swap沒有大量使用,mem還是夠用的,只有mem被當前程序實際佔用完(沒有了buffers和cache),才會使用到swap的。

再舉個栗子: 這個是我在RPi一群看到的一個群友發的探針監測截圖

Linux記憶體佔用過高?非也

觀察記憶體使用狀況一欄,發現物理記憶體功925。89M,已用911。74M,Cache化的記憶體是676。46M,Buffers為61。3M,現在用上述公式:

真實的記憶體使用=used-(buffers+cache)

帶入:

真實使用記憶體 = 911。74-676。46-61。3 = 173。98 與第三行的灰條的173。98相符

總結

很高興對於linux的記憶體分配有了新的認識 多謝一群的 粵-打雜小白-503 Service Unavailable 的技術支援

多謝Licess’s Blog的精彩分析