權威問題解答參見
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還有大量未使用,內存還是夠用的。