當記憶體需求增加時,Linux 不會釋放大型磁碟記憶體
在 2.6.31-302 x86-64 核心上執行 Ubuntu。總體問題是我在“記憶體”類別中的記憶體不斷增加,即使我們的應用程序需要它也不會被釋放或使用。
所以這就是我從“免費”命令中得到的。乍一看,這一切都沒有什麼不尋常的。
# free total used free shared buffers cached Mem: 7358492 5750320 1608172 0 7848 1443820 -/+ buffers/cache: 4298652 3059840 Swap: 0 0 0
有人會說的第一件事是“別擔心,Linux 會自動管理該記憶體。” 是的,我知道記憶體管理器應該如何工作;問題是它沒有做正確的事情。此處的“記憶體”1.4 GB 似乎已保留且無法使用。
我對 Linux 的了解告訴我 3 GB 是“免費的”;但係統的行為另有說明。當 1.6 GB 的實際空閒記憶體在高峰使用期間用完時,一旦需要更多記憶體(並且第一列中的“空閒”接近 0),就會呼叫 OOM 殺手,程序被終止,問題開始出現即使-/+ 緩衝區/記憶體行中的“空閒”仍然有大約 1.4 GB 的“空閒”。
我已經調整了關鍵程序的 oom_adj 值,這樣它就不會使系統崩潰,但即便如此,重要的程序也會被殺死,我們永遠不想達到這一點。尤其是在理論上,如果 1.4GB 僅驅逐磁碟記憶體,它仍然是“免費的”。
有誰知道這裡發生了什麼?網際網路上充斥著關於 Linux ‘free’ 命令和“為什麼我沒有任何可用記憶體”的愚蠢問題,因此我找不到關於這個問題的任何資訊。
我腦海中閃現的第一件事是交換已關閉。我們有一個堅定不移的系統管理員;如果他們得到支持,我願意解釋。這會導致問題嗎?
執行後免費
echo 3 > /proc/sys/vm/drop_caches
:# free total used free shared buffers cached Mem: 7358492 5731688 1626804 0 524 1406000 -/+ buffers/cache: 4325164 3033328 Swap: 0 0 0
如您所見,實際上釋放了少量記憶體,但似乎“卡住”了大約 1.4 GB。另一個問題是這個值似乎隨著時間的推移而上升。在另一台伺服器上 2.0 GB 卡住了。
我真的很喜歡這段記憶……任何幫助將不勝感激。
cat /proc/meminfo
如果它值得的話:# cat /proc/meminfo MemTotal: 7358492 kB MemFree: 1472180 kB Buffers: 5328 kB Cached: 1435456 kB SwapCached: 0 kB Active: 5524644 kB Inactive: 41380 kB Active(anon): 5492108 kB Inactive(anon): 0 kB Active(file): 32536 kB Inactive(file): 41380 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 320 kB Writeback: 0 kB AnonPages: 4125252 kB Mapped: 42536 kB Slab: 29432 kB SReclaimable: 13872 kB SUnreclaim: 15560 kB PageTables: 0 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 3679244 kB Committed_AS: 7223012 kB VmallocTotal: 34359738367 kB VmallocUsed: 7696 kB VmallocChunk: 34359729675 kB DirectMap4k: 7340032 kB DirectMap2M: 0 kB
我已經找到了我自己問題的答案 - 感謝 womble 的幫助(如果您願意,請送出答案)。
lsof -s
顯示正在使用的文件句柄,結果顯示有幾 GB 的 mmap 日誌文件佔用了記憶體。實現 logrotate 應該可以完全解決這個問題,讓我可以利用更多的記憶體。
我還將重新啟用交換,這樣我們將來就不會遇到 OOM 殺手的問題。謝謝。
顯然,postgres’
shared_buffers
可以出現在 中cached
,但並不容易被丟棄……儘管有可用記憶體(記憶體),但請參閱 OOM