写入时复制事务模型/快照与克隆/轻量化文件系统创建
ZFS
是一个拥有逻辑卷管理功能的文件系统,最早源自于 Oracle
为 Solaris
操作系统开发的文件系统。ZFS
具有可扩展性,并且包括大量保护措施防止数据损坏,支持高存储容量、高效数据压缩、集成文件系统、卷管理、快照和写时复制、连续完整性检查与自动修复、RAID-Z
、原生 NFSv4 ACL
等功能,并且能被精确配置。ZFS
有两个主要实现,分别来自 Oracle
和 OpenZFS
,它们之间极度相似,这使得 ZFS
在类 Unix
系统中广泛可用。
今天早上发现,管理的某台服务器 CPU
负载挺高的,并且上面部署的服务响应速度有些慢。随即登录上去,使用 htop
查看内存使用情况挺正常的,但是看 CPU
状态,可以看到有多个 arc_prune
进程一直疯狂的在跑,如下图所示:
然后,发现 arc_prune
程序会大量占用系统的 CPU
,而且持续时间很长,导致服务器读写数据有些吃紧,出现服务卡顿的情况。网上搜了下 arc_prune
,才发现是 ZFS
产生的,其目的是为了回收内存。又在网上和对应 Github
上面逛了一圈,发现了这个 issue
和我遇到的情况是一致,但是到现在也并没有 close
掉。
但是,怎么解决这个问题呢?如果放着不管的话,等待自愈的话,也不清除什么时候对应的程序可以执行完毕,少则几分钟,多则一两个小时。显然,这样的情况是不能够被接受的,所以需要看看有没有什么好点的方法可以规避或者减少出现该问题的情况。
- 出现该问题的原因
因为某些因素,迫使 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
的情况。随后看到 behlendorf
在 issue
中有 这样一个回答,大致说的就是:根据 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
进程的出现,但是持续时间并不会太长,一会儿就跑完了,所以对应服务器上面的服务影响可以忽略不计了。虽然问题暂时得到了解决,但是官方到现在并没有得到修复和处理,所以在意的朋友可以持续关注下对应问题的进展。
参考链接地址,如下所示,可以自行查阅: