Ubuntu 20.04 上的 ZFS 是否使用大量内存?

Ubuntu 20.04 上的 ZFS 是否使用大量内存?

我安装了 64GB,但 htop 显示使用了 20GB:

在此处输入图片描述

运行后,ps aux | awk '{print $6/1024 " MB\t\t" $11}' | sort -n我运行的最大进程仅占用几百兆字节,而将整个输出加起来仅占用 2.8GB ( ps aux | awk '{print $6/1024}' | paste -s -d+ - | bc)。这差不多就是我昨天升级到 Ubuntu 19.04 时的情况 - 在没有应用程序运行时占用 3 到 4GB。那么为什么 htop 占用了 20GB?

现在确实如此我已经安装了 ZFS(总共 1.5 GB 的 SSD 驱动器,分布在 3 个池中,其中一个池已压缩),我一直在移动一些相当大的文件,以便了解是否存在一些缓存分配。htop 内存栏大部分为绿色,表示“内存正在使用”,而不是缓冲区(蓝色)或缓存(橙色),因此这非常令人担忧。

这个 ZFS 是否占用了大量的 RAM?如果是,它会释放一些来满足其他应用程序的需要吗?

编辑

以下是 smem 的输出:

tbrowne@RyVe:~$ smem -tw
Area                           Used      Cache   Noncache 
firmware/hardware                 0          0          0 
kernel image                      0          0          0 
kernel dynamic memory      20762532     435044   20327488 
userspace memory            2290448     519736    1770712 
free memory                42823220   42823220          0 
----------------------------------------------------------
                           65876200   43778000   22098200 

所以“内核动态内存”才是罪魁祸首。为什么这么多?

编辑 2 --> 似乎与创建大文件有关

我重新启动后,RAM 使用量约为 5GB。即使在 Firefox 中运行一堆标签,运行几个虚拟机,将 RAM 占用高达 20GB,然后关闭所有应用程序,RAM 又会降回 5GB。然后我在 Python 中创建了一个大文件(1.8G 的随机数 CSV),然后将其连接到自身 40x 以生成一个 72GB 的文件:

tbrowne@RyVe:~$ python3
Python 3.8.2 (default, Mar 13 2020, 10:14:16) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> import pandas as pd
>>> pd.DataFrame(np.random.rand(10000, 10000)).to_csv("bigrand.csv")
>>> quit()
tbrowne@RyVe:~$ for i in {1..40}; do cat bigrand.csv >> biggest.csv; done

现在一切都完成了,机器上没有运行任何东西,内核使用了 34G!

在此处输入图片描述

最终编辑(测试答案

这个 python 3 脚本(您需要 pip3 install numpy)每次将分配大约 1GB 直到失败。并且根据下面的答案,只要您运行它,内核内存就会被释放,因此我能够在它被杀死之前分配 64 GB(我的交换空间很少)。换句话说,它确认 ZFS 会在需要时释放内存。

import numpy as np
xx = np.random.rand(10000, 12500)
import sys
sys.getsizeof(xx)
# 1000000112
# that's about 1 GB
ll = []
index = 1
while True:
    print(index)
    ll.append(np.random.rand(10000, 12500))
    index = index + 1

答案1

ZFS 将缓存数据和元数据,因此如果有大量可用内存,ZFS 将使用这些内存。当内存压力开始出现时(例如,加载需要大量页面的程序),缓存的数据将被逐出。如果您有大量可用内存,它将被用作缓存,直到需要它为止。

可以使用该arc_summary工具查看ZFS ARC(自适应替换缓存)使用的资源

答案2

默认情况下,Ubuntu 20.04 上最多有 50% 的系统 RAM 分配给 ZFS。如果其他进程需要,ZFS 会释放 RAM,但这需要一些时间。例如,我因此在 Virtualbox VM 上尝试了一些冻结。

如果你无法升级内存,一个简单的解决方案是限制 ZFS 使用的内存。首先检查当前分配了多少arc_summary

  • 最小大小(硬限制)= 分配的最小值
  • 最大尺寸(高水位)= 最大分配

值以位表示,但你可以将它们转换为http://www.matisse.net/bitcalc/?input_amount=3&input_units=gigabits¬ation=legacy

然后:

  • sudo nano /etc/modprobe.d/zfs.conf(如果文件尚不存在则属于正常现象)
  • 添加options zfs zfs_arc_max=3221225472(例如设置 3 千兆位限制)
  • 保存并退出
  • sudo update-initramfs -u
  • sudo reboot

希望能帮助到你!

答案3

ZFS 的缓存(称为 ARC)被视为应用程序内存(htop 中的绿色条),
而不是缓存(htop 中的黄色条)。

这是一个已知错误https://github.com/openzfs/zfs/issues/10255
由于早期实施过程中遇到一些困难。

尽管它看起来像应用程序内存,但它的行为就像缓存一样
(在内存压力的情况下它就会关闭),
因此无需担心。

答案4

UNIX/Linux 中的所有存储系统都将使用所有可用的空闲内存,只要有 RAM 可用,它们就可以添加缓存。不管是 ZFS、LVM、ext、xfs,这只是内核的设计方式。这会导致很多混乱,具体取决于用于查看可用内存的程序。top 通常会显示所有分配的内存,包括用于 IO 缓存的内存,而 free 则不会。自计算早期以来,它一直让人们感到困惑。

相关内容