為什麼我的系統在使用一個小時後會使用更多 RAM?
我正在使用帶有 XFCE DE 和 XFWM4 WM 的 Arch Linux (5.1.8-arch1-1-ARCH)。事情非常優雅,RAM 和 CPU 使用率很低。
啟動後,當 DE 完全載入後,我看到 665 MiB 的 RAM 使用量。
但是在打開 Atom、Code、Firefox、Chromium 等應用程序後,或者在 GIMP、Blender 等中工作後,RAM 使用量會增加,這是顯而易見的。但是在關閉所有應用程序並且只剩下一個 gnome-system-monitor 之後,我可以看到 RAM 使用量為 1.2 - 1.4 GiB。/proc/meminfo 與 gnome-system-monitor 一致,但 htop 始終給出不同的結果。
更糟糕的是,當我稍後打開一個佔用 RAM 的應用程序時,它再次消耗了 1.4 GiB 之上所需的記憶體。情況總是如此。/tmp/ 目錄中沒有儲存可能加起來達到兆字節的文件。
此外,如果我尋找使用那麼多 RAM 的程序(從開始時的 700 MiB 到關閉瀏覽器後的 1.4 GiB !!),我什麼也看不到。事實上,即使在執行 Arch ARM 的樹莓派上,我也遇到了同樣的問題。
紅寶石程式碼:
#!/usr/bin/ruby -w STDOUT.sync = true loop do IO.readlines(File.join(%w(/ proc meminfo))).then { |x| [x[0], x[2]] }.map { |x| x.split[1].to_i }.reduce(:-) .tap { |x| print "\e[2K\rRAM Usage:".ljust(20), "#{x / 1024.0} MiB".ljust(24), "#{(x / 1000.0)} MB" } Kernel.sleep(0.1) end
該
cat /proc/meminfo
命令具有以下輸出:MemTotal: 3851796 kB MemFree: 1135680 kB MemAvailable: 2055708 kB Buffers: 1048 kB Cached: 1463960 kB SwapCached: 284 kB Active: 1622148 kB Inactive: 660952 kB Active(anon): 923580 kB Inactive(anon): 269360 kB Active(file): 698568 kB Inactive(file): 391592 kB Unevictable: 107012 kB Mlocked: 32 kB SwapTotal: 3978216 kB SwapFree: 3966696 kB Dirty: 280 kB Writeback: 0 kB AnonPages: 924844 kB Mapped: 563732 kB Shmem: 374848 kB KReclaimable: 74972 kB Slab: 130016 kB SReclaimable: 74972 kB SUnreclaim: 55044 kB KernelStack: 8000 kB PageTables: 14700 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 5904112 kB Committed_AS: 3320548 kB VmallocTotal: 34359738367 kB VmallocUsed: 0 kB VmallocChunk: 0 kB Percpu: 1456 kB HardwareCorrupted: 0 kB AnonHugePages: 0 kB ShmemHugePages: 0 kB ShmemPmdMapped: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 0 kB DirectMap4k: 226736 kB DirectMap2M: 3778560 kB DirectMap1G: 0 kB
首先,您注意到 htop 從不同意。我對此知之甚少。
其次,您可以看到 xfdesktop 使用 44 MiB,而其他一些程序使用了一些記憶體,核心使用了 ~150 MiB,除此之外,為什麼我看到正在使用 1.5 GiB RAM?這真的會影響系統的性能嗎?
未使用的 RAM 是浪費的 RAM。Linux 核心具有高級記憶體管理功能,並試圖避免給系統瓶頸、硬碟驅動器/SSD 帶來負擔。它嘗試在記憶體中記憶體文件。
記憶體管理系統以復雜的方式工作,更好的性能是目標。
您可以通過檢查來查看它在做什麼
/proc/meminfo
。
cat /proc/meminfo
您可以使用“drop_caches”回收此記憶體記憶體。但是,請注意文件說“不建議在測試或調試環境之外使用”,僅僅是因為“重新創建刪除的對象可能會花費大量的 I/O 和 CPU” :-)。
僅清除 PageCache:
# sync; echo 1 > /proc/sys/vm/drop_caches
清除dentries和inode:
# sync; echo 2 > /proc/sys/vm/drop_caches
清除 PageCache、dentries 和 inode:
# sync; echo 3 > /proc/sys/vm/drop_caches
請注意,這
sync
將刷新文件系統緩衝區以確保已寫入所有數據。從核心文件:
記憶體頁面
物理記憶體是易失性的,將數據放入記憶體的常見情況是從文件中讀取數據。每當讀取文件時,都會將數據放入頁面記憶體中,以避免在後續讀取時進行昂貴的磁碟訪問。類似地,當寫入文件時,數據被放置在頁面記憶體中並最終進入備份儲存設備。寫入的頁面被標記為臟頁,當 Linux 決定將它們用於其他目的時,它會確保將設備上的文件內容與更新的數據同步。
回收
在整個系統生命週期中,物理頁面可用於儲存不同類型的數據。它可以是核心內部資料結構、設備驅動程序使用的可 DMA 緩衝區、從文件系統讀取的數據、使用者空間程序分配的記憶體等。
根據頁面使用情況,Linux 記憶體管理對它的處理方式不同。可以隨時釋放的頁面,或者因為它們記憶體了其他地方可用的數據,例如,在硬碟上,或者因為它們可以再次交換到硬碟上,被稱為可回收的。最值得注意的可回收頁麵類別是頁面記憶體和匿名記憶體。
在大多數情況下,保存內部核心數據並用作 DMA 緩衝區的頁面不能被重新利用,並且在被使用者釋放之前它們會保持固定狀態。這樣的頁面被稱為不可回收的。但是,在某些情況下,甚至可以回收核心資料結構佔用的頁面。例如,文件系統元數據的記憶體記憶體可以從儲存設備中重新讀取,因此當系統處於記憶體壓力下時,可以將它們從主記憶體中丟棄。
釋放可回收的物理記憶體頁面並重新利用它們的過程稱為(驚喜!)回收。Linux 可以非同步或同步回收頁面,具體取決於系統的狀態。當系統未載入時,大部分記憶體是空閒的,分配請求將立即從空閒頁面供應中得到滿足。隨著負載的增加,空閒頁面的數量下降,當達到某個門檻值(高水位線)時,分配請求將喚醒 kswapd 守護程序。它將非同步掃描記憶體頁面,如果它們包含的數據在其他地方可用,則將它們釋放,或者驅逐到備份儲存設備(還記得那些臟頁嗎?)。隨著記憶體使用量進一步增加並達到另一個門檻值 - min watermark - 分配將觸發直接回收。在這種情況下,分配會停止,直到回收足夠的記憶體頁面來滿足請求。
記憶體洩漏
現在,一些程序可能會出現“記憶體洩漏”,即它們“忘記”釋放不再使用的記憶體。如果您讓程序執行一段時間,您可以看到這一點,它的記憶體使用量不斷增加,當您關閉它時,記憶體永遠不會被釋放。現在,程序員當然會盡量避免記憶體洩漏,但程序可以有一些。回收此記憶體的方法是重新啟動。