본문 바로가기
카테고리 없음

ZFS Raid 성능 테스트 보고서

by 이르가체페 2025. 11. 5.

 

 

 

1. 개요

본 문서는 FreeBSD 15 BETA4 환경에서 ZFS 파일시스템의 RAID 구성별 성능을 실측한 결과를 정리한 보고서다.
테스트는 가상화 계층(ESXi 6.5) 위에 구축된 FreeBSD VM에서 수행되었으며, HGST HUS724040ALA640 7200 RPM HDD 8 개를 HBA 패스스루 방식으로 연결하였다.
목적은 RAIDZ 시리즈(Z1/Z2/Z3)RAID10(미러+스트라이프) 구성의 순차·랜덤 입출력 성능을 정량적으로 비교하고, ZFS ARC 캐시 효율 및 튜닝 기본값을 함께 점검하는 것이다.


1.1 테스트 환경 요약

항목사양
OS FreeBSD 15.0-BETA4 (releng/15.0-n280840-f0b1ca546eb4)
하드웨어 플랫폼 VMware ESXi 가상머신 (HBA Passthrough 구성), Supermicro X8DTH-i
CPU Intel Xeon X5670 @ 2.93 GHz (6 코어 12 스레드 중 8 vCPU 할당)
메모리 32 GB 할당 (물리 호스트 64 GB ECC)
스토리지 컨트롤러 LSI SAS2008 (IT Mode, PCI Passthrough)
디스크 HGST HUS724040ALA640 4 TB × 8 (7200 RPM)
네트워크 Intel 82545EM 1 GbE
ZFS 버전 zfs-2.4.0-rc3 / zfs-kmod-2.4.0-rc3 (FreeBSD 빌드)

1.2 벤치마크 목표

  1. ZFS RAID 구조별 순차 I/O 대역폭 측정
    (RAID0 / RAIDZ1 / RAIDZ2 / RAIDZ3 / RAID10 비교)
  2. 4 K 랜덤 읽기·쓰기 IOPS 비교를 통해 ZFS의 랜덤 I/O 특성 파악
  3. ARC 캐시 및 ZIL 동작 상태 점검
    (메모리 활용 비율 및 vfs.zfs 튜닝 값 확인)
  4. FreeBSD 15 BETA4 커널 + zfs-2.4 조합의 안정성 검증

1.3 테스트 방법

  • fio 3.40 사용, psync 엔진 기반 실제 디스크 I/O 측정
  • 순차 패턴 : 1 MiB 블록 단위 읽기/쓰기 (단일 프로세스)
  • 랜덤 패턴 : 4 KiB 블록, 4 프로세스 병렬 테스트
  • 테스트 데이터 크기 : 10 GiB
  • 실행 시간 : 각 패턴당 60 초
  • 결과 저장 : /root/zfs_bench_<구성>_YYYYMMDD_HHMM.log

1.4 결과 요약 (미리보기)

구성순차 쓰기 (MiB/s)순차 읽기 (MiB/s)랜덤 쓰기 (IOPS)랜덤 읽기 (IOPS)
RAID0 1548 1298 466 764
RAIDZ1 1242 1103 146 186
RAIDZ2 1096 830 149 188
RAIDZ3 890 675 136 167
RAID10 862 744 215 317

 

 

2. 시스템 환경

이번 테스트는 VMware ESXi 가상화 환경 위에 FreeBSD 15.0-BETA4를 설치하고, HBA 패스스루(LSI SAS2008) 를 통해 물리 디스크를 직접 ZFS 풀로 구성한 상태에서 진행되었다.
아래는 실제 시스템 로그 기반의 구체적 사양 요약이다.


2.1 운영체제 정보

항목내용
OS FreeBSD 15.0-BETA4
커널 빌드 releng/15.0-n280840-f0b1ca546eb4 GENERIC amd64
커널 경로 /boot/kernel/kernel
커널 SMP 8 CPU 활성
시스템 아키텍처 amd64
메모리 총량 32 GB (물리 메모리 34 GB)
ARC 메모리 사용 2.3 MB (c_max ≈ 31 GB)

2.2 가상화 및 ESXi 구성

항목내용
하이퍼바이저 VMware ESXi 6.5
가상 머신 사양 vCPU 8, 메모리 32 GB
스토리지 연결 LSI SAS2008 HBA Passthrough
디스크 모드 물리 패스스루 (Raw Device Mapping 아님)
VM 장치 VMware SVGA II, AHCI Controller, USB2 EHCI
네트워크 어댑터 Intel 82545EM Gigabit Ethernet (em0)
NIC 속도 1 Gbps Full-Duplex

2.3 CPU / 메모리

항목내용
CPU 모델 Intel Xeon X5670 @ 2.93 GHz
코어 / 스레드 6 코어 12 스레드 (VM에는 8 vCPU 할당)
클럭 속도 2.93 GHz 고정
메모리 구조 4 × 8 GB DDR3 ECC Registered
커널 메모리 영역 vm.kmem_size = 33 GB, vm.kmem_size_max = 1.3 TB

2.4 디스크 및 컨트롤러 구성

항목내용
컨트롤러 Broadcom / LSI SAS2008 (IT Mode)
디스크 모델 HGST HUS724040ALA640 (4 TB 7200 RPM) × 8
인터페이스 SATA 6 Gb/s
펌웨어 MFAOAA70
연결 방식 HBA Passthrough (mps0 @ pci0:3:0:0)
부팅 디스크 VMware Virtual Disk (16 GB SSD 가상디스크)

2.5 ZFS 풀 구성

항목내용
ZFS 버전 zfs-2.4.0-rc3 / zfs-kmod-2.4.0-rc3
풀 이름 tank0
레이아웃 RAID10 (mirror 4 쌍 × 스트라이프)
전체 용량 14.5 TB
사용량 459 KB (초기 상태)
압축 방식 lz4
recordsize 1 MiB
atime off
sync 모드 standard
logbias latency

2.6 ARC / ZIL / L2ARC 구성

항목값
ARC 현재 크기 2.3 MB
ARC 최대치 (c_max) 31.0 GB
L2ARC 미사용 (설정 값은 활성화 가능)
ZIL pool 내 inline ZIL 사용 (slog 없음)
관련 튜닝 zil.special_is_slog = 1, zil.maxblocksize = 128 KB

2.7 네트워크 구성

항목내용
인터페이스 em0
IP 1.1.1.3 / 24
속도 1 Gbps
MTU 1500
TCP 버퍼 sendspace 32768 / recvspace 65536

2.8 구성 확인 명령 요약

구분명령어
OS 버전 uname -a, freebsd-version -kru
CPU/메모리 sysctl hw.model hw.ncpu hw.physmem
ESXi 장치 `pciconf -lv
디스크 목록 camcontrol devlist, geom disk list
HBA 확인 `pciconf -lv
ZFS 상태 zpool status -v, zpool list, zfs get all
ARC 통계 sysctl kstat.zfs.misc.arcstats.size c_max
네트워크 ifconfig -a, sysctl net.inet.tcp.sendspace

 

 

 

3. ZFS 풀 구성 및 테스트 환경

본 장에서는 실제 벤치마크에 사용된 ZFS 풀 구성 절차, 생성 명령어, 그리고 테스트 환경 세부 설정(fio 파라미터 포함) 을 정리한다.
테스트의 목적은 동일한 하드웨어 환경에서 RAID 유형별로 I/O 특성을 비교하는 것이므로, 각 테스트는 풀 생성 → fio 수행 → 결과 로그 저장 → 풀 삭제 순으로 독립적으로 진행되었다.


3.1 ZFS 버전 및 모듈

구성 요소버전
사용자 공간 zfs-2.4.0-rc3-FreeBSD_g814f9afba
커널 모듈 zfs-kmod-2.4.0-rc3-FreeBSD_g814f9afba
zpool 버전 ZFS pool version 5000 (feature flags enabled)

3.2 테스트 절차 요약

  1. ZFS 풀 초기화
    zpool destroy tank0 2>/dev/null || true
  2. RAID 유형별 풀 생성
    각 테스트마다 tank0 풀을 새로 만들고, /tank0에 마운트됨.
    압축은 lz4, recordsize=1M, atime=off 기본값 유지.
     
    RAID Z1 구성
    zpool create -f tank0 raidz1 da1 da2 da3 da4 da5 da6 da7 da8
     
    RAID10 구성
    zpool create -f tank0 \ mirror da1 da2 mirror da3 da4 mirror da5 da6 mirror da7 da8
  3. 데이터셋 기본 속성 조정
    zfs set compression=lz4 atime=off recordsize=1M tank0
  4. fio 테스트 수행 - 동일한 조건으로 seqread, randwrite, randread 테스트를 순차 실행.로그는 /root/zfs_bench_<raidtype>_YYYYMMDD_HHMM 형태로 저장됨.
     
    fio --name=seqwrite --directory=/tank0 --rw=write \ --bs=1M --size=10G --ioengine=psync --iodepth=16 --runtime=60 --time_based
  5. 풀 정리
     
    zpool destroy tank0

3.3 테스트 공통 설정

항목값
테스트 디렉토리 /tank0
테스트 파일 크기 10 GiB
블록 크기 순차 1 MiB / 랜덤 4 KiB
I/O 엔진 psync (실제 동기식 디스크 I/O)
병렬 프로세스 순차: 1 / 랜덤: 4
테스트 시간 60초
캐시 정책 ZFS ARC 기본 (ARC만 활성, L2ARC 없음)
압축 lz4
동기화(sync) standard
기록 로그(ZIL) pool 내부 ZIL 사용 (SLOG 없음)

3.4 테스트 자동화 스크립트 예시

 
cat > /root/run_zfs_bench.sh <<'EOF'
#!/bin/sh
RAIDTYPE="$1"
DISKS="da1 da2 da3 da4 da5 da6 da7 da8"
LOGDIR="/root"
POOL="tank0"

case "$RAIDTYPE" in
  z1)  zpool create -f $POOL raidz1 $DISKS ;;
  z2)  zpool create -f $POOL raidz2 $DISKS ;;
  z3)  zpool create -f $POOL raidz3 $DISKS ;;
  r10) zpool create -f $POOL mirror da1 da2 mirror da3 da4 mirror da5 da6 mirror da7 da8 ;;
  r0)  zpool create -f $POOL $DISKS ;;
esac

zfs set compression=lz4 atime=off recordsize=1M $POOL

for mode in seqwrite seqread randwrite randread; do
  fio --name=$mode --directory=/tank0 --rw=${mode%read}read --bs=$( [ "$mode" = seq* ] && echo 1M || echo 4k ) \
      --size=10G --ioengine=psync --iodepth=16 --runtime=60 --time_based \
      --output="${LOGDIR}/zfs_bench_${RAIDTYPE}_$(date +%Y%m%d_%H%M).log"
done

zpool destroy $POOL
EOF
chmod +x /root/run_zfs_bench.sh
 
 

3.5 ARC / I/O 모니터링 도구

항목명령
실시간 ARC 상태 arcstat 1 또는 arc_summary
ZFS I/O 상태 zpool iostat -v 1
디스크별 I/O gstat -dpI 1
CPU 및 캐시 로드 top -d1

3.6 데이터 정합성 확인

테스트 종료 후 데이터 무결성 검증을 위해 간단한 체크섬 비교 수행:

 
dd if=/dev/urandom of=/tank0/testfile bs=1M count=100 sha256 /tank0/testfile
 

테스트 전후 해시 불일치가 없음을 확인함.

 

 

 

 

4. ZFS 성능 측정 결과 및 분석

본 장에서는 각 RAID 구성(RAID0, RAIDZ1, RAIDZ2, RAIDZ3, RAID10)에 대해 동일한 fio 조건으로 수행한 순차 및 랜덤 I/O 테스트 결과를 정리한다.
모든 테스트는 FreeBSD 15-BETA4 + zfs-2.4.0-rc3 환경에서 ARC 초기화 후 1회성 실행으로 진행되었으며, 캐시 효과를 최소화했다.


4.1 테스트 조건 요약

항목값
테스트 명령 fio 3.40 (psync 엔진)
파일 크기 10 GiB
블록 크기 순차 1 MiB / 랜덤 4 KiB
병렬도 순차 1 / 랜덤 4
캐시 상태 ARC 초기화, L2ARC 미사용
테스트 시간 60초 (모드별)
압축 lz4 (기본 활성)
동기화 모드 standard

4.2 결과 요약표


 

RAID 구성 순차 쓰기 (MiB/s) 순차 읽기 (MiB/s) 랜덤 쓰기 (IOPS) 랜덤 읽기 (IOPS) 데이터 보호
RAID0 1548 1298 466 764 없음
RAIDZ1 1242 1103 146 186 1개 손실 허용
RAIDZ2 1096 830 149 188 2개 손실 허용
RAIDZ3 890 675 136 167 3개 손실 허용
RAID10 862 744 215 317 각 미러쌍 1개 손실 허용

 

 

ZFS RAID 구성별 개별 디스크 평균 성능 (8개 디스크 기준)
RAID 구성 디스크당 순차 쓰기 (MiB/s) 디스크당 순차 읽기 (MiB/s) 디스크당 랜덤 쓰기 (IOPS) 디스크당 랜덤 읽기 (IOPS)
RAID0 193.5 162.3 58.3 95.5
RAIDZ1 155.3 137.9 18.3 23.3
RAIDZ2 137.0 103.8 18.6 23.5
RAIDZ3 111.3 84.4 17.0 20.9
RAID10 107.8 93.0 26.9 39.6

 

 

 


4.3 순차 I/O 분석

쓰기

  • RAID0가 가장 높은 쓰기 대역폭을 기록했다(약 1.5 GiB/s).
  • RAIDZ1/Z2/Z3로 갈수록 패리티 계산 부담으로 인해 15–40% 수준의 성능 감소가 발생.
  • RAID10은 중간 정도의 성능을 보였으며, 쓰기 시 미러링 오버헤드가 제한적으로 존재.

읽기

  • RAIDZ 시리즈는 쓰기보다 읽기에서 더 큰 차이를 보였다.
    ZFS의 패리티 블록 재조합으로 인한 CPU 부하와 읽기 스트라이드 비효율 때문으로 분석된다.
  • RAID10은 병렬 읽기 분산 덕분에 RAIDZ2 대비 약 10~15% 높은 읽기 대역폭을 보였다.

4.4 랜덤 I/O 분석

랜덤 쓰기

  • RAIDZ 계열은 ZIL + 패리티 쓰기 오버헤드로 인해 IOPS가 급격히 하락(약 140~150 IOPS).
  • RAID10은 블록 미러 기반이라 쓰기 오버헤드가 낮고, 2배 이상의 IOPS를 기록.

랜덤 읽기

  • RAID10 구성에서 읽기 병렬화가 가능해 약 300 IOPS 이상 확보.
  • RAIDZ는 ZIL 미활성화 상태에서도 블록 파편화 영향이 크며, 실사용 워크로드에서는 캐시 의존도가 매우 높다.

4.5 ARC 캐시 및 CPU 부하 관찰

항목평균값
ARC hit ratio 25~35 % (초기 상태)
ARC 메모리 사용량 2~4 GiB 범위에서 안정적 유지
CPU 사용률 RAIDZ3에서 최대 80 % 부하 발생
메모리 I/O Wait RAID10에서 가장 안정적 (평균 2 %)

분석 결과, ARC 캐시가 아직 warm-up되지 않은 상태에서도 ZFS는 I/O 스케줄링을 균형 있게 처리하였다.
패리티 연산이 필요한 RAIDZ3의 경우 CPU 한계에 먼저 도달했으며, 이는 VM 환경의 단일 소켓 Xeon X5670에서 흔히 관찰되는 현상이다.


4.6 종합 평가

평가 항목추천 구성이유
순차 I/O 중심 NAS RAIDZ1 또는 RAIDZ2 안정성과 용량 효율의 균형
랜덤 I/O / DB / VM 스토리지 RAID10 지연시간 짧고 IOPS 유리
백업 전용 풀 RAIDZ3 내결함성 극대화
최대 성능 실험용 RAID0 비추천(무결성 없음), 단순 벤치용

4.7 요약

  • RAIDZ 계열은 쓰기 시 패리티 계산으로 인한 CPU 병목이 뚜렷하게 나타남.
  • RAID10은 랜덤 액세스 환경에서 가장 일관된 성능을 보였으며, FreeBSD 15에서도 안정적으로 동작.
  • ARC 캐시가 충분히 확보된 실서비스 환경에서는 ZFS의 읽기 성능이 더 향상될 여지가 있음.
  • RAIDZ3는 안정성은 최고지만 패리티 계산 비용이 크기 때문에 성능 중심 환경에는 부적합.

 

 

 

5. ZFS 캐시 구조 및 튜닝

ZFS의 캐시 계층(ARC, L2ARC, ZIL)은 파일시스템의 성능과 안정성에 직접적인 영향을 준다.
본 장에서는 FreeBSD 15-BETA4 환경에서 관찰된 캐시 동작 특성, 튜닝 포인트, ARC 메모리 한계 설정 등을 기술한다.


5.1 ZFS 캐시 계층 구조

계층설명저장 위치주요 역할
ARC Adaptive Replacement Cache 메인 메모리(RAM) 자주 사용되는 데이터 블록 캐싱
L2ARC Level 2 ARC SSD 또는 NVMe ARC의 확장, 덜 자주 쓰이는 데이터 캐싱
ZIL ZFS Intent Log Pool 내 로그 또는 별도 SLOG 디바이스 동기 쓰기 보장 (crash 복구용)

5.2 ARC (Adaptive Replacement Cache)

FreeBSD에서 ARC는 커널 메모리(vm.kmem)를 기반으로 동작한다.
본 테스트 환경의 vfs.zfs.arc_max는 자동 조정(0) 상태로, 전체 메모리의 약 50~60%를 ARC 최대치로 사용 가능하다.

주요 지표

항목값
ARC 현재 크기 2.3 MB
ARC 최대치(c_max) 31.0 GB
Hit Ratio (초기) 25~35 %
ARC 타입 MRU/MFU 혼합 알고리즘 기반

확인 명령

 
sysctl kstat.zfs.misc.arcstats.size sysctl kstat.zfs.misc.arcstats.c_max arc_summary arcstat 1
 

튜닝 예시 (/boot/loader.conf)

 
vfs.zfs.arc_max="16G" # ARC 최대 크기 고정 vfs.zfs.arc_min="4G" # 최소 확보 메모리

5.3 L2ARC (Level 2 ARC)

현재 테스트 환경에서는 L2ARC를 사용하지 않았으나, SSD 또는 NVMe를 캐시로 추가하면 성능 향상이 가능하다.
특히 대용량 HDD 풀(>10TB) 에서 랜덤 읽기 성능이 개선된다.

구성 예시

 
zpool add tank0 cache /dev/nvme0n1
 

확인

 
zpool status sysctl -a | grep l2arc
 

주의점

  • 초기화 시 캐시 재구축이 필요 (vfs.zfs.l2arc.rebuild_enabled=1)
  • L2ARC는 쓰기 캐시가 아니라 읽기 캐시
  • ARC hit ratio가 90% 이상이면 L2ARC 이점이 미미함

5.4 ZIL (ZFS Intent Log) / SLOG

ZIL은 동기식 쓰기를 보장하기 위한 로그 구조이다.
별도의 빠른 SSD를 SLOG로 지정하면, sync=always 환경(예: 데이터베이스, NFS)에 유리하다.

구성 예시

 
zpool add tank0 log /dev/nvme1n1
 

상태 확인

 
zpool status -v sysctl -a | grep zil
 
 

관련 튜닝

파라미터설명기본
vfs.zfs.zil.maxblocksize ZIL 블록 최대 크기 128K
vfs.zfs.zil.slog_bulk 대량쓰기 버퍼 64M
vfs.zfs.zil.nocacheflush SSD용 캐시플러시 비활성 0

5.5 튜닝 체크리스트

항목권장 설정설명
atime off 메타데이터 접근기록 비활성
recordsize 1M (대용량 파일) / 16K (DB) 블록 사이즈 조정
compression lz4 CPU 효율적 압축
logbias throughput / latency I/O 패턴에 따라 조정
primarycache all ARC 캐싱 허용
secondarycache all L2ARC 활용 시 활성

5.6 요약

  • ARC는 FreeBSD 커널 메모리의 절반가량을 자동으로 활용하며, 기본 튜닝으로도 효율적이다.
  • L2ARC는 NVMe SSD가 있을 경우 랜덤 읽기 성능을 유의미하게 개선한다.
  • ZIL/SLOG는 동기 쓰기 성능 개선에 필수적이며, 일반 워크로드에서는 기본 ZIL로 충분하다.
  • 캐시 구조 최적화는 하드웨어의 IOPS보다 메모리 크기와 패턴 최적화가 더 중요하다.

 

6. 종합 결론 및 권장 구성

이번 테스트는 FreeBSD 15-BETA4 환경에서 ZFS 2.4.0-rc3 버전을 이용해 다양한 RAID 구성을 비교한 것이다.
결과적으로, 단순한 IOPS 수치 이상으로, ZFS의 캐시·패리티·메모리 활용 특성을 파악하는 것이 중요하다는 점이 드러났다.


6.1 테스트 요약

구분주요 결과
최고 순차 성능 RAID0 (1.5 GiB/s 이상)
균형형 구성 RAIDZ1 / RAIDZ2
최고 랜덤 IOPS RAID10 (읽기 약 300 IOPS)
가장 안정적인 구조 RAIDZ3 (3중 패리티)
CPU 병목 발생구간 RAIDZ3 패리티 계산 시
메모리 사용량 ARC 2~4GB (자동 확장)

6.2 구성별 권장 사용 시나리오

목적권장 구성이유
데이터 안정성 중시 RAIDZ3 3중 패리티, 백업 스토리지용
일반 NAS / 파일 서버 RAIDZ2 성능과 안정성 균형
빠른 백업 캐시 / 영상 편집 RAIDZ1 순차 I/O 유리
데이터베이스 / VM RAID10 랜덤 액세스 우수
임시 테스트용 RAID0 무결성 없음, 단순 벤치용

6.3 FreeBSD 기반 ZFS의 특징

  • ARC의 자동 메모리 관리는 Linux보다 세밀하며, 커널 레벨 안정성이 높다.
  • ZFS 모듈 통합 버전(2.4.x) 은 FreeBSD 15에서 성숙 단계로 진입했으며, zpool iostat, arc_summary, fio 등의 툴과 잘 연동된다.
  • Virtualized 환경(ESXi 패스스루 + LSI 2008 HBA) 에서도 ZFS I/O 최적화가 비교적 안정적으로 유지되었다.

6.4 성능 해석 요약

  1. RAIDZ 계열은 패리티 연산으로 인한 CPU 병목이 명확히 존재한다.
  2. RAID10은 낮은 지연과 균등한 쓰기 부하 분산으로 실제 서비스에 적합하다.
  3. ARC 캐시의 초기 워밍업 유무에 따라 성능 편차가 크므로, 벤치 시 반드시 cold-cache 상태에서 측정해야 한다.
  4. ZFS의 내부 쓰기 정렬(write coalescing) 특성상, fio의 psync 엔진이 실제 워크로드보다 보수적인 결과를 낸다.

6.5 실무 적용 시 조언

  • 성능 튜닝 우선순위는 디스크보다 메모리(ARC)로그 디바이스(SLOG) 확보가 핵심이다.
  • ZFS는 단순 RAID보다 “데이터 무결성”을 우선하기 때문에, 순수 속도 비교는 절대적인 지표가 아니다.
  • fio 결과는 상대 지표로만 활용하고, 실제 워크로드(IO depth, concurrency, recordsize)에 맞춰 재조정하는 것이 바람직하다.
  • 장기 운용 시에는 zpool scrub 주기 관리와 ARC hit ratio 모니터링이 필수다.

6.6 결론

ZFS는 단순 파일시스템이 아니라 데이터 신뢰성과 복구 메커니즘을 통합한 스토리지 플랫폼이다.
RAIDZ3까지 지원하는 범용 구조 덕분에, FreeBSD 환경에서도 안정적인 대용량 NAS 운영이 가능하다.
특히 LSI HBA 패스스루 + 8Bay HDD 구성의 경우, RAID10 기반 풀이 가장 균형 잡힌 결과를 보여주었다.


6.7 향후 실험 계획

  • NVMe 기반 SLOG + L2ARC 추가 후 지연시간 변화 분석
  • recordsize, logbias, sync 모드 조합별 효율 비교
  • ZFS ZSTD 압축 알고리즘과 LZ4의 CPU 부하 차이 검증
  • FreeBSD vs Ubuntu ZFS on Linux 직접 비교 테스트

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

댓글