
在 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 個主要原因:
- ZFS ARC 快取(或類似的檔案系統緩存,註冊為「正常」記憶體使用)
- Ramdisk(
tmpfs
和類似的檔案系統) - 本機檔案系統壓縮,結合過多的磁碟 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