Linux

當記憶體需求增加時,Linux 不會釋放大型磁碟記憶體

  • June 15, 2017

在 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

引用自:https://serverfault.com/questions/288319