由于空闲时间较长(rsync、cp 等),文件复制操作性能低下

由于空闲时间较长(rsync、cp 等),文件复制操作性能低下

我目前正在将大型目录树从外部硬盘复制到服务器的内部存储。复制操作的性能基本上相当不错,即通过 USB2 连接的外部硬盘为 35MB/s。

但是,我只获得了大约 30 秒的这种性能,然后复制过程就没有任何 CPU 时间。这意味着,rsync(以及 cp)不会复制任何数据,不会更新其标准输出,也不会对 SIG-TERM 做出反应。大约 1 分钟后,它再次被调度,并再次以 35MB/s 的速度复制 30 秒,然后再次什么都没有,依此类推。

有谁知道这里会发生什么,或者告诉我什么工具可以让我调查发生了什么?我已经将 rsync 进程的 nice 值增加到 19,但这并没有改变任何东西。在 rsync 的空闲时间里,整个系统处于空闲状态(没有其他 IO,没有其他使用 CPU 的进程。基本上,整个系统都处于空闲状态)。在活动时间内,rsync 进程有三个线程在“运行”、“不可中断睡眠”和“可中断睡眠”之间切换。在非活动时间内,所有线程都处于“不可中断睡眠”或“可中断睡眠”状态。因此,我认为 rsync 必须等待一些持续时间较长的 IO 操作。但我如何确定哪个操作需要这么多时间?

系统运行在 5.4.34-1-pve Linux 内核上,内部存储是 LVM 上的 LUKS 加密 ZFS 文件系统。LVM 位于 mdadm RAID 5 之上。我用来启动 rsync 的命令是:rsync -ah --no-compress --progess

谢谢您的任何建议!

答案1

我们发现问题出在 ZFS 使用的缓存上。问题在于我们没有创建额外的读写缓存。因此,ZFS 使用默认缓存,这些缓存位于包含数据的 zpool 中/旁边。因此,对于任何读取操作,数据都是从 RAID 读取,写入缓存(也写入 RAID),然后提供给用户。写入也是如此。由于 RAID 是加密的,因此每次读取和写入都会触发多次加密/解密和 RAID 同步,这会导致 RAM 缓冲区已满一段时间后性能下降。

我们通过为 ZFS 添加额外的读/写缓存解决了这个问题(ZFS 中的 L2ARC 和 ZIL SLOG) - 在我们的例子中是两个额外的小型 HDD。即使缓存放在 HDD 上,我们也能获得更高的读写速度,并且不会降低性能。

相关内容