这个问题主要是关于 Linux 上的 USB 性能,但更具体地说是关于从 USB 运行 virtualbox 映像时的性能问题。我在 virtualbox 论坛上发布了此内容,但到目前为止没有人帮助我。
细节
我购买了新的金士顿 HyperX Savage 512 GB 3.1 USB 记忆棒。我在上面复制了一个 150 GB 的文件,验证了哈希值,结果通过了。我还使用以下方法验证了速度:
time $(sudo dd if=/dev/zero of=/home/host/mnt/testfile2 bs=1M count=1000 & sync)
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 3.69425 s, 284 MB/s
real 0m3.883s
user 0m0.002s
sys 0m0.002s
其他时候大约是 110 MB/s,但我仍然认为 VirtualBox 的性能足以在其上运行 Ubuntu 实例。
另一个基准测试显示以下内容:
sudo hdparm -Tt /dev/sdd1
/dev/sdd1:
Timing cached reads: 21882 MB in 1.99 seconds = 10973.39 MB/sec
Timing buffered disk reads: 1204 MB in 3.00 seconds = 400.74 MB/sec
发生的情况是,当我启动 VirtualBox 时,会发生暂停或滞后。全新启动和关闭的虚拟盒日志位于:https://pastebin.com/iC7kQ54J(把开头部分剪掉,因为它太长了)。
根据我的研究,每当出现滞后时,VBox.log 中都会出现大量以下消息:
00:07:10.988753 AsyncCompletion: Task 0x007f65495ff9c0 completed after 16 seconds
00:07:17.981513 AsyncCompletion: Task 0x007f65495ffe80 completed after 23 seconds
00:07:17.989714 AsyncCompletion: Task 0x007f65495ff7c0 completed after 23 seconds
00:07:18.004043 AsyncCompletion: Task 0x007f65495ffec0 completed after 23 seconds
00:07:18.009427 AsyncCompletion: Task 0x007f65495fffc0 completed after 23 seconds
00:07:18.065390 AsyncCompletion: Task 0x007f65495ffd80 completed after 23 seconds
00:07:18.065474 AsyncCompletion: Task 0x007f65495ff840 completed after 23 seconds
经过谷歌搜索后,似乎人们说这与驱动器上的 I/O 有关,但如果我在基准测试期间驱动器获得良好的性能,情况怎么可能呢?
我的基准标记错了吗?
你能建议一个更好的方法吗?
是否有任何其他可能被禁用的参数导致虚拟盒与我的 USB 出现性能问题?
在此虚拟机运行期间,主机上的 dmesg 中没有错误。
这是 sudo lshw | grep -A26 -B10 Kingston 对于我的 USB:
*-usb:1
description: Mass storage device
product: HyperX Savage
vendor: Kingston
physical id: 6
bus info: usb@4:6
logical name: scsi8
version: 1.00
capabilities: usb-3.10 scsi emulated scsi-host
configuration: driver=usb-storage maxpower=896mA speed=5000Mbit/s
*-disk
description: SCSI Disk
product: HyperX Savage
vendor: Kingston
physical id: 0.0.0
bus info: scsi@8:0.0.0
logical name: /dev/sdd
version: PMAP
size: 468GiB (503GB)
capabilities: removable
configuration: ansiversion=6 logicalsectorsize=512 sectorsize=512
*-medium
physical id: 0
logical name: /dev/sdd
size: 468GiB (503GB)
capabilities: partitioned partitioned:dos
configuration: signature=6e13cd5d
*-volume
description: EXT4 volume
vendor: Linux
physical id: 1
logical name: /dev/sdd1
logical name: /home/host/mnt
version: 1.0
serial: e953210a-43c2-4ba9-87ec-55ed8ab3c6ff
size: 468GiB
capacity: 468GiB
capabilities: primary journaled extended_attributes large_files huge_files dir_nlink recover 64bit extents ext4 ext2 initialized
configuration: created=2018-09-01 00:55:53 filesystem=ext4 label=datapartition lastmountpoint=/home/host/mnt modified=2018-09-01 12:50:22 mount.fstype=ext4 mount.options=rw,relatime,data=ordered mounted=2018-09-01 12:50:22 state=mounted
谁能告诉我可能是什么问题吗?
答案1
根据你的日志,看来你已经安装了KVM。 (至少驱动程序似乎已加载)如果是这样,那么您就有了滞后的原因。两个司机争夺相同的资源。几年前我也做过同样的事情,但系统的反应很糟糕。
短期解决方案是在启动 Virtualbox 之前卸载 KVM 模块。一种长期的解决方案是卸载一个虚拟化应用程序或在初始化之前自动进行检查。
答案2
根据您自己的问题,在最佳条件下,USB 写入时间是读取时间的一半。看来您没有考虑缓冲区,并且与设备的实际性能相比,这些速度非常有利。
所以尝试:
时间 $(sudo dd if=/dev/urandom of=/home/host/mnt/testfile2 bs=1M count=1000 ) 时间 $(sudo dd if=/dev/
urandom of=/home/host/mnt/testfile2 bs =1M 计数=1000 & 同步)
并查看第二次操作的时机。
进行并发操作也不太适合这种媒介,并且会导致它停止。在这种使用情况下,此类设备的寿命会很短,此类介质不是为此类使用而设计的。
通常,虚拟机管理程序也需要大量 I/O,除了 VM 的 I/O 操作之外,它们可能还会不断保存 VM 映像,并且某些技术还执行定期快照。
简而言之,您试图赋予它非设计用途的用途,无论您如何尝试优化它都不会起作用。
附言。我还有一支“相同”型号的 USB 笔,除了容量较小,而且该型号是一个非常糟糕的选择,它们是慢的正常使用情况下。制造商的规格在纸面上看起来不错,但他们通常使用适合其 RAM 缓冲区的数据量来计时操作。
PS2。您说该设备是 USB 3.1,但没有告诉我们您设备的技术。