Linux용 ZFS가 VirtualBox에 너무 많은 압력을 가하고 있습니까?

Linux용 ZFS가 VirtualBox에 너무 많은 압력을 가하고 있습니까?

나는 수년 동안 MD raid + LVM을 사용해 왔지만 최근에는 ZFS를 살펴보기로 결정했습니다. 이를 시험해 보기 위해 주 서버와 유사한 레이아웃(7개의 "SATA" 드라이브 또는 다양한 크기)을 가진 VirtualBox VM을 만들었습니다.

현재 MD+LVM 구성의 근사치를 사용하여 설정하고 ZFS를 시험해 볼 공간을 확보하기 위해 파일, LV, VG 등을 재정렬하는 데 필요한 단계를 계속해서 작업했습니다. 모든 것이 좋아 보였습니다. 가동 시간 3일 이내에 공간이 설치될 때까지 PV를 이동하고 재배열했습니다.

마지막으로 첫 번째 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(또한 게스트 및 호스트 OS)에서 VirtualBox 4.3.18_Debian r96516을 실행하고 있습니다. ZFS 버전은 ZFSonLinux.org/debian.html 0.6.3입니다.

나는 VirtualBox에서 ZFS를 시도하는 유일한 사람이 나였다는 것을 믿을 수 없기 때문에 앞으로 몇 년 동안 이것에 대해 더 많은 작업을 수행할 것이라고 생각했을 것입니다. 따라서 이 버그가 식별되고 수정되었을 것이라고 생각했을 것입니다. ZFS와 VirtualBox의 두 가지 버전은 Oracle에서 유지 관리합니다.

아니면 ZFS가 VM을 한계까지 밀어붙이고 에뮬레이트된 드라이브/컨트롤러가 충분히 빠르게 응답할 수 없는 경우입니까?


고쳐 쓰다:

풀을 생성한 후 14시간 이내에 VM에서 204개의 커널 ata 오류를 보고했습니다. 가장 실패한 명령은 "WRITE FPDMA QUEUED"였으며, "READ FPDMA QUEUED", "WRITE DMA" 및 단일 "FLUSH CACHE"가 그 뒤를 이었습니다. 아마도 ZFS는 이러한 명령을 다시 시도하지만 지금까지는 가상 머신에서 너무 많은 오류가 발생하는 경우 실제 서버에서 ZFS를 사용하는 것이 조심스럽습니다.

답변1

이는 게스트 시스템의 일반적인 하드 드라이브 시간 초과 오류처럼 보입니다. 이는 ZFS로 인해 발생할 수 있지만 다른 높은 I/O 작업으로 인해 발생할 수도 있습니다. 게스트 시스템으로서 Linux는 기본 시간 제한이 낮기 때문에(보통 30초) 이 점에 매우 민감합니다. 이는 가상 머신에서는 충분하지 않을 수 있습니다. 특히 디스크 이미지가 일반 파일이고 호스트 시스템이 로드 중인 경우 호스트 캐시가 가득 차면 일부 쓰기가 예상보다 오래 걸릴 수 있습니다.

아니면 인용해 보세요버추얼 박스 매뉴얼:

그러나 일부 클라이언트(예: 일부 Linux 버전)에서는 이미지 파일을 쓰는 데 약 15초 이상 걸릴 경우 심각한 문제가 발생할 수 있습니다. 그러나 호스트 캐시에 기록해야 할 많은 양의 데이터가 포함되어 있는 경우 일부 파일 시스템에서는 단일 쓰기를 완료하는 데 1분 이상 걸릴 수 있습니다.

이는 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

그런 다음 ata 예외를 찾아 사라지는지 확인합니다.

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

그러나 게스트 시스템의 시간 제한을 변경하는 것보다 가상 머신의 디스크 성능을 향상시키는 것이 더 좋습니다. VirtualBox의 경우 "호스트 I/O 캐시가상 머신의 가상 스토리지 컨트롤러를 비활성화할 수 있습니다. 활성화하면 호스트 캐시가 병목 현상을 일으키고 호스트에 디스크 I/O가 많으면 디스크 작업 속도가 느려질 수 있습니다. 증가 부하가 VM 자체에 있기 때문에 게스트가 과부하되면 여전히 시간 초과가 발생할 수 있으므로 작업 부하에 따라 경우에 따라 호스트 캐싱을 활성화하는 것이 더 나을 수도 있습니다.


그래도 도움이 되지 않으면 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~10MB) 사이의 값이 좋은 시작점이 됩니다. 간격을 줄이면 문제 발생 가능성이 줄어들고 게스트 쓰기 성능도 저하됩니다.


일부 테스트에서 VirtualBox 게스트는 호스트 I/O 캐싱 활성화 여부에 관계없이 이러한 하드 디스크 시간 초과(가상 머신 충돌 및/또는 손상 유발)를 경험했습니다. 예약된 크론 작업이 실행될 때마다 30분 동안 휴식을 취하여 VM이 시간 초과되는 경우를 제외하고 호스트 파일 시스템은 느리지 않습니다. 위에서 설명한 대로 하드 디스크 시간 초과를 설정한 후에야 문제가 사라지고 더 이상 시간 초과가 발생하지 않습니다.

관련 정보