我已经使用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 作业运行时都会有半分钟的时间,导致虚拟机超时。只有按照上述方式设置硬盘超时后,问题才消失,并且不再发生超时。