客戶給我反應,他們的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交換時,應當考慮優化服務器或者數據庫參數,提高系統性能。