我目前正在将大型目录树从外部 HDD 复制到服务器的内部存储。复制操作的性能基本相当不错,即通过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
感谢您的任何建议!
我们发现问题出在 ZFS 使用的缓存上。问题是我们没有创建额外的读写缓存。因此,ZFS 使用默认缓存放置在包含数据的 zpool 中/旁边。因此,对于任何读取操作,数据都是从 RAID 写入读取,写入缓存(也进入 RAID),然后提供给用户。类似的写入。由于 RAID 是加密的,每次读取和写入都会触发多次加密/解密和 RAID 同步,这会导致 RAM 缓冲区满一段时间后性能下降。
我们通过为 ZFS 添加额外的读/写缓存(ZFS中的 L2ARC 和 ZIL SLOG)解决了这个问题——在我们的例子中是两个额外的小型 HDD。即使将缓存放置在 HDD 上,我们也可以获得更高的读写速度并且不会降低性能。