今天有人告訴我說linux服務器上的內存快不夠用了,128G的內存,馬上要用光了。我嚇了一跳,這臺服務器上的應用現在負載很小啊,怎麼利用率會很高呢。先用ZABBIX看了下,內存剩餘空間還是很大的,還有117G的空餘啊。然後又登陸到服務器上用再看下:
[oracle@dsj-sjk1 ~]$ top top - 11:41:03 up 415 days, 1:06, 2 users, load average: 0.17, 0.12, 0.28 Tasks: 847 total, 1 running, 846 sleeping, 0 stopped, 0 zombie Cpu(s): 1.0%us, 0.7%sy, 0.0%ni, 98.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 132035736k total, 130251764k used, 1783972k free, 679012k buffers Swap: 16777212k total, 448004k used, 16329208k free, 120309904k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
48069 oracle 20 0 59.1g 299m 213m S 7.2 0.2 23205:25 oracle
5197 root RT 0 756m 88m 57m S 3.6 0.1 36032:42 osysmond.bin
5376 root RT -5 693m 154m 63m S 2.3 0.1 11577:02 ologgerd
5924 grid -2 0 1306m 14m 12m S 1.6 0.0 9131:12 oracle
48055 oracle -2 0 59.0g 17m 15m S 1.6 0.0 9306:15 oracle
6283 root 20 0 968m 28m 12m S 1.3 0.0 5426:41 orarootagent.bi
4563 root 20 0 1914m 55m 14m S 1.0 0.0 3451:22 ohasd.bin
48109 oracle 20 0 59.0g 813m 808m S 1.0 0.6 5880:06 oracle
86867 root 20 0 2273m 240m 10m S 1.0 0.2 458:42.00 ds_am
146406 oracle 20 0 15568 1844 932 R 1.0 0.0 0:00.22 top
5183 root 20 0 1763m 39m 14m S 0.7 0.0 3144:21 orarootagent.bi
看了MEM項中,果然是利用率很高,free的不多了。再用free命令看下:
[oracle@dsj-sjk1 ~]$ free total used free shared buffers cached Mem: 132035736 130258872 1776864 59092256 679016 120313028 -/+ buffers/cache: 9266828 122768908 Swap: 16777212 448004 16329208 [oracle@dsj-sjk1 ~]$
也是如此。於是乎,翻開萬能的度娘,在網上找到了相關資料。在linux的內存分配機制中,優先使用物理內存,當物理內存還有空閒時(還夠用),不會釋放其佔用內存,就算佔用內存的程序已經被關閉了,該程序所佔用的內存用來做緩存使用,對於開啓過的程序、或是讀取剛存取過得數據會比較快。
以下是原文內容:
最近有個月經問題,老有人問爲何開機後,還沒有其他服務,mem就被用完了?是不是內存泄露?是否要重啓服務?只能說不要看現象,要看本質才能找到問題的根源。
往往給出這樣的結果,懷疑內存用了90%:
Mem: 4146788k total, 3825536k used, 321252k free, 213488k buffers
Swap: 2650684k total, 80k used, 2650604k free, 3006404k cached
這樣懷疑很普遍,因爲很多人用慣了Windows。Windows下,可以使用任務管理器查看當前進程對於內存的消耗情況。在我看來,Windows物理內存總是留下一定的空間,就算此時物理內存有空閒時,也會讓某些程序去使用虛擬內存,目的是在Windows下啓動新程序時,直接分配空閒的物理內存,這樣子新程序啓動速度就較快,而Linux則不然。
而在Linux下,使用top命令看到內存佔用情況:
Mem: 4146788k total, 3825536k used, 321252k free, 213488k buffers
Swap: 2650684k total, 80k used, 2650604k free, 3006404k cached
這裏的結果顯示使用了3.8G的used,佔用率達到90%。看看free的結果你還可以對比一下:
$ free -m
total used free shared buffers cached
Mem: 4049 3784 265 0 208 2939
-/+ buffers/cache: 636 3413
Swap: 2588 0 2588
雖然MEM顯示了3.7G左右的used,但是(-/+ buffers/cache)減去buffers和cache的結果可以看到,當前進程實際佔用內存是636M,而可用空閒(free)內存爲3.4G。
可以這麼理解:在linux的內存分配機制中,優先使用物理內存,當物理內存還有空閒時(還夠用),不會釋放其佔用內存,就算佔用內存的程序已經被關閉了,該程序所佔用的內存用來做緩存使用,對於開啓過的程序、或是讀取剛存取過得數據會比較快。
如上面的例子:使用了4G的內存,3.7G被佔用,但是buuffer和cached部分作爲緩存,可以使用命中率的方式提高使用效率,而且這部分緩存是根據指令隨時可以釋放的,我們可以認爲這部分內存沒有實際被使用,也可以認爲它是空閒的。
因此查看目前進程正在實際被使用的內存,是used-(buffers+cache),也可以認爲如果swap沒有大量使用,mem還是夠用的,只有mem被當前進程實際佔用完(沒有了buffers和cache),纔會使用到swap的。
根據上述內容,自己算了下,確實剩餘內存不少。原來zabbix還是可信的,造成我緊張的原因還是由於自己對linux內存分配機制不清楚導致的。
補充:
1.total=used(cache/buffer)+free(buffer/cache)(整個內存都可以用來做緩存)
total=used+free
2.used=真實使用的+buffer+cache
3.真實used約等於used(cache/buffer)