经过繁重的 I/O 负载并在 Zram 中存储许多内容后,已用空间接近“空闲”空间总量

经过繁重的 I/O 负载并在 Zram 中存储许多内容后,已用空间接近“空闲”空间总量

我不认为这是Linux的磁盘缓存。在 中htop,内存条是绿色的(不是缓存的橙色),我删除了 zram 中存储的文件。似乎没有进程使用大量内存。

负载正在编译软件,其构建文件存储在 zram(PORTAGE_TMPDIR位于/var/tmp/portageGentoo 中)中,交换文件也存储在 zram 中。它配置了 zram 写回,以便在内存不足时写入磁盘。

我编译了2个软件,1个软件之后,似乎仍然使用了1/2左右的内存,zramctl说使用的总数据接近0G,并且没有进程使用太多内存,Linux磁盘缓存不是问题。

当 kswapd 的 CPU 利用率持续达到 100% 时,内核 OOM 终止了消耗过多 RAM 的进程。此后,仍然有 RAM 被使用,但我找不到任何正在使用它的东西。如果是磁盘缓存,内核会将空间移交给内存消耗进程。但事实并非如此,所以这很可能不是磁盘缓存问题,我重新启动了计算机,第二个软件编译很快,没有出现问题!

有谁知道可能会发生什么情况,有什么方法可以进一步确定是什么在使用内存?

答案1

简短回答:挂载文件系统或打开在 Zram 设备上创建的交换区时,请使用丢弃挂载选项。

扩展:当挂载文件系统discard用作挂载选项时,您可以使用-o和 分隔的挂载选项来设置挂载选项,,并且选项之间没有空格。大多数Linux文件系统应该都支持,我在Btrfs上使用它。在交换时,-d使用时使用swapon.除此之外,您还可以定期fstrim在安装文件系统的目录上运行,但从我在输出中看到的情况来看,zramctl这是不必要的,并且discard安装选项已经足够好了。

编辑:fstrim事实上,经过一些进一步的测试,我认为定期在 Zram 安装座上运行是个好主意。使用 Zram 中的构建目录编译 Firefox 后,内存使用量约为 1.1GB。并不像没有discard安装选项那么糟糕,但还有改进的空间。在 Zram 挂载上运行fstrim(只需要几秒钟即可运行)导致 RAM 使用量达到 400MB,这是正常的。我可能会把它放在一个 cron 作业中或在 portage 编译之后。

解释:当文件被删除时,Zram 不会删除内存上的压缩页面,因为它不会收到该空间不再用于数据的通知。删除文件时,丢弃选项执行丢弃。如果您使用丢弃安装选项,Zram 将收到有关未使用页面的通知,并相应地调整大小。

相关内容