VMware vSphere의 공유 데이터 스토어로는 VMware vSAN을 사용한 HCI 구성하거나 혹은 외부 스토리지를 제공하는 방식이 있습니다. 외부 스토리지는 대표적으로 SAN과 NAS가 있을 수 있는데, 이번 포스팅에서는 Synology NAS의 SAN Manager를 활용, iSCSI를 통해 제공된 VMware vSphere 공유 데이터 스토어에 대한 튜닝을 통해 얼마나 성능 향상을 이룰 수 있는지 확인해 보도록 하겠습니다.
테스트 환경
| 장비 | 사양 | 소프트웨어 | 용도 | 비고 |
| Beelink SER5 MAX | - CPU: AMD Ryzen 7 5800H - RAM: 64GB DDR4 3200MHz - Network: 1Gbps Ethernet 2EA - Local Disk: Essencore KLEVV CRAS C710 M.2 NVMe 256GB |
VMware ESXi 8.0.3 | VM 호스팅용 하이퍼바이저 | 2개 NIC 중 1개 NIC을 iSCSI 전용 스토리지 네트워크로 사용 |
| Synology DS1515+ | - CPU: Intel Atom C2538 - RMA: 16GB DDR3 메모리 - Network: 1Gbps NIC 4EA - Disk: Samsung SSD 870 EVO 4TB 3EA(RAID 5) |
DSM 7.1.1-42962 Update 9 | iSCSI LUN 제공 | 3개의 이더넷 인터페이스를 통해 iSCSI 타겟 제공/Thick Provisioning LUN |
| TP-Link SG2218 | Interface: 1Gbps RJ45 16 Ports / 1Gbps SFP Slot 2EA | - | 스토리지 트래픽 전송 | L2 네트워크에 Synology NAS와 ESXi 호스트를 위치 |
| IOPS Test VM | - CPU: 4vCore - RAM: 4GB - Network: 1Gbps - Disk: 60GB - SCSI 컨트롤러: VMware 반가상화 |
Ubuntu 24.03 | IOPS 테스트 | Thick Provisioning Disk |

- 스토리지 네트워크 MTU 1500: 점보 프레임 설정 시 ESXi 호스트가 먹통되는 문제 발생으로 기본값 사용
- 동일한 L2 네트워크에 NAS와 ESXi 호스트를 두어, 스위치 레벨에서 트래픽을 처리하도록 설계
- Synology NAS iSCSI LUN과 VM의 디스크 모두 Thick Provisioning 구성
- 캐시 효과 배제를 위해 NAS 물리 메모리 용량의 1.5배인 24GB로 테스트 데이터 설정
테스트 시나리오
Test VM의 블록 디스크의 위치와, ESXi의 설정을 변경해 가면서 IOPS 성능의 변화를 측정합니다.
| 시나리오 | 다중 경로 지정 정책 | Synology I/O 정책 | 설명 |
| [대조군] ESXi Local Disk | - | - | |
| [비교군 1] MPIO 기본 설정 | 가장 최근에 사용됨(VMware) | 버퍼링된 I/O | ESXi 호스트가 iSCSI 타겟에 대한 다중 경로만 인식하고 있는 상태 |
| [비교군 2] 라운드 로빈 기본 설정 | 라운드 로빈(VMware) | 버퍼링된 I/O | ESXi 호스트가 iSCSI 타겟에 대해서 1000IOPS 마다 새로운 경로를 지정하여 사용 |
| [비교군 3] 라운드 로빈 IOPS 정책 수정 | 라운드 로빈(VMware) 1 IOPS |
버퍼링된 I/O | ESXi 호스트가 iSCSI 타겟에 대해서 1 IOPS마다 새로운 경로를 지정하여 사용 |
| [비교군 4] 라운드 로빈 IOPS 정책 수정 + Synology NAS I/O 정책 변경 | 라운드 로빈(VMware) 1 IOPS |
직접 I/O | Synology NAS 버퍼링 해제 |
- 테스트 도구: Fio
- 방식
- 테스트 시작 전 24GB 전체 영역에 데이터를 기록하는 과정을 선행하여 Test VM의 시스템 레벨의 할당 오버헤드 제거
- 테스트 시 실제 데이터를 읽어 오도록 강제하여 MPIO 네트워크 대역폭과 디스크 I/O 성능을 정확히 타격하도록 설계
- 각 테스트간 60초의 휴지 기간을 가지고 실행
- 측정 결과 집계: 총 3회를 측정하여 평균값을 도출
테스트 데이터 생성 스크립트
fio --name=warmup_fill \
--filename=fio_test_file.dat \
--ioengine=libaio \
--rw=write \
--bs=1M \
--direct=1 \
--numjobs=1 \
--size=24G \
--group_reporting
- 앞서 언급한 NAS의 캐시 효과 배제를 위해 NAS 물리 메모리의 1.5배인 24GB 테스트 데이터를 준비
테스트 스크립트
COUNT=3 # Test 횟수
OUTPUT_PREFIX="test name" #fio 테스트 결과 파일 이름 prefix
echo "==== FIO 벤치마크 시작 (총 ${COUNT}회) ===="
for i in $(seq 1 $COUNT); do
echo ""
echo "[$(date '+%H:%M:%S')] ${i}회차 진입: 60초 대기 후 테스트 시작..."
sleep 60
echo "[$(date '+%H:%M:%S')] ${i}회차 측정 시작 (5분)..."
fio --name=benchmark_mpio_test \
--filename=fio_test_file.dat \
--ioengine=libaio \
--rw=randrw \
--rwmixread=70 \
--bs=4k \
--direct=1 \
--numjobs=4 \
--size=24G \
--runtime=300 \
--time_based \
--iodepth=32 \
--group_reporting \
--output-format=json \
--output="${OUTPUT_PREFIX}_${i}.json"
echo "[$(date '+%H:%M:%S')] ${i}회차 완료 -> ${OUTPUT_PREFIX}_${i}.json 저장됨"
done
iSCSI 설정 - 테스트 전 기본 설정
공통 설정 - IOPS 대기열 맞춤



- ESXi에서 확인되는 iSCSI 타겟 LUN의 대기열 크기와 Synology NAS의 iSCSI 서비스의 I/O 대기열 수준을 동일하게 설정
[비교군 1] MPIO 기본 설정

- 소프트웨어 스토리지 어댑터를 생성하고 NAS의 iSCSI 서버 IP 중 하나를 동적 검색으로 등록하면 다중 경로 설정이 자동으로 생성
- 다중 경로 지정 정책의 기본 정책은 가장 최근에 사용됨(VMware)로 이는 NAS에서 제공하는 경로 중 가장 최근에 사용된 경로를 계속 사용하는 것으로, 해당 경로가 실패할 때 다른 경로로 변경됨(Active - Standby 설정)
[비교군 2] 라운드 로빈 기본 설정

- 라운드 로빈 정책을 통해 다중 경로를 돌아가면서 사용할 수 있도록 선택
- 라운드 로빈 기본 설정값은 1000 IOPS 마다 경로를 변경
# esxi 호스트에 shell로 접근 후 아래 명령어를 수행
# Storage device list 확인
esxcli storage nmp device list | grep -i "Device Display Name" -B 1
naa.6001405722e8deed16d2d4662d8c32df
Device Display Name: SYNOLOGY iSCSI Disk (naa.6001405722e8deed16d2d4662d8c32df)
--
naa.60014056b78746cda247d45dbd8576de
Device Display Name: SYNOLOGY iSCSI Disk (naa.60014056b78746cda247d45dbd8576de)
--
naa.6001405e5b0f035db767d4b26da2d1da # 튜닝 대상 데이터 스토어
Device Display Name: SYNOLOGY iSCSI Disk (naa.6001405e5b0f035db767d4b26da2d1da)
# 데이터 스토어 기본 IOPS 정책 확인
esxcli storage nmp psp roundrobin deviceconfig get -d naa.6001405e5b0f035db767d4b26da2d1da
Byte Limit: 10485760
Device: naa.6001405e5b0f035db767d4b26da2d1da
IOOperation Limit: 1000 # 1000 IOPS 마다 경로 변경이 기본 설정
Latency Evaluation Interval: 0 milliseconds
Limit Type: Default # 기본 라운드 로빈 정책
Number Of Sampling IOs Per Path: 0
Use Active Unoptimized Paths: false
[비교군 3] 라운드 로빈 IOPS 정책 수정
# 위에서 살펴본 튜닝 대상 디스크에 대해서 아래 명령어를 실행하여 IOPS 정책을 변경
esxcli storage nmp psp roundrobin deviceconfig set --type=iops --iops=1 --device=naa.6001405e5b0f035db767d4b
26da2d1da
# 정책 변경 확인
esxcli storage nmp psp roundrobin deviceconfig get -d naa.6001405e5b0f035db767d4b26da2d1da
Byte Limit: 10485760
Device: naa.6001405e5b0f035db767d4b26da2d1da
IOOperation Limit: 1 # 1 IOPS 마다 경로 변경 정책 설정됨
Latency Evaluation Interval: 0 milliseconds
Limit Type: Iops # IOPS 기준으로 경로 변경 정책 설정됨
Number Of Sampling IOs Per Path: 0
Use Active Unoptimized Paths: false
- 1 IOPS 마다 iSCSI 경로를 변경하도록 설정하여 극한의 성능 향상을 노리는 설정
[비교군 4] 라운드 로빈 IOPS 정책 수정 + Synology NAS I/O 정책 변경

- LUN에 대한 I/O 버퍼를 해제하고 직접 디스크에 읽고 쓰는 설정을 활성화
- 데이터가 물리 디스크에 안전하게 기록되었음을 확인할 때까지 완료 신호를 주지 않는 설정으로 안정성 향상의 목적
테스트 결과 및 심층 분석
총 4가지 시나리오에 대한 FIO 벤치마크 결과, iSCSI MPIO 튜닝(라운드 로빈 IOPS=1)이 단일 물리 네트워크 환경에서 드라마틱한 성능 향상을 가져옴을 확인했습니다. 하지만 이면에는 운영 입장에서 반드시 알아야할 Trade-off가 숨겨져 있는것도 확인할 수 있었습니다.
테스트 결과
| 테스트 시나리오 | Total IOPS | Bandwidth(MB/s) | Read Latency Avg (ms) | Read Latency P99 (ms) | Write Latency Avg (ms) | Write Latency P99 (ms) |
| [대조군] ESXi Local Disk | 51890 | 202.69 | 3.24 | 8.26 | 0.67 | 1.77 |
| [비교군 1] MPIO 기본 설정 | 17558.75 | 68.59 | 7.19 | 14.99 | 7.53 | 19.97 |
| [비교군 2] 라운드 로빈 기본 설정 | 20153.18 | 78.72 | 6.23 | 13.13 | 6.6 | 16.78 |
| [비교군 3] 라운드 로빈 IOPS 정책 수정 | 27543.46 | 107.59 | 4.53 | 21.8 | 4.89 | 26.96 |
| [비교군 4] 라운드 로빈 IOPS 정책 수정 + Synology NAS I/O 정책 변경 | 8172.02 | 31.92 | 1.89 | 5.97 | 47.69 | 67.2 |




심층 분석
Insight 1. 기본값(Default)의 함정: 대역폭 낭비
가장 먼저 눈에 띄는 것은 기본 설정인 [비교군 1] - MPIO 기본 설정과 [비교군 2] - 라운드 로빈 기본 설정의 비효율성 입니다.
- 현상: [비교군 1]과 [비교군 2]의 설정에서는 대역폭이 약 68 - 78 MB/s에 머물렀습니다. 이는 1 Gbps 네트워크의 최대 한계의 60 - 70% 수준 밖에 활용하지 못하는 수준입니다.
- 원인: TCP 단일 세션의 한계입니다. ESXi가 단일 경로를 고집하거나[비교군 1] 경로 변경 주기가 너무 길면[비교군 2], 4K 랜덤 I/O와 같은 작은 블록 전송 시 윈도우 사이즈와 응답 대기(RTT)로 인해 물리 대역폭을 가득 채우지 못합니다. 고속도로는 뚫려 있는데 톨게이트를 하나만 열어둔 셈입니다.
Insight 2. IOPS=1 튜닝: 물리적인 최대치에 도달
라운드 로빈 정책의 경로 변경 임계값을 1 IOPS로 수정[비교군 3]한 후, 생각보다 놀라운 성능 향상이 관찰되었습니다. 구형 NAS임에도 불구하고 예상보다 고무적인 수치가 나와주었습니다.
- 성과: 대역폭이 107.58MB/s까지 치솟았습니다. 이는 이더넷 오버헤드를 제외하면 사실상 1Gbps 물리 회선을 95% 이상 포화 시킨 수치입니다.
- 핵심: 물리적인 업링크는 1개뿐이지만, '다중 세션(Multi-Session)' 효과를 톡톡히 봤습니다. 1 IOPS마다 경로를 바꿔가며 NAS의 여러 포트로 세션을 분산시켰고, 이를 통해 I/O 큐(Queue)를 병렬로 처리하여 단일 세션의 병목을 소프트웨어적으로 극복해냈습니다.
Insight 3. 속도와 안정성의 Trade-off (P99 Latency & Kubernetes)
하지만 모든 지표가 긍정적인 것만은 아닙니다. 하위 1%의 느린 응답 속도를 나타내는 P99 Latency의 변화를 주목해야 합니다. 특히 Kubernetes 관점에서 말이죠.
- 현상: 평균 성능은 좋아졌지만, P99 Latency는 **14.99ms(MRU) → 21.8ms(Tuned)**로 오히려 악화되었습니다. 이는 대역폭 포화로 인한 네트워크 큐잉 지연(Queuing Delay) 때문입니다.
- Kubernetes 환경에서의 의미: 이 수치는 etcd와 같은 민감한 워크로드에 치명적일 수 있습니다. etcd는 쓰기 작업마다 fsync를 수행하는데, P99 지연시간이 지속적으로 20~30ms를 넘어가면 리더 선출(Leader Election) 실패나 API 서버 응답 저하로 이어질 수 있습니다. 즉, 처리량(Throughput)을 얻는 대신 응답의 균일성(Stability)을 일부 희생한 결과입니다.
Insight 4. 벤치마크와 현실의 차이: 단일 vs 다중 워크로드
이번 테스트 결과는 단일 VM이 스토리지를 독점할 때의 최대 성능이라는 점을 기억해야 합니다.
- Noisy Neighbor: 실제 운영 환경에서 여러 VM이 동시에 부하를 준다면(Multi-Workload), NAS의 대기열이 가득 차면서 Latency는 이보다 훨씬 더 튀게 될 것입니다.
- 의의: 따라서 이 결과값(27k IOPS)은 항상 보장되는 성능이 아니라, 이 인프라가 견딜 수 있는 물리적 한계점(Baseline)으로 해석하는 것이 타당합니다.
번외 분석: NAS 쓰기 캐시(Bufferd I/O)는 필수인가?
마지막으로 데이터 무결성을 위해 직접 I/O를 활성화했을 때의 결과는 상당히 실망스러웠습니다.
- 성능 붕괴: 쓰기 지연시간(Avg)이 47.69ms로 튜닝 전보다도 6배 이상 느려졌으며, 전체 대역폭은 31.92 MB/s로 곤두박질쳤습니다.
- 교훈: SATA SSD 기반의 RAID 5 환경에서는 '패리티 연산(Read-Modify-Write)' 오버헤드가 매우 큽니다. 이를 NAS의 RAM 캐시가 받아주지 못하면, 아무리 네트워크를 튜닝해도 디스크단에서 병목이 발생함을 알 수 있습니다. 따라서 홈랩 환경에서는 성능은 버퍼(Cache)로 챙기는 것이 현실적인 정석입니다.
결론 및 제언: 성능과 안정성의 균형 찾기
이번 실험을 통해 단일 1Gbps 망에서도 iSCSI 튜닝은 선택이 아닌 필수라는 점을 증명했습니다. 하지만 단순히 설정을 바꿨다고 끝이 아닙니다. 다음의 운영 전략이 병행되어야 합니다.
1. 최적의 튜닝 조합
단일 1Gbps 링크의 물리적 한계를 극복하기 위해서는 라운드 로빈 (IOPS=1) 설정과 NAS의 쓰기 캐시(Buffered I/O 활성화가 가장 효과적인 해법임이 확인되었습니다. (대역폭 약 57% 향상)
2. 현실적인 운영 해법 (Hybrid Approach)
하지만 앞서 분석했듯, 이 설정은 네트워크를 한계까지 밀어붙여 P99 Latency를 불안정하게 만들 수 있습니다. 따라서 Kubernetes와 같은 민감한 워크로드를 운영한다면 다음과 같은 전략을 추천합니다.
- 기반 설정: 스토리지 성능 극대화를 위해 RR IOPS=1을 유지합니다.
- 안정성 확보: ESXi 레벨에서 VM별 IOPS 제한(Limit)이나 SIOC(Storage I/O Control)를 적용합니다.
- 일반 VM: IOPS를 적절히 제한하여 스토리지 큐를 독점하지 못하게 방지
- 중요 VM (etcd/Control Plane): 제한을 풀거나 높은 우선순위(Shares)를 부여하여 Latency 보장
3. 마무리
이번 테스트는 단순히 숫자를 높이는 튜닝이 아니라, 제한된 홈랩 자원 환경에서 성능·안정성·운영 복잡도 사이의 균형점을 어디에 두어야 하는지를 고민하는 과정이었습니다.
스토리지 튜닝에 ‘무조건적인 정답’은 없습니다. 내 인프라의 한계를 명확히 알고, 워크로드의 성격에 맞춰 의도적으로 Trade-off를 선택하는 것이야말로 엔지니어링의 핵심임을 다시 한번 확인할 수 있었습니다.
'System > Hypervisor' 카테고리의 다른 글
| ESXi 커스텀 USB NIC 드라이버 사용과 한계에 대하여 (0) | 2025.02.18 |
|---|


















































