
我似乎在核心空間中存在記憶體洩漏,slab 顯示 kmalloc-4096 不斷增長均勻的片段,直到它壟斷系統上的所有 RAM 資源並強制交換。
Free 將大部分記憶體使用情況顯示為緩存,但它拒絕在需要時釋放,甚至在標記為手動清除時也拒絕釋放。我們所看到的一個例子:
$ sudo su -c "free -h && sync && echo 3 > /proc/sys/vm/drop_caches && free -h"
total used free shared buff/cache available
Mem: 15G 4.4G 166M 280M 10G 104M
Swap: 15G 7.8G 8.1G
total used free shared buff/cache available
Mem: 15G 4.4G 186M 280M 10G 115M
Swap: 15G 7.8G 8.1G
我應該分析 kmalloc 以確定洩漏在哪裡嗎?如果是這樣,我該怎麼做呢?
這是在 Intel i5 Skylake 上安裝的 Ubuntu 16.04 原生版本。
$ uname -a
Linux fire 4.4.0-78-generic #99-Ubuntu SMP Thu Apr 27 15:29:09 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
答案1
「同步」不會減少緩衝區/緩存,它只是請求資料進入區塊裝置。快取的重點是資料保留在 RAM 快取中。發送 3 到 drop_caches 也不會等待快取被刪除。你能在「免費」之前加上「睡60分鐘」嗎?這可能會在報告空閒之前留出一些時間來清除記憶體。
留下“watch -n60 cat /proc/meminfo”可能有助於顯示正在增長的內存區域,但緩存和緩衝並不是單獨的洩漏,通過消耗內存,它們實現了其目的並充分利用系統的可用空間資源。
如果一個進程被交換到磁碟,這並不自動意味著發生了不好的事情。如果該進程沒有使用其所有頁面並且處於空閒狀態,則核心正在做正確的事情,那麼在 Web 伺服器上,在 mutt 的副本繼續運行之前,很有可能需要 www 根目錄中的內容例如,用戶登出時的GNU 螢幕。
如果您仍然認為核心透過模組消耗 RAM,您可以使用以下命令進一步檢查:
awk '{ print $2" "$1 }' /proc/modules | sort -n
你用的是ZFS嗎?這對 RAM 來說非常飢餓,但與快取一樣,它會嘗試將磁碟 IO 保留在 RAM 中,以備不時之需。