在 Ubuntu 22.04 中,我遇到了一个奇怪的内存问题。我似乎无法找出为什么我的内存使用率这么高。当我启动时,我的笔记本电脑内存使用情况符合预期,但随着时间的推移,有些东西似乎耗尽了我的内存,但系统似乎不知道它的用途。
笔记本电脑运行几天并整晚处于睡眠状态后free -m报告以下内容:
total used free shared buff/cache available
Mem: 14812 7329 2683 1810 4799 5348
Swap: 2047 416 1631
Run Code Online (Sandbox Code Playgroud)
所有应用程序已关闭,根据该工具,所有应用程序累计使用的内存为1.7 GiB。那么最后的~5.5GiB (7.2-1.7) 是用来做什么的呢?
我错过了什么吗?
编写此答案是为了尝试解决“未说明的”内存使用的可能原因,这可能超出了OP所经历的范围。
在 Linux 中,内存使用很大程度上可归因于两个因素:
在这个问题的情况下,OP无法解释进程/线程使用的所有内存。因此,剩余内存很可能被内核用于文件系统操作。
我目前知道文件系统内存使用过多的 3 个主要原因:
tmpfs和类似的文件系统)为了解决这 3 种情况的问题,我建议采取以下措施:
运行以下命令以获取有关 ZFS ARC 缓存的详细信息:
arcstat -a
Run Code Online (Sandbox Code Playgroud)
报告的统计数据size将显示为正常使用的内存。
从您的帖子中可以明显看出,这里使用了 0.5 GB。
运行以下命令以获取有关任何当前tmpfs文件系统 ramdisk 的信息:
df -hl -t"tmpfs"
Run Code Online (Sandbox Code Playgroud)
报告的任何数量都used将显示为正常使用的内存。
Ubuntu(以及许多其他 Linux 变体)在/dev/shm. 应用程序可能会使用此空间,因此您可以轻松地检查:
ls -ahl /dev/shm
Run Code Online (Sandbox Code Playgroud)
此外,tmpfs使用情况也显示shared在free输出中,因此从您的帖子中可以明显看出,此处使用了 1.8 GB。
使用以下命令检查磁盘 IO:(iostat是包的一部分sysstat)
iostat
Run Code Online (Sandbox Code Playgroud)
将其与相关磁盘启用的文件系统压缩的知识相结合。对于 ZFS,运行以下命令以获取所有 Zpool 和数据集的压缩属性:
zfs get compression
Run Code Online (Sandbox Code Playgroud)
如果磁盘 IO 较高,并且启用了本机压缩,则可能会导致报告为正常使用内存的内存过多。
您是否在文件系统上使用压缩或写时复制文件系统(如 BTRFS 或 ZFS)?
内存使用过多可能是由于内核尝试实时(重新)压缩文件或在大文件经常更改时复制/版本控制每次写入。
如果您有大型文件(例如虚拟机的映像),其中文件经常更改且大小为千兆字节而不是兆字节,那么内存压力会变得尤其明显。
您可以考虑在文件系统/子卷/卷级别或单个文件级别禁用压缩和/或禁用 COW(写入时复制)
BTRFS:它支持使用btrfs 命令
删除特定文件的压缩 :
property set <file> compression none
Run Code Online (Sandbox Code Playgroud)
删除特定文件夹的 COW(写入时复制):
chattr -R +C /directory/of/your/vm_images/
Run Code Online (Sandbox Code Playgroud)
ZFS:
我不相信你可以删除单个文件的压缩。在卷上禁用压缩只会影响将来的写入,因此您需要单独复制每个文件才能禁用压缩。
zfs set compression=off name_of_zfs_vol
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3669 次 |
| 最近记录: |