ZFS for Linux 是否对 VirtualBox 压力过大?

ZFS for Linux 是否对 VirtualBox 压力过大?

我已经使用MD raid + LVM很多年了,但最近决定看看ZFS。为了尝试它,我创建了一个 VirtualBox VM,其布局与我的主服务器类似 - 7 个“SATA”驱动器或各种大小。

我使用当前 MD+LVM 配置的近似值进行设置,并继续制定重新排列文件、LV、VG 等所需的步骤,以腾出空间来尝试 ZFS。一切看起来都不错 - 我移动并重新安排了 PV,直到在 3 天的正常运行时间内设置好空间。

最后,我创建了第一个 ZPool:

  pool: tank
 state: ONLINE
  scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    tank        ONLINE       0     0     0
      raidz1-0  ONLINE       0     0     0
        sdb1    ONLINE       0     0     0
        sdc1    ONLINE       0     0     0
        sdd1    ONLINE       0     0     0
        sde1    ONLINE       0     0     0
        sdg1    ONLINE       0     0     0

errors: No known data errors

我创建了几个 ZFS 数据集并开始使用cp和复制文件tar。例如cd /data/video;tar cf - .|(cd /tank/video;tar xvf -)

然后我注意到虚拟机中出现 SATA 错误,尽管主机系统没有显示任何错误。

Apr  6 10:24:56 model-zfs kernel: [291246.888769] ata4.00: exception Emask 0x0 SAct 0x400 SErr 0x0 action 0x6 frozen
Apr  6 10:24:56 model-zfs kernel: [291246.888801] ata4.00: failed command: WRITE FPDMA QUEUED
Apr  6 10:24:56 model-zfs kernel: [291246.888830] ata4.00: cmd 61/19:50:2b:a7:01/00:00:00:00:00/40 tag 10 ncq 12800 out
Apr  6 10:24:56 model-zfs kernel: [291246.888830]          res 40/00:01:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
Apr  6 10:24:56 model-zfs kernel: [291246.888852] ata4.00: status: { DRDY }
Apr  6 10:24:56 model-zfs kernel: [291246.888883] ata4: hard resetting link
Apr  6 10:24:57 model-zfs kernel: [291247.248428] ata4: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
Apr  6 10:24:57 model-zfs kernel: [291247.249216] ata4.00: configured for UDMA/133
Apr  6 10:24:57 model-zfs kernel: [291247.249229] ata4.00: device reported invalid CHS sector 0
Apr  6 10:24:57 model-zfs kernel: [291247.249254] ata4: EH complete

此错误在各种不同的驱动器上多次发生,偶尔会出现“READ FPDMA QUEUED”或(两次)“WRITE DMA”命令失败的情况,以至于内核最终报告:

Apr  6 11:51:32 model-zfs kernel: [296442.857945] ata4.00: NCQ disabled due to excessive errors

这不会阻止报告错误。

互联网搜索显示,大约 4 年前,VirtualBox.org 网站上已记录此错误(https://www.virtualbox.org/ticket/8311)对于 VirtualBox 4.0.2 版本,显然被认为已修复,但随后重新开放。

我在 Debian (Sid) 内核版本 3.16.0-4-amd64(也是来宾操作系统和主机操作系统)上运行 VirtualBox 4.3.18_Debian r96516。 ZFS 的版本为 ZFSonLinux.org/debian.html 0.6.3。

我本以为在接下来的几年里,我们在这方面做了更多的工作,因为我不敢相信我是唯一在 VirtualBox 下尝试 ZFS 的人,所以我本以为这个错误会被识别并解决,特别是作为两个版本ZFS 和 VirtualBox 由 Oracle 维护。

或者这只是 ZFS 将虚拟机压力推向极限而模拟驱动器/控制器无法足够快地响应的情况?


更新:

在我创建池后的 14 小时内,VM 报告了 204 个内核 ata 错误。大多数失败的命令是“WRITE FPDMA QUEUED”,其次是“READ FPDMA QUEUED”、“WRITE DMA”和单个“FLUSH CACHE”。据推测,ZFS 重试了这些命令,但到目前为止,如果 ZFS 在虚拟机上产生如此多的错误,我对在真实服务器上使用 ZFS 持谨慎态度!

答案1

这些看起来像是来宾系统中的通用硬盘超时错误。它们可能是由 ZFS 引起的,但也可能是由其他高 I/O 操作引起的。作为客户系统,Linux 在这方面非常敏感,因为它的默认超时时间较低(通常为 30 秒)。这在虚拟机中可能还不够,特别是当磁盘映像是常规文件并且主机系统处于负载状态时;如果主机的缓存已满,某些写入可能需要比预期更长的时间。

或者,引用虚拟盒手册:

然而,如果写入映像文件的时间超过大约 15 秒,某些客户机(例如某些 Linux 版本)就会出现严重问题。然而,如果主机缓存包含大量需要写入的数据,则某些文件系统需要一分钟以上才能完成单次写入。

请注意,这不仅限于 VirtualBox。其他虚拟化解决方案在运行 Linux 来宾时可能会显示相同的行为。

至于超时本身:Linux 硬盘超时(导致 ata 异常并可能在高负载下损坏)可以在来宾系统中增加。

例如,在 Debian 7 上,您所需要做的就是向您的 中添加几行/etc/rc.local

$ cat /etc/rc.local 
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

TIMEOUT=86400
for f in /sys/block/sd?/device/timeout; do
    echo $TIMEOUT >"$f"
done

exit 0

然后 grep for ata 异常看看它们是否消失了:

# grep -Rn --col 'ata.*exception' /var/log/

但是,最好提高虚拟机的磁盘性能,而不是更改来宾系统的超时。就 VirtualBox 而言,“主机 I/O 缓存虚拟机的虚拟存储控制器的“可以禁用。如果启用,主机缓存可能成为瓶颈,如果主机上有大量磁盘 I/O,则主机缓存可能会减慢磁盘操作。另一方面,禁用它可能会增加负载在虚拟机本身上,因此如果来宾超载,仍然可能会发生超时,因此在某些情况下启用主机缓存可能会更好,具体取决于您的工作负载。


如果这没有帮助,VirtualBox 手册还建议尝试刷新间隔:

对于 IDE 磁盘,请使用以下命令:

VBoxManage setextradata "VM name"
  "VBoxInternal/Devices/piix3ide/0/LUN#[x]/Config/FlushInterval" [b]

对于 SATA 磁盘,请使用以下命令:

VBoxManage setextradata "VM name"
  "VBoxInternal/Devices/ahci/0/LUN#[x]/Config/FlushInterval" [b]

1000000 到 10000000(1 到 10 兆字节)之间的值是一个很好的起点。减少间隔既会降低出现问题的概率,也会降低来宾的写入性能。


在某些测试中,无论是否启用主机 I/O 缓存,VirtualBox 来宾系统都会遇到此类硬盘超时(使虚拟机崩溃和/或导致损坏)。主机文件系统并不慢,除了每当计划的 cron 作业运行时都会有半分钟的时间,导致虚拟机超时。只有按照上述方式设置硬盘超时后,问题才消失,并且不再发生超时。

相关内容