記一次內存占用過高的分析


客戶給我反應,他們的PostgreSQL服務器的內存占用率高達99%,只有一點內存可以分配了,讓我幫忙看看。

 

沒有問題,雖然剩余內存很少了,只有500M左右,但是其中cache的內存很多,應用可分配的內存依然有50G,不用擔心。

 

 

首先看看/proc/meminfo內容:

xxxx:~ # cat /proc/meminfo 

MemTotal:       65786904 kB    所有可用RAM大小 (即物理內存減去一些預留位和內核的二進制代碼大小)
MemFree:          515316 kB    LowFree與HighFree的總和,被系統留着未使用的內存  這里503M左右
MemAvailable:   47765096 kB   應用可分配內存 echo "47765096/1024/1024"|bc = 45G
Buffers:            2180 kB   用來給文件做緩沖大小
Cached:         46499916 kB   被高速緩沖存儲器(cache memory)用的內存的大小(等於 diskcache minus SwapCache )
SwapCached:          456 kB   被高速緩沖存儲器(cache memory)用的交換空間的大小,已經被交換出來的內存,但仍然被存放在swapfile中。用來在需 要的時候很快的被替換而不需要再次打開I/O端口。
Active:         35838856 kB   在活躍使用中的緩沖或高速緩沖存儲器頁面文件的大小,除非非常必要否則不會被移作他用.
Inactive:       22011252 kB   在不經常使用中的緩沖或高速緩沖存儲器頁面文件的大小,可能被用於其他途徑.

 

 再看看free:

xxxx:~ # free
             total       	used       		free       shared      buffers    cached
Mem:      65786904     65271240            515664     4846584       2180   52825696
-/+ buffers/cache:     12443364   	       53343540
Swap:     16779260      5324                16773936


第1行 Mem: total:表示物理內存總量。
used:表示總計分配給緩存(包含buffers 與cache )使用的數量,但其中可能部分緩存並未實際使用。
free:未被分配的內存。
shared:共享內存,一般系統不會用到,這里也不討論。
buffers:系統分配但未被使用的buffers 數量。
cached:系統分配但未被使用的cache 數量。buffer 與cache 的區別見后面。 total = used + free 第2行 -/+ buffers/cached: used:也就是第一行中的used - buffers-cached 也是實際使用的內存總量。 
free:未被使用的buffers 與cache 和未被分配的內存之和,這就是系統當前實際可用內存。 free 2= buffers1 + cached1 + free1 //free2為第二行、buffers1等為第一行
echo "(515664+2180+52825696)"|bc=53343540=50G

 

 

 

與上面/proc/meminfo中的MemAvailable:   47765096 kB有差別,大概5G左右的誤差,該依照誰的?

 

再看看top:

xxxx:~ # top 

top - 14:31:15 up 31 days, 20:12,  3 users,  load average: 0.43, 0.42, 0.38
Tasks: 927 total,   1 running, 925 sleeping,   0 stopped,   1 zombie
%Cpu(s):  1.5 us,  1.1 sy,  0.0 ni, 97.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:  65786904 total, 65275224 used,   511680 free,     2180 buffers
KiB Swap: 16779260 total,     5324 used, 16773936 free. 52825968 cached Mem

  

從top中也可以看到大概,雖然free很少,但是cached Mem很大,swap很少,從側面反應內存還是夠的,所以,free和top的結果比較一致,memento中的則有一點差距,我們來看看MemAvailable的解釋:

MemAvailable = MemFree+Active(file)+Inactive(file)-(watermark+min(watermark,Active(file)+Inactive(file)/2)) 

file占用的內存是可以釋放的,但是釋放的過多,會導致swap發生,減去部分內存的目的是避免swap 

檢查/proc/meminfo文件,通過將“MemFree + Buffers+ Cached”相加,預估有多少可用內存,這在十年前是可以,但是在今天肯定是不對的。
因為緩存包含存不能釋放的page cache,例如shared memory segments、tmpfs、ramfs,它不包括可收回的slab內存,比如在大多數空閑的系統中,存在很多文件時,它會占用大量的系統內存。在系統沒有發生交換時,預估需要多少available內存才可以啟動新的應用程序。這個available字段不同於cache或free字段所提供的數據,它除了要考慮到page cache,還要考慮到當項目在使用時,並不是所有的slabs都能被回收這一情況。

 

所以,更加靠譜的是MEMAvailable,客戶的內存完全不用擔心,Linux的內存有個特點,只要內存夠,就不會將部分內存交換出來,這樣來提高系統性能。就算內存滿了,也會優先往swap中交換。當然數據庫應用應當盡量減少內存的交換,尤其是頻繁的swap交換時,應當考慮優化服務器或者數據庫參數,提高系統性能。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM