我在一台旧的戴尔 Optiplex 760 机顶盒上运行 Ubuntu 20.04,将文件复制到 USB 闪存驱动器时的传输速度比应有的速度慢得多,此外,在传输结束时,传输程序(我尝试使用、、、复制文件)nautilus
即使整个文件已传输到 USB 驱动器后也会挂起——这种挂起使脚本文件传输变得困难,因为在传输程序返回 0 之前,执行无法继续。我检查了文件大小,甚至做了校验和来检查文件的完整性,发现文件已被正确复制并且完好无损,然而在文件传输了 100% 之后,传输程序仍挂起大约 5 分钟。cp
dd
rsync
md5sum
我认为问题可能是设备被识别为 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:总线=06 Lev=01 Prnt=01 端口=00 Cnt=01 设备编号= 59 Spd=480 MxCh= 0 D:Ver=2.00 Cls=00(>ifc)Sub=00 Prot=00 MxPS=64 #Cfgs=1 P:供应商=0781 产品 ID=5567 修订版本=01.26 S:制造商 = SanDisk S:产品=Cruzer Blade S:序列号=200530450005728000EF C:#Ifs= 1 Cfg#= 1 Atr=80 MxPwr=200mA 我:如果#=0x0 Alt= 0 #EPs= 2 Cls=08(存储) Sub=06 Prot=50 驱动程序=usb-storage
这表明所采用的 USB 版本没有任何问题。我检查了一下,其他人也找到了一些与设置vm.dirty_bytes
和vm.dirty_background_bytes
配置sysctl
字节有关的解决方法$((15*1024*1024))
。这并没有提高传输速度,但现在允许传输程序使用更小的缓冲区大小,并且 100% 之后的延迟已经停止。
在同一台机器上使用 Windows 7 时 - 使用相同的闪存驱动器,我可以持续以 7-8MBps 的平均速度进行传输。但是,当我重新启动并切换回 Ubuntu 时,USB 闪存驱动器的平均传输速率从未超过 2MBps。
sync
下一个明显的解决方案可能与安装驱动器时使用的安装选项有关。我检查了我的/etv/fstab
文件,它只包含与我的硬盘驱动器相关的条目 - 列出了 SATA 和 USB 连接的驱动器。但是,我的闪存驱动器都没有列在那里。我用它udiskctl --mount -b /dev/sdXX
来安装我的 USB 驱动器 - 或者nautiluts
自动安装它们 - 我不知道如何检查它是否sync
是一个安装选项。
我如何检查是否sync
已启用,如果已启用,我如何禁用它Ubuntu 20.04
?
答案1
当我需要对外部设备进行大量写入操作时,我会使用 禁用该设备的写入缓存hdparm
。以下是我操作的方法:
- 打开终端
- 使用以下命令确定设备名称
fdisk
:sudo fdisk -l
- 禁用设备的写缓存:
笔记:确保sudo hdparm -W 0 /dev/sdX
sdX
用适当的值替换。
笔记:
- 此设置在重启后不再保留
- 这可能会使机器在文件复制过程中出现“冻结”
- 传输速度通常约为理论总线吞吐量的 70%(基于经验)
- 有些人建议使用
-K
中的选项hdparm
,但我没有看到这能提高写入吞吐量
答案2
什麼時候完成?
例如,当 Nautilus 告诉您传输完成时,这通常不是真的(特别是在驱动器已安装的情况下async
),Nautilus 的“完成”提示和实际写入过程的结束之间存在显著差异。
系统监视器 gnome shell 扩展将很好地补充使用 Nautilus 进行复制,让您可以实时关注实际的写入过程;包括 USB 设备。
关于 fstab:
该/etc/fstab
文件通常只包含您希望在每次系统启动时自动安装的驱动器/分区。
由于您只是偶尔使用 USB 驱动器,因此通常您不希望它出现在您的 fstab 中。
关于sync
:
您对sync
mount 选项的说法是正确的:它会使速度变得非常慢(我ext4
在这方面只对文件系统有经验,我可以证明速度确实会变慢。)
安装:
我建议不要使用udiskctl
(文档)(因为我不太了解它)(而且因为找出它的参数对你来说并不容易)
相反,我建议使用mount
命令(文档),您可以清楚地说明您的async
选择。(但值得注意的是,异步挂载是mount
的默认行为,因此通常不需要说明(只有当您想额外的当然)。)
作为准备,创建一个挂载点,例如:
sudo mkdir /mnt/mystuff
sudo chown YOURUSERNAME:YOURUSERNAME /mnt/mystuff
进而:
sudo mount -o async /dev/sdXX /mnt/mystuff