ZFS 성능 저하 해결 — 원인 진단부터 튜닝까지
ZFS를 운영하다 보면 어느 순간 I/O 속도가 뚝 떨어지거나 응답 지연이 눈에 띄게 늘어나는 경험을 하게 됩니다. 단순히 디스크 문제처럼 보이지만, ZFS 특유의 ARC·VDEV 구조를 이해하지 못하면 원인을 찾기 어렵더라고요. 이 글에서는 성능 저하의 주요 원인을 체계적으로 진단하고, 실제 명령어와 설정으로 해결하는 방법을 정리했습니다. TrueNAS를 포함한 OpenZFS 환경에서 즉시 적용할 수 있습니다.
1. 현재 상태 진단
먼저 풀의 현재 상태와 I/O 현황을 파악해야 합니다. 이게 병목 지점을 찾는 첫 단계거든요.
# 풀 전체 상태 확인 (오류·degraded 여부)
zpool status -v
# 1초 간격으로 I/O 통계 실시간 확인
zpool iostat -v 1
# 특정 데이터셋의 모든 속성 확인
zfs get all tank/data
<code>zpool iostat 출력에서 wait 컬럼이 높다면 디스크 큐가 포화 상태라는 뜻이고, read/write 대역폭이 예상보다 낮다면 ARC 히트율이나 압축 설정을 점검해봐야 합니다.
2. ARC(Adaptive Replacement Cache) 튜닝
ZFS의 성능은 ARC 크기에 크게 의존합니다. 기본적으로 시스템 RAM의 절반까지 사용하지만, 다른 워크로드와 충돌할 경우 명시적으로 제한이 필요합니다.
# ARC 현재 사용량·히트율 확인 (Linux)
cat /proc/spl/kstat/zfs/arcstats | grep -E "^(hits|misses|c |c_max|size)"
# ARC 최대 크기를 8 GiB로 제한 (영구 적용, Debian/Ubuntu)
echo "options zfs zfs_arc_max=8589934592" | sudo tee /etc/modprobe.d/zfs.conf
sudo update-initramfs -u
# 런타임 즉시 적용 (재부팅 시 초기화됨)
echo 8589934592 | sudo tee /sys/module/zfs/parameters/zfs_arc_max
# 데이터베이스용: recordsize를 DB 블록 크기에 맞춤 (PostgreSQL 기본 8K)
sudo zfs set recordsize=8K tank/postgres
# 접근 시간 기록 비활성화 (읽기 많은 워크로드에서 불필요한 쓰기 I/O 감소)
sudo zfs set atime=off tank/data
# LZ4 압축 활성화 (CPU 부담 낮고 압축률 양호)
sudo zfs set compression=lz4 tank/data
arcstats에서 히트율이 90% 미만이라면 ARC가 부족하거나 워킹셋이 ARC 용량을 초과한다는 의미입니다. L2ARC(SSD 캐시) 추가를 검토해 보세요.
3. 워크로드별 권장 설정 비교
워크로드마다 최적 설정이 다릅니다. 아래 표를 참고해서 자신의 환경에 맞는 설정을 선택하세요. TrueNAS 웹 UI에서도 동일한 설정을 적용할 수 있습니다.
| 워크로드 | recordsize | compression | atime | sync | primarycache |
|---|---|---|---|---|---|
| 일반 파일 서버 | 128K (기본값) | lz4 | off | standard | all |
| PostgreSQL / MySQL | 8K–16K | lz4 | off | standard | metadata |
| VM 이미지 (Proxmox 등) | 64K | off 또는 lz4 | off | disabled * | all |
| 미디어 스트리밍 | 1M | off | off | standard | metadata |
| 백업 아카이브 | 1M | zstd | off | standard | metadata |
* sync=disabled는 UPS 또는 전원 이중화 환경에서만 사용하세요. 전원 손실 시 데이터 유실 위험이 있습니다.
4. 마치며
ZFS 성능 저하는 단일 원인보다 ARC 크기 부족, recordsize 불일치, sync 설정, 디스크 포화가 복합적으로 작용하는 경우가 많습니다. zpool iostat로 병목 지점을 먼저 특정한 뒤, 위 설정들을 차근차근 적용하면서 변화를 관찰해 보세요. 측정 → 변경 → 검증 사이클을 지키는 것이 성능 튜닝의 가장 중요한 원칙입니다.