Performance

為什麼我的系統在使用一個小時後會使用更多 RAM?

  • February 23, 2021

我正在使用帶有 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 的樹莓派上,我也遇到了同樣的問題。

這是截圖1 這是截圖2

紅寶石程式碼:

#!/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 - 分配將觸發直接回收。在這種情況下,分配會停止,直到回收足夠的記憶體頁面來滿足請求。

記憶體洩漏

現在,一些程序可能會出現“記憶體洩漏”,即它們“忘記”釋放不再使用的記憶體。如果您讓程序執行一段時間,您可以看到這一點,它的記憶體使用量不斷增加,當您關閉它時,記憶體永遠不會被釋放。現在,程序員當然會盡量避免記憶體洩漏,但程序可以有一些。回收此記憶體的方法是重新啟動。

引用自:https://unix.stackexchange.com/questions/524846