You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

同一NVMe SSD内分区间rsync传输速度慢于外接HDD的原因排查及优化方案咨询

同一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

火山引擎 最新活动