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

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

在 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 个主要原因:

  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 变体)在 下有一个默认的 ramdisk /dev/shm。应用程序可能会使用此空间,因此您可以使用以下命令轻松检查:

ls -ahl /dev/shm

此外,输出中tmpfs还显示了使用情况,因此从您的帖子中可以明显看出这里使用了 1.8 GB。sharedfree

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

相关内容