无法追踪到服务或应用程序的高内存使用率

dho*_*ard 8 gnome ram 22.04

在 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) 是用来做什么的呢?

我错过了什么吗?

在此输入图像描述

Art*_*ild 9

编写此答案是为了尝试解决“未说明的”内存使用的可能原因,这可能超出了OP所经历的范围。

背景

在 Linux 中,内存使用很大程度上可归因于两个因素:

  • 进程/线程的使用
  • 文件系统的使用

在这个问题的情况下,OP无法解释进程/线程使用的所有内存。因此,剩余内存很可能被内核用于文件系统操作。

可能的原因

我目前知道文件系统内存使用过多的 3 个主要原因:

  1. ZFS ARC 缓存(或类似的文件系统缓存,注册为“正常”内存使用)
  2. Ramdisk(tmpfs和类似的文件系统)
  3. 本机文件系统压缩,结合过多的磁盘 I/O(因此压缩/重新压缩会导致内存消耗恒定)

为了解决这 3 种情况的问题,我建议采取以下措施:

1.ZFS ARC缓存

运行以下命令以获取有关 ZFS ARC 缓存的详细信息:

arcstat -a 
Run Code Online (Sandbox Code Playgroud)

报告的统计数据size将显示为正常使用的内存。

从您的帖子中可以明显看出,这里使用了 0.5 GB。

2.虚拟磁盘

运行以下命令以获取有关任何当前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使用情况也显示sharedfree输出中,因此从您的帖子中可以明显看出,此处使用了 1.8 GB。

3.FS压缩

使用以下命令检查磁盘 IO:(iostat是包的一部分sysstat

iostat
Run Code Online (Sandbox Code Playgroud)

将其与相关磁盘启用的文件系统压缩的知识相结合。对于 ZFS,运行以下命令以获取所有 Zpool 和数据集的压缩属性:

zfs get compression
Run Code Online (Sandbox Code Playgroud)

如果磁盘 IO 较高,并且启用了本机压缩,则可能会导致报告为正常使用内存的内存过多。


tom*_*chi 6

您是否在文件系统上使用压缩或写时复制文件系统(如 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)