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 벤치마크 목표
- ZFS RAID 구조별 순차 I/O 대역폭 측정
(RAID0 / RAIDZ1 / RAIDZ2 / RAIDZ3 / RAID10 비교) - 4 K 랜덤 읽기·쓰기 IOPS 비교를 통해 ZFS의 랜덤 I/O 특성 파악
- ARC 캐시 및 ZIL 동작 상태 점검
(메모리 활용 비율 및 vfs.zfs 튜닝 값 확인) - 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 결과 요약 (미리보기)
| 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 테스트 절차 요약
- ZFS 풀 초기화
zpool destroy tank0 2>/dev/null || true
- RAID 유형별 풀 생성
각 테스트마다 tank0 풀을 새로 만들고, /tank0에 마운트됨.
압축은 lz4, recordsize=1M, atime=off 기본값 유지.RAID10 구성RAID Z1 구성zpool create -f tank0 raidz1 da1 da2 da3 da4 da5 da6 da7 da8zpool create -f tank0 \ mirror da1 da2 mirror da3 da4 mirror da5 da6 mirror da7 da8 - 데이터셋 기본 속성 조정
zfs set compression=lz4 atime=off recordsize=1M tank0
- 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
- 풀 정리
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 데이터 정합성 확인
테스트 종료 후 데이터 무결성 검증을 위해 간단한 체크섬 비교 수행:
테스트 전후 해시 불일치가 없음을 확인함.
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 혼합 알고리즘 기반 |
확인 명령
튜닝 예시 (/boot/loader.conf)
5.3 L2ARC (Level 2 ARC)
현재 테스트 환경에서는 L2ARC를 사용하지 않았으나, SSD 또는 NVMe를 캐시로 추가하면 성능 향상이 가능하다.
특히 대용량 HDD 풀(>10TB) 에서 랜덤 읽기 성능이 개선된다.
구성 예시
확인
주의점
- 초기화 시 캐시 재구축이 필요 (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)에 유리하다.
구성 예시
상태 확인
관련 튜닝
| 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 성능 해석 요약
- RAIDZ 계열은 패리티 연산으로 인한 CPU 병목이 명확히 존재한다.
- RAID10은 낮은 지연과 균등한 쓰기 부하 분산으로 실제 서비스에 적합하다.
- ARC 캐시의 초기 워밍업 유무에 따라 성능 편차가 크므로, 벤치 시 반드시 cold-cache 상태에서 측정해야 한다.
- 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 직접 비교 테스트
댓글