ZFS进程占用大量CPU资源


写入时复制事务模型/快照与克隆/轻量化文件系统创建

ZFS 是一个拥有逻辑卷管理功能的文件系统,最早源自于 OracleSolaris 操作系统开发的文件系统。ZFS 具有可扩展性,并且包括大量保护措施防止数据损坏,支持高存储容量、高效数据压缩、集成文件系统、卷管理、快照和写时复制、连续完整性检查与自动修复、RAID-Z、原生 NFSv4 ACL 等功能,并且能被精确配置。ZFS 有两个主要实现,分别来自 OracleOpenZFS,它们之间极度相似,这使得 ZFS 在类 Unix 系统中广泛可用。

ZFS进程占用大量CPU资源


今天早上发现,管理的某台服务器 CPU 负载挺高的,并且上面部署的服务响应速度有些慢。随即登录上去,使用 htop 查看内存使用情况挺正常的,但是看 CPU 状态,可以看到有多个 arc_prune 进程一直疯狂的在跑,如下图所示:

ZFS进程占用大量CPU资源 - 占用大量CPU资源

然后,发现 arc_prune 程序会大量占用系统的 CPU,而且持续时间很长,导致服务器读写数据有些吃紧,出现服务卡顿的情况。网上搜了下 arc_prune,才发现是 ZFS 产生的,其目的是为了回收内存。又在网上和对应 Github 上面逛了一圈,发现了这个 issue 和我遇到的情况是一致,但是到现在也并没有 close 掉。

ZFS进程占用大量CPU资源 - 占用大量CPU资源


但是,怎么解决这个问题呢?如果放着不管的话,等待自愈的话,也不清除什么时候对应的程序可以执行完毕,少则几分钟,多则一两个小时。显然,这样的情况是不能够被接受的,所以需要看看有没有什么好点的方法可以规避或者减少出现该问题的情况。

  • 出现该问题的原因

因为某些因素,迫使 ZFS 通过缩小 ARC 来回收内存。要立即解决此问题,可以尝试执行如下命令进行解决。但是,我这里尝试之后发现作用并不是很大,或者说收效甚微。

# drop Linux pagecache only
echo 1 > /proc/sys/vm/drop_caches

# drop both Linux pagecache and ARC
echo 3 > /proc/sys/vm/drop_caches

同时,为了避免相同的问题再次出现,必要的时候,我们需要设置一些关于 zfs 的设置,尽量避免出现回收 ARC 的情况。随后看到 behlendorfissue 中有 这样一个回答,大致说的就是:根据 arcstats 的规则,ARC 完全填充了元数据并且超过了目标(arc_meta_used > arc_meta_limit),arc_prune 线程会试图驱逐其中的一些元数据,使其达到 75% 的目标值。

arc_meta_used                   4    16208928088
arc_meta_limit                  4    12617951232
  • 修改前的 arc 相关的配置参数的值
cat /proc/spl/kstat/zfs/arcstats | grep arc
arc_no_grow                     4    0
arc_tempreserve                 4    0
arc_loaned_bytes                4    0
arc_prune                       4    0
arc_meta_used                   4    0
arc_meta_limit                  4    805306368
arc_dnode_limit                 4    80530636
arc_meta_max                    4    0
arc_meta_min                    4    16777216
arc_need_free                   4    0
arc_sys_free                    4    4573596928
arc_raw_size                    4    0
  • 修改后的 arc 相关的配置参数的值
$ cat /proc/spl/kstat/zfs/arcstats | grep arc
arc_no_grow                     4    0
arc_tempreserve                 4    0
arc_loaned_bytes                4    0
arc_prune                       4    33876095
arc_meta_used                   4    1346686344
arc_meta_limit                  4    1610612736
arc_dnode_limit                 4    161061273
arc_meta_max                    4    2637667408
arc_meta_min                    4    16777216
arc_need_free                   4    0
arc_sys_free                    4    1228552192
arc_raw_size                    4    0

修改之后,明显发现有效果,虽然有事还会看到 arc_prune 进程的出现,但是持续时间并不会太长,一会儿就跑完了,所以对应服务器上面的服务影响可以忽略不计了。虽然问题暂时得到了解决,但是官方到现在并没有得到修复和处理,所以在意的朋友可以持续关注下对应问题的进展。

ZFS进程占用大量CPU资源 - 配置修改原因和方式


参考链接地址,如下所示,可以自行查阅:


文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !