無法追蹤到服務或應用程式的高記憶體使用率

無法追蹤到服務或應用程式的高記憶體使用率

在 Ubuntu 22.04 中,我遇到了一個奇怪的記憶體問題。我似乎無法找出為什麼我的記憶體使用率這麼高。當我啟動筆記型電腦時,記憶體使用情況符合預期,但隨著時間的推移,有些東西似乎耗盡了我的內存,但係統似乎不知道它的用途。

筆記型電腦運行幾天並整晚處於睡眠狀態後free -m報告以下內容:

               total        used        free      shared  buff/cache   available
Mem:           14812        7329        2683        1810        4799        5348
Swap:           2047         416        1631

所有申請均已關閉,並且根據這個工具所有應用程式使用的累計記憶體為 1.7 GiB。那麼最後的~5.5GiB (7.2-1.7) 是用來做什麼的呢?

我錯過了什麼嗎?

在此輸入影像描述

答案1

編寫此答案是為了嘗試解決「未說明的」記憶體使用的可能原因,這可能超出了OP所經歷的範圍。

背景

在 Linux 中,記憶體使用量很大程度上可歸因於兩個因素:

  • 進程/執行緒的使用
  • 檔案系統的使用

在這個問題的情況下,OP無法解釋進程/線程使用的所有記憶體。因此,剩餘記憶體很可能被核心用於檔案系統操作。

可能的原因

我目前知道檔案系統記憶體使用過多的 3 個主要原因:

  1. ZFS ARC 快取(或類似的檔案系統緩存,註冊為「正常」記憶體使用)
  2. Ramdisk(tmpfs和類似的檔案系統)
  3. 本機檔案系統壓縮,結合過多的磁碟 I/O(因此壓縮/重新壓縮會導致記憶體消耗恆定)

為了解決這 3 種情況的問題,我建議採取以下措施:

1.ZFS ARC緩存

執行以下命令以取得有關 ZFS ARC 快取的詳細資訊:

arcstat -a 

報告的統計資料size將顯示為正常使用的記憶體。

從您的帖子中可以明顯看出,這裡使用了 0.5 GB。

2.虛擬磁碟

運行此命令以獲取有關任何當前tmpfs檔案系統 ramdisk 的資訊:

df -hl -t"tmpfs"

報告的任何數量used都將顯示為正常使用的記憶體。

Ubuntu(以及許多其他 Linux 變體)在/dev/shm.應用程式可能會使用此空間,因此您可以輕鬆檢查:

ls -ahl /dev/shm

此外,tmpfs使用情況也顯示shared在輸出中free,因此從您的貼文中可以明顯看出,此處使用了 1.8 GB。

3.FS壓縮

使用以下命令檢查磁碟 IO:(iostat是套件的一部分sysstat

iostat

將其與相關磁碟啟用的檔案系統壓縮的知識結合。對於 ZFS,執行以下命令以取得所有 Zpool 和資料集的壓縮屬性:

zfs get compression

如果磁碟 IO 較高,並且啟用了本機壓縮,則可能會導致報告為正常使用記憶體的記憶體過多。

答案2

您是否在檔案系統上使用壓縮或寫入時複製檔案系統(如 BTRFS 或 ZFS)?

記憶體使用過多可能是由於核心嘗試即時(重新)壓縮檔案或在大檔案經常更改時複製/版本控制每次寫入。

如果您有大型檔案(例如虛擬機器的映像),其中檔案經常更改且大小為千兆位元組而不是兆字節,那麼記憶體壓力會變得特別明顯。

您可以考慮在檔案系統/子磁碟區/磁碟區層級或單一檔案層級停用壓縮和/或停用 COW(寫入時複製)

BTRFS:
它支援使用以下命令刪除特定檔案的壓縮 btrfs 指令

 property set <file> compression none

刪除特定資料夾的 COW(寫入時複製):

chattr -R +C /directory/of/your/vm_images/

ZFS:
我不相信您可以刪除單個文件的壓縮。在磁碟區上停用壓縮只會影響將來的寫入,因此您需要單獨複製每個檔案才能停用壓縮。

zfs set compression=off name_of_zfs_vol

相關內容