同一NVMe SSD内分区间rsync传输速度慢于外接HDD的原因排查及优化方案咨询
嘿,我完全理解这种困惑——明明是同一块NVMe SSD内部的分区传输,速度居然比不上外接HDD,换谁都会觉得不对劲。咱们一步步拆解可能的原因,再看看怎么调试和优化:
可能的核心原因分析
- NVMe SSD的硬件资源共享限制:NVMe SSD的高性能依赖于并行队列和多通道NAND芯片,但同一磁盘内的所有分区共享同一个控制器和NAND资源。当你用rsync同时从源分区读、向目标分区写时,相当于让磁盘同时进行读写操作,会争抢硬件资源,导致速度无法达到单方向读写的峰值。而外接HDD是独立的IO设备,读写操作互不干扰,初期还能利用系统缓存跑出高速度,之后才降到磁盘的真实性能。
- 文件系统挂载选项的额外开销:ext4默认的挂载选项可能包含一些影响性能的设置,比如
barrier=1(为了数据安全的写屏障)、没有开启noatime/nodiratime(减少元数据更新),这些在同一磁盘内的读写场景下,会额外增加IO开销。 - rsync默认行为的隐性开销:rsync默认会做文件属性校验、临时文件写入后重命名等操作,虽然对大文件影响不大,但在同一磁盘内的传输场景下,这些步骤可能会因为元数据访问的锁机制或磁盘内部调度,放大开销。
调试与优化步骤
1. 先排除rsync的影响,测试裸磁盘传输速度
用dd命令直接测试磁盘的读写性能,看看是不是rsync本身的问题:
# 从partition1读取视频文件到partition2 dd if=/media/partition1/video1.mp4 of=/media/partition2/test.mp4 bs=1G status=progress
如果dd的速度也和rsync差不多慢,那问题就出在磁盘或文件系统上,和rsync无关;如果dd速度明显更快,那就是rsync的参数需要调整。
2. 调整文件系统挂载选项
先查看当前的挂载选项:
mount | grep /media/partition1 mount | grep /media/partition2
如果看到barrier=1或者没有noatime/nodiratime,可以临时重新挂载测试(注意:barrier=0会降低数据安全性,仅用于测试):
# 卸载并重新挂载partition1 sudo umount /media/partition1 sudo mount -o defaults,noatime,nodiratime,barrier=0 /dev/nvme0n1p4 /media/partition1 # 同样处理partition2 sudo umount /media/partition2 sudo mount -o defaults,noatime,nodiratime,barrier=0 /dev/nvme0n1p5 /media/partition2
重新挂载后再用rsync测试速度,如果有提升,可以把这些选项添加到/etc/fstab中永久生效(记得把barrier=0改回barrier=1,除非你能接受数据安全风险)。
3. 优化rsync的传输参数
尝试添加--inplace选项,让rsync直接写入目标文件,避免创建临时文件再重命名的开销:
rsync -av --progress --inplace --remove-source-files /media/partition1/video* .
另外,明确加上--whole-file(rsync本地传输默认已经启用,但明确指定可以避免潜在的校验开销):
rsync -av --progress --whole-file --inplace --remove-source-files /media/partition1/video* .
4. 调整IO调度器
Ubuntu 20.04对NVMe默认使用的是none调度器(或kyber,取决于内核版本),有些场景下mq-deadline调度器更适合顺序传输:
先查看当前调度器:
cat /sys/block/nvme0n1/queue/scheduler
临时切换到mq-deadline测试:
echo mq-deadline | sudo tee /sys/block/nvme0n1/queue/scheduler
测试传输速度,如果有效,可以通过修改/etc/default/grub永久生效:
- 编辑
/etc/default/grub,找到GRUB_CMDLINE_LINUX,添加nvme.io_scheduler=mq-deadline,比如:GRUB_CMDLINE_LINUX="quiet splash nvme.io_scheduler=mq-deadline" - 执行
sudo update-grub,重启系统后生效。
总结
最可能的根源是同一NVMe SSD内同时读写时的硬件资源争抢,导致无法发挥单方向读写的峰值性能。通过调整文件系统挂载选项、rsync参数或IO调度器,应该能一定程度提升内部传输速度。如果这些都没有明显改善,也可能是你的NVMe SSD本身的双工读写性能限制,这属于硬件特性,很难进一步优化。
备注:内容来源于stack exchange,提问作者genbatro




