写入 USB 闪存驱动器时写入速度慢

end*_*ias 6 sync fstab udisks udev copy

我在旧的 Dell Optiplex 760 机器上运行 Ubuntu 20.04,将文件复制到 USB 闪存驱动器时的传输速度比应有的速度慢得多,此外,在传输程序结束时(我已经尝试复制文件with nautilus, cp, dd, rsync) 即使在整个文件传输到 USB 驱动器后也会挂起 - 这种挂起使得脚本文件传输变得困难,因为在传输程序返回 0 之前无法继续执行。我检查了文件大小,甚至做了一个md5sum校验和检查文件的完整性,发现文件已被正确复制且完好无损,但在 100% 的文件传输后,传输程序仍会挂起约 5 分钟。

我认为问题可能是设备被识别为 USB-1.0 设备。我检查了输出lsusb并与输出交叉引用,usb-devices发现闪存驱动器总是被识别为具有 USB2.0 速度,即 480Mbps - 所以 USB 版本没有问题。

用户@box:~$ lsusb

总线 006 设备 059:ID 0781:5567 SanDisk Corp. Cruzer Blade
总线 006 设备 001:ID 1d6b:0002 Linux Foundation 2.0 根集线器
总线 008 设备 001:ID 1d6b:0001 Linux Foundation 1.1 根集线器
总线 007 设备 001:ID 1d6b:0001 Linux Foundation 1.1 根集线器
总线 005 设备 001:ID 1d6b:0001 Linux Foundation 1.1 根集线器
总线 003 设备 001:ID 1d6b:0001 Linux Foundation 1.1 根集线器
总线 004 设备 002:ID 10f1:1a19 Importek USB 2.0 相机
总线 004 设备 001:ID 1d6b:0002 Linux Foundation 2.0 根集线器
总线 002 设备 001:ID 1d6b:0001 Linux Foundation 1.1 根集线器
总线 001 设备 001:ID 1d6b:0001 Linux Foundation 1.1 根集线器

usb-devices输出的相关部分

T: Bus=06 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 59 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P:供应商=0781 ProdID=5567 Rev=01.26
S:制造商=SanDisk
S:产品=克鲁泽刀片
S:序列号=200530450005728000EF
C:#Ifs= 1 Cfg#= 1 Atr=80 MxPwr=200mA
I: If#=0x0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage

这表明使用的 USB 版本没有任何问题。我检查了周围,其他人发现了一些与以字节为单位的设置vm.dirty_bytesvm.dirty_background_bytes配置有关的解决方法。这并没有提高传输速度,但传输程序现在允许更小的缓冲区大小和 100% 停止后的挥之不去。sysctl$((15*1024*1024))

在同一台机器上运行 Windows 7 时 - 使用相同的闪存驱动器,我可以以 7-8MBps 的平均速度持续传输。然而,当我重新启动并切换回 Ubuntu 时,USB 闪存驱动器的平均传输速率永远不会超过 2MBps。

下一个明显的解决方案可能与sync安装驱动器时使用的安装选项有关。我检查了我的/etv/fstab文件,它只有与我的 HDD 相关的条目 - 列出了 SATA 和 USB 连接的驱动器。但是,我的闪存驱动器都没有列在那里。我过去常常udiskctl --mount -b /dev/sdXX挂载我的 USB 驱动器 - 或者nautiluts为我自动挂载它们 - 并且不知道如何检查是否sync是挂载选项。

如何检查是否sync已启用,如果是,如何禁用它Ubuntu 20.04

mat*_*igo 7

当我要对外部设备进行大量写入时,我会使用hdparm. 这是我的方法:

  1. 打开终端
  2. 使用以下命令确定设备名称fdisk
    sudo fdisk -l
    
    Run Code Online (Sandbox Code Playgroud)
  3. 禁用设备的写缓存:
    sudo hdparm -W 0 /dev/sdX
    
    Run Code Online (Sandbox Code Playgroud) 注意:一定要替换成sdX合适的值。

笔记:

  • 此设置不会在重新启动后持续存在
  • 这可能会使机器在文件复制期间看起来“冻结”
  • 传输速度通常约为理论总线吞吐量的 70%(基于经验)
  • 有些人建议使用 中的-K选项hdparm,但我没有看到这会提高写入吞吐量


Lev*_*nte 6

什么时候完成?

例如,当 Nautilus 告诉您传输完成时,通常情况并非如此(尤其是在驱动器已安装的情况下async),Nautilus“已完成”提示与实际写入过程结束之间存在显着差异。

系统监视器 gnome shell 扩展将很好地补充 Nautilus 的复制,让您实时关注实际的写入过程;包括 USB 设备。

关于 fstab:

/etc/fstab文件通常只包含您希望在每次系统启动时自动安装的驱动器/分区。

由于您只是偶尔使用 USB 驱动器,通常您不希望在 fstab 中使用它。

关于sync

您对sync挂载选项的看法是正确的:它令人难以置信地减慢了速度(ext4在这方面,我只有文件系统的经验,我可以证明减慢速度。)

安装:

我建议不要使用udiskctl文档)(因为我不太了解它)(也因为找出它的论点对您来说并非微不足道)

相反,我建议使用mount命令(文档),您可以清楚地说明您的async选择。(尽管值得注意的是 async mount 是mount默认行为,所以通常不需要说明(仅当您想更加确定时)。

作为准备,创建一个挂载点,例如:

sudo mkdir /mnt/mystuff
sudo chown YOURUSERNAME:YOURUSERNAME /mnt/mystuff
Run Code Online (Sandbox Code Playgroud)

进而:

sudo mount -o async /dev/sdXX /mnt/mystuff
Run Code Online (Sandbox Code Playgroud)