正確理解Linux內存佔用過高的問題及可用內存計算方法

權威問題解答參見

https://www.linuxatemyram.com/

最近生產的監控一直瘋狂告警,內存佔用過高,有的甚至達到90%++,但是業務並未受到任何影響,於是有了以下的分析:

linux 使用free 和 top 命令查看結果如下:

[root@xxx~]# top
top - 14:11:09 up 202 days,  2:06,  2 users,  load average: 0.00, 0.02, 0.00
Tasks: 210 total,   1 running, 209 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.5%us,  0.5%sy,  0.0%ni, 98.0%id,  0.0%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:  41145296k total, 40169340k used,   975956k free,   326308k buffers
Swap: 33554428k total,        0k used, 33554428k free,  8929612k cached

由上圖可知,當前的內存佔用比例達到97%,系統是不是內存不夠呢?其實,這只是Linux的爲了提高文件讀取的性能的內存使用機制罷了。不同於Windows,windows程序執行完後,會馬上釋放掉內存,把Memory降下來。而對於Linux,如果你的服務器內存還有足夠多的空間的話,Linux會把程序運行的數據緩存起來(高速緩存),加入到Cache中,所以內存會不斷增加,直到一定的限度爲止.當超過這限度後,內核必須將髒頁寫回磁盤,以便釋放內存。也就是說,當空閒內存低於一個特定的閾值時,內核的守護進程就會進行內存塊回收。

root@xxx~]# free -m
             total       used       free     shared    buffers     cached
Mem:         40180      39225        955          1        318       8718
-/+ buffers/cache:      30187       9993
Swap:        32767          0      32767

以上各參數的解釋:
total:總物理內存的大小。
used:已使用內存。
free:可用內存。
Shared:多個進程共享的內存總額。
Buffers/cached:磁盤緩存的大小。
第二行:memory使用情況。
第三行(-/+ buffers/cache)。
第四行交換分區使用情況。

區別:第二行(mem)的used/free與第三行(-/+ buffers/cache) used/free的區別。 

這兩個的區別在於使用的角度來看,第一行是從OS的角度來看,因爲對於OS,buffers/cached 都是屬於被使用,所以他的可用內存是955M,已用內存是39225M,其中包括,內核(OS)使用+Application使用的+buffers+cached.

第三行所指的是從應用程序角度來看,對於應用程序來說,buffers/cached 是等於可用的,因爲buffer/cached是爲了提高文件讀取的性能,當應用程序需在用到內存的時候,buffer/cached會很快地被回收。所以從應用程序的角度來說,

可用內存=(系統free memory)+buffers+cached或者第三行中的buffers/cached  free

可用內存的計算爲:

第一種方法:955+318+8718=9991M

第二種方法:直接取uffers/cached  free 9993M

所以,我們通過free命令查看機器空閒內存時,會發現free的值很小。這主要是因爲,在linux中有這麼一種思想,內存不用白不用,因此它儘可能的cache和buffer一些數據,提高文件讀取的性能,以方便下次使用。但實際上這些內存,如果需要的話,也是可以立刻拿來使用的。

另外只有mem被當前進程實際佔用完(沒有了buffers和cache),纔會使用到swap的,所以我們看到swap還有大量未使用,內存還是夠用的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章