在 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中,内存的使用情况主要可以归结为两个因素:
- 进程/线程的使用情况
- 文件系统的使用
对于这个问题,原作者无法统计所有进程/线程使用的内存。因此,剩余内存很可能被内核用于文件系统操作。
可能的原因
我目前知道文件系统内存使用过多的 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 变体)在 下有一个默认的 ramdisk /dev/shm
。应用程序可能会使用此空间,因此您可以使用以下命令轻松检查:
ls -ahl /dev/shm
此外,输出中tmpfs
还显示了使用情况,因此从您的帖子中可以明显看出这里使用了 1.8 GB。shared
free
3. FS 压缩
用这个命令检查磁盘 IO:(iostat
是包的一部分sysstat
)
iostat
将此与有关为相关磁盘启用文件系统压缩的知识相结合。对于 ZFS,运行此命令以获取所有 Zpools 和数据集的压缩属性:
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