ZFS ARC 튜닝: 상한값, 제한값 및 측정 항목
11분 소요 - 2026년 6월 24일

워크로드별 ZFS ARC 튜닝. 어떤 튜닝 항목이 중요한지, Linux 및 FreeBSD에서 zfs_arc_max를 설정하는 방법, 그리고 튜닝이 완료되었는지 확인하는 방법에 대해 다룹니다.
ZFS는 기본적으로 시스템 RAM의 약 절반을 읽기 캐시로 조용히 할당받으며, 부적절한 서버 환경에서는 스왑 활동, OOM(메모리 부족)에 의한 프로세스 강제 종료, 또는 데이터베이스와 파일 시스템 간의 메모리 경쟁이 발생할 수 있습니다. ZFS ARC 튜닝은 ARC가 실제로 유지할 수 있는 RAM 용량을 결정하고, 그 한도를 설정하기 위해 무엇을 포기할지 정하는 과정입니다. 이 글에서는 ARC가 메모리를 사용하는 방식, 설정을 변경하기 전에 측정해야 할 사항, 변경할 가치가 있는 몇 가지 조정 매개변수, 그리고 파일 서버, 하이퍼바이저, 데이터베이스, 백업 대상에 대한 합리적인 시작점을 다룹니다. ZFS 스냅샷에 대해서는 ZFS 스냅샷 가이드를 참조하십시오.
설정을 조정하기 전에 ARC를 측정하십시오
일반적인 피크 시간대의 기준 수치를 확보하기 전까지는 어떤 조정 가능한 항목도 변경하지 마십시오. 사용량이 적은 시간대의 스냅샷은 잘못된 방향으로 이끌 수 있습니다. 야간 백업, 주간 보고서, 배치 작업은 대개 ARC 동작이 흥미로워지는 시점이기 때문에, 며칠에 걸쳐 데이터를 수집하십시오.
다음 세 가지 도구만으로도 필요한 대부분의 기능을 다룰 수 있습니다:
arcstat 1히트 및 미스 카운터, 수요 대 프리페치 활동, 현재 ARC 크기를 실시간으로 스크롤하며 확인할 수 있습니다. 부하 테스트 및 백업 시간대에 이 도구를 사용하십시오.arc_summary단일 스냅샷을 출력합니다: ARC 크기와 목표값, MFU/MRU 분할, 메타데이터 비율, 활성 튜너블 설정 등이 포함됩니다.arc_summary -s arc명령어를 실행하면 ARC 섹션만 확인할 수 있습니다.- 원시 카운터는
/proc/spl/kstat/zfs/arcstats에 있으며,kstat.zfs.misc및vfs.zfsFreeBSD의 sysctl 트리 내에 있습니다. 포맷된 출력을 파싱하기보다는 모니터링에서 이 값들을 추출하십시오.
변경 전 기록해 둘 가치가 있는 카운터는 다음과 같습니다:
| 메트릭 | 찾을 수 있는 위치 | 중요성 |
|---|---|---|
ARC 크기, 목표값, 최대값 (size, c, c_max) | arcstat, kstat | ARC가 상한선에 고정되어 있는지, 아니면 여전히 확장 여지가 있는지 알려줍니다 |
| 요청 데이터 및 메타데이터 적중률 | arcstat, arc_summary | 수요 미달은 애플리케이션 지연 시간으로 직접 이어집니다 |
사용 가능한 메모리 및 스왑 활동 (si/so) | free -h, vmstat 1 | ARC 크기가 큰 상태에서 스왑 인/아웃이 지속적으로 발생하는 것은 메모리 부하의 가장 확실한 징후입니다 |
디스크 서비스 시간 (await) 및 사용률 | iostat -x | ARC 미스를 실제 스토리지 병목 현상과 연결합니다 |
memory_throttle_count | /proc/spl/kstat/zfs/arcstats | 카운트가 증가하면 메모리 압박으로 인해 ZFS가 스로틀링되고 있음을 확인 |
이 부분에서 사람들이 흔히 혼동하는 두 가지가 있습니다. ‘사용 가능한 메모리’를 확인해야지, ‘여유 메모리’를 확인해서는 안 됩니다. 리눅스는 여유 RAM이 적은 상태를 정상 상태로 보고하지만, 그 자체만으로는 문제가 되지 않습니다. 중요한 신호는 사용 가능 메모리가 0에 가까우면서 스왑 활동이 지속적으로 발생하는 경우입니다(이유는 리눅스 메모리 관리 입문서에서 다룹니다). 또한 히트 비율은 목표치가 아니라 추세로 간주해야 합니다. 스왑이 발생하는 시스템에서 99%의 히트 비율은 튜닝의 성공이 아니라 실패입니다.
중요한 4가지 ARC 조정 항목
대부분의 운영 환경 튜닝은 네 가지 설정으로 귀결됩니다. 설정을 베이스라인에서 실제로 측정된 부하와 일치시켜야 합니다. 스왑 활동은 zfs_arc_max. 핫 캐시를 계속 지우는 처닝 현상을 해결하면 zfs_arc_min로 설정하십시오. 디렉터리 탐색 속도가 느린 경우 메타데이터 제한을 확인하십시오.
| 조정 가능한 항목 | 기능 | 변경 시점 | 잘못 설정했을 때의 위험 |
|---|---|---|---|
zfs_arc_max | ARC RAM 사용량의 엄격한 상한선 | 예약된 RAM이 필요한 데이터베이스 또는 VM을 공동 호스팅하는 경우 | 너무 낮음: 디스크 I/O 및 지연 시간 증가. 너무 높음: 스왑 부하 또는 OOM 발생. |
zfs_arc_min | ARC가 과도하게 축소되는 것을 막는 하한선 | 캐시를 계속 지워버리는 짧은 메모리 급증 현상이 발생하는 워크로드 | 너무 높음: 실제 메모리 부하 발생 시 애플리케이션에 메모리 부족 현상 발생 |
zfs_arc_meta_limit_percent | 메타데이터에 할당 가능한 ARC의 비율 (기존의 zfs_arc_meta_limit) | 수백만 개의 작은 파일, 깊은 디렉터리 트리, 느린 ls/find | 너무 낮음: 디렉터리 조회 속도가 극도로 느려집니다. 너무 높음: 데이터 캐싱에 자원이 부족해집니다. |
zfs_arc_free_target | ZFS가 사용 가능 상태로 유지하려고 하는 시스템 메모리의 양 | 갑작스러운 대규모 할당 급증(VM 시작, 대규모 쿼리 계획)이 발생하는 서버 | 너무 높음: RAM이 사용 가능해도 ARC 크기가 작게 유지됨 |
눈에 띄는 부하 문제를 해결할 수 있는 최소한의 변경 사항부터 시작하십시오. zfs_arc_max, 적절한 상한값은 워크로드에 따라 달라집니다(다음 섹션에서 다룹니다). zfs_arc_min의 경우, 하한값은 zfs_arc_max 의 25%에서 50% 사이를 하한으로 설정하는 것이 합리적인 시작점입니다(하한 설정이 필요한 경우). 메타데이터의 경우, 최근 OpenZFS 기본 설정에서는 이미 zfs_arc_meta_limit_percent, 이는 대부분의 워크로드에 충분히 넉넉한 수준입니다. 메타데이터 미스 현상이 arcstat.
Linux 및 FreeBSD에서 변경 사항 적용
리눅스에서는 sysfs 매개변수 파일에 내용을 기록하여 실행 중에 변경 사항을 테스트할 수 있습니다. 재부팅은 필요하지 않습니다:
echo 17179869184 > /sys/module/zfs/parameters/zfs_arc_max이렇게 하면 zfs_arc_max 를 즉시 16 GiB로 설정합니다. 재부팅 후에도 변경 사항이 유지되도록 하려면 다음 파일에 추가하십시오. /etc/modprobe.d/zfs.conf:
options zfs zfs_arc_max=17179869184FreeBSD에서는 런타임 변경에 sysctl:
sysctl vfs.zfs.arc_max=17179869184다음에 동일한 값을 영구적으로 저장합니다 /boot/loader.conf:
vfs.zfs.arc_max="17179869184"한 번에 하나의 설정만 변경하고, 전체 RAM의 약 10% 정도씩 소폭씩 단계적으로 조정하십시오. 문제 발생 여부를 주의 깊게 관찰하십시오. 스왑 사용량이 0으로 유지되고 지연 시간이 안정적인 경우에만 변경 사항을 적용하십시오. 런타임 테스트를 통과한 후에만 변경 사항을 영구적으로 적용하십시오.
워크로드에 따른 ARC 조정
전체 RAM 용량부터 고려하는 것은 잘못된 접근 방식입니다. ARC 규모 결정은 해당 시스템의 워크로드 구성에 따라 결정되어야 합니다.
| 워크로드 | 시작 zfs_arc_max | ARC 우선순위 | 비고 | 주요 지표 |
|---|---|---|---|---|
| 전용 파일 서버 / NAS | RAM의 75% ~ 80% | 데이터 및 메타데이터 | 프리페치 활성화. 캐시를 적극적으로 활용하는 것이 핵심입니다. | 전체 히트 비율 |
| 가상화 호스트 | RAM의 30% ~ 40% | 균형 잡힌 | 게스트 RAM 및 호스트 작업에 여유 공간을 남겨두십시오. 0이 아닌 si/so 값은 상한을 더 낮춰야 함. | 호스트 스왑 (si/so) |
| 데이터베이스 서버 | RAM의 25%~50% | 메타데이터 중심 | 먼저 DB 엔진용 메모리를 확보하십시오. primarycache=metadata 엔진이 자체 버퍼 캐시를 처리하는 경우 이 옵션을 설정하십시오. | 미스 발생 |
| 백업/아카이브 대상 | 보수적인 상한 | 메타데이터 전용 | 설정 primarycache=metadata 따라서 1회 스캔 시 유용한 블록이 제거되지 않도록 합니다. | 미스 프리페치, 메타데이터 적중률 |
| 분석 / 반복 읽기 | 다른 캐시가 예약된 후 더 높은 상한값 | MFU가 많은 경우 | NVMe의 L2ARC는 쿼리 실행 전반에 걸쳐 핫 워킹 세트를 유지할 수 있습니다. | 수요 미스 |
VM 호스트는 게스트와 메모리를 공유해야 하므로, 30%~40%의 상한선은 안전한 기본값이며, 대부분의 빌드에서 50%는 이미 너무 높은 수치입니다. PostgreSQL 및 MySQL과 같은 데이터베이스는 자체 버퍼 캐시를 관리하므로, 먼저 엔진에 메모리를 할당하고 남은 공간을 ARC에 할당해야 합니다. 백업 대상은 다음과 같은 이점을 얻습니다. primarycache=metadata 읽어온 데이터가 다시 필요할 일은 거의 없으며, 야간 백업이 전체 풀을 순회하면서 나머지 캐시를 하나씩 비우는 것을 원치 않기 때문입니다. 모든 워크로드에 걸쳐, ARC가 고정된 상태에서 스왑 활동이 발생한다면 zfs_arc_max 상태일 때 발생하는 스왑 활동은 상한값이 너무 높다는 것을 의미하며, 이 규칙은 변하지 않습니다.
문제 진단 및 중단 시점 파악
ARC 크기가 너무 작으면 시스템에 여유 RAM이 남아 있음에도 높은 읽기 IOPS, 낮은 수요 적중률, 느린 디렉터리 탐색이 나타납니다. ARC 크기가 너무 큰 경우는 덜 뚜렷합니다. 적중률은 정상으로 보이지만, 시스템에서 스와핑이 시작되고, 부하 평균이 상승하며, 커널이 필요에 따라 ARC 페이지를 회수하는 동안 프로세스가 D 상태에서 차단되며, 최악의 경우 OOM 킬러가 희생 대상을 선택하기 시작합니다. 캐시는 정상으로 보이지만 서버 성능은 극도로 저하됩니다.
메타데이터 부하는 demand_metadata_bytes 보다 훨씬 높은 수준에 있을 때 나타납니다. demand_data_bytes 보다 훨씬 높게 나타날 때 발생합니다 arc_summary보다 훨씬 높게 나타날 때 발생합니다. 이는 메타데이터가 데이터와 공간을 놓고 경쟁하고 있는 상황이며, 이 경우 메타데이터 비율 제한을 높이는 것이 좋습니다.
현재 상황을 확인한 후, 가장 먼저 점검해야 할 설정은 다음과 같습니다:
| 증상 | 가능한 원인 | 가장 먼저 확인해야 할 조정 항목 | 다음 단계 |
|---|---|---|---|
높음 await 높은 수요와 미스 발생 | 작업 세트가 ARC를 초과함 | zfs_arc_max | RAM을 추가하거나 L2ARC를 추가하십시오 |
| ARC 용량이 큰 상태에서의 스왑 활동 | ARC 부족으로 인해 OS 또는 앱이 영향을 받음 | zfs_arc_max | 상한선 낮추기 |
| 메모리 사용량이 급증한 후 성능이 급격히 저하됨 | 재할당 과정에서 과도한 강제 제거 | zfs_arc_min | 상한선의 25%에서 50% 사이로 하한선 설정 arc_max |
느린 ls, find, 소용량 파일 작업 | 메타데이터 캐시 부족 | zfs_arc_meta_limit_percent | 메타데이터 비율을 높임 |
증가 중 memory_throttle_count | 전체 시스템의 메모리 부하 | zfs_arc_max | 상한선 낮추기; L2ARC 인덱스 부풀어오름 확인 |
L2ARC는 무료가 아닙니다. L2ARC 항목에 대한 인덱스는 1차 ARC에 상주하며, 이 오버헤드가 전체 ARC 용량의 약 3분의 1을 초과하면 보조 캐시는 이점보다 해를 더 많이 끼칩니다. 작업 세트가 RAM보다 크지만 여전히 고속 NVMe 장치에 모두 들어갈 수 있을 때, 그리고 주 ARC의 히트 비율이 이미 양호한 경우에만 L2ARC를 활용하십시오.
튜닝을 중단해야 할 적절한 시점은 지연 시간이 안정화되고, 원래 문제를 일으켰던 것과 동일한 부하 기간 동안 스왑이 0을 유지하며, 추가 변경 사항이 더 이상 어떤 개선 효과도 가져오지 않을 때입니다. 서버가 스왑을 하고 있다면 높은 적중률은 아무 의미가 없습니다. 그 시점이 지나면 설정 조정을 중단하고, 동일한 워크로드에서 같은 문제가 재발할 때만 설정을 재검토하십시오.
VM이나 데이터베이스와 메모리 경쟁 없이 ZFS를 제대로 실행할 수 있는 충분한 RAM 여유 공간을 갖춘 서버가 필요하다면(실제로 필요한 RAM 용량은 먼저 확인해 볼 가치가 있습니다), FDC 전용 서버를 살펴보시기 바랍니다.

iperf3 튜토리얼: Linux 및 Windows에서 네트워크 속도 테스트하기
Linux 및 Windows에서 정확한 결과를 얻으려면 iperf3를 설치하고, 대역폭 테스트를 실행하며, TCP 버퍼를 조정하십시오. UDP, 양방향 및 10GbE+ 테스트를 다룹니다.
10분 소요 - 2026년 5월 7일

질문이 있거나 맞춤형 솔루션이 필요하신가요?
유연한 옵션
글로벌 도달 범위
즉시 배포
유연한 옵션
글로벌 도달 범위
즉시 배포