- 출처 / 참고: VMware Broadcom Knowledge Base (Using esxtop to identify storage performance issues - KB 1008205, Multipathing policies in ESXi - KB 1011340)
명령어:
esxtop,esxcli,tail,grep,awk
키워드: Datastore Latency, Storage Pathing, esxtop, DAVG/cmd, KAVG/cmd, GAVG/cmd, QAVG/cmd, NMP, Round Robin, VMW_PSP_RR, Dead Path
사용처: ESXi 데이터스토어 I/O 응답 지연(Spike)으로 인한 가상 머신(VM) 행(Hang) 및 FC/iSCSI 스토리지 경로 장애 진단 및 최적화
실행예제
가상 머신들의 디스크 I/O 응답이 극도로 느려지거나 vSphere Client에 데이터스토어 대기 시간 경고가 발생했을 때, ESXi 셸에서 esxtop 디바이스 뷰(u)를 통해 커널 대기 시간(KAVG)과 스토리지 디바이스 응답 지연(DAVG)을 분리 측정하고, esxcli로 다중 경로(Multipath) 상태를 확인합니다.
# 1. esxtop 배치 모드를 이용한 디스크 디바이스(LUN)별 응답 지연 시간(Latency) 즉시 확인
$ esxtop -b -n 1 | tr ',' '\n' | grep -E "DAVG/cmd|KAVG/cmd|GAVG/cmd|QAVG/cmd" | head -n 15
# 또는 실시간 콘솔에서 'esxtop' 실행 후 'u'(디바이스 뷰) -> 'f'(필드 선택) -> 대기 시간 지표 확인:
# DEVICE r/s w/s DAVG/cmd KAVG/cmd GAVG/cmd QAVG/cmd
# naa.60050768028085a12000000000000101 820.10 250.40 38.45 0.12 38.57 0.00
# naa.60050768028085a12000000000000102 12.00 5.00 1.20 0.05 1.25 0.00
# -> DAVG/cmd(스토리지 디바이스 응답 지연)가 38ms로 급증하여 전체 지연(GAVG)을 유발함을 확인 (스토리지/SAN 구간 병목)
# 2. vmkernel.log에서 스토리지 경로 장애(Path Dead) 및 SCSI 센스 코드 점검
$ tail -n 50 /var/log/vmkernel.log | grep -E "NMP|Path|SCSI:.*0x28|0x2a"
# [출력 예시 - 특정 패스 다운]
# 2026-10-26T14:10:12.102Z cpu2:2097341)WARNING: NMP: nmp_PathDetermineFailure:4521: Path 'vmhba1:C0:T0:L1' is dead.
# 2026-10-26T14:10:12.105Z cpu2:2097341)StoragePath: Path 'vmhba1:C0:T0:L1' marked as DEAD
# -> HBA 포트 또는 스위치 포트 문제로 경로 1개가 죽어 페일오버(Failover) 지연 유발 확인
# 3. LUN별 멀티패싱 정책(PSP: Path Selection Policy) 확인
$ esxcli storage nmp device list
# naa.60050768028085a12000000000000101
# Device Display Name: NETAPP Fibre Channel Disk (naa.60050768028085a12000000000000101)
# Path Selection Policy: VMW_PSP_FIXED
# Path Selection Policy Display Name: Fixed (VMware)
# Working Paths: vmhba1:C0:T0:L1
# -> Round Robin(RR)이 아닌 Fixed로 설정되어 단일 패스로만 I/O가 집중되고 있는지 확인
# 4. 물리 HBA 어댑터 링크 상태 및 에러 카운터 점검
$ esxcli storage san fc list
$ esxcli storage core adapter list
스크립트
ESXi 호스트에 연결된 모든 스토리지 디바이스의 다중 경로(Multipath) 상태를 전수 조사하여 비정상(Dead 또는 Degraded) 경로를 찾아내고, 현재 적용된 패스 선택 정책(PSP)이 비효율적인 Fixed인지 검증하여 Round Robin으로 변경하는 권장 설정을 제공하는 쉘 스크립트입니다.
#!/bin/sh
# check_esxi_storage_paths.sh - Diagnose ESXi Datastore Latency and Storage Multipath Health
echo "=========================================="
echo " [ESXi 스토리지 경로 및 지연 상태 진단]"
echo "=========================================="
# 1. 스토리지 코어 어댑터(HBA) 상태 확인
echo -e "\n[1] 스토리지 HBA 어댑터 상태:"
esxcli storage core adapter list | awk '{printf " - %-10s | 드라이버: %-12s | 링크 상태: %s\n", $1, $3, $4}'
# 2. 비정상(Dead/Standby 누락) 스토리지 경로 탐색
echo -e "\n[2] 장애(Dead) 경로 점검:"
DEAD_PATHS=$(esxcli storage core path list 2>/dev/null | grep -B 2 -A 3 "State: Dead")
if [ -n "$DEAD_PATHS" ]; then
echo " [치명적 경고] 연결이 끊어진(Dead) 스토리지 경로가 감지되었습니다!"
echo "$DEAD_PATHS" | grep -E "UID|State|Adapter" | sed 's/^/ /'
echo " -> SAN 스위치 조닝(Zoning), 광케이블(SFP), 스토리지 컨트롤러 점검이 시급합니다."
else
echo " [정상] 모든 물리 스토리지 경로가 활성(Active) 상태입니다."
fi
# 3. LUN별 NMP 정책 및 단일 패스 집중 여부 점검
echo -e "\n[3] 디바이스별 멀티패싱 정책(PSP) 점검:"
DEVICES=$(esxcli storage nmp device list 2>/dev/null | grep -E "^naa\.|^eui\.")
for DEV in $DEVICES; do
DEV_NAME=$(echo "$DEV" | tr -d ':')
PSP=$(esxcli storage nmp device list -d "$DEV_NAME" 2>/dev/null | grep "Path Selection Policy:" | awk -F': ' '{print $2}')
ACTIVE_PATH_COUNT=$(esxcli storage core path list -d "$DEV_NAME" 2>/dev/null | grep -c "State: Active")
printf " - 디바이스: %-40s | 정책: %-15s | 활성경로: %s개\n" "$DEV_NAME" "$PSP" "$ACTIVE_PATH_COUNT"
if [ "$PSP" = "VMW_PSP_FIXED" ] && [ "$ACTIVE_PATH_COUNT" -gt 1 ]; then
echo " [주의] 다중 경로가 존재하지만 VMW_PSP_FIXED 적용 중으로 부하 분산이 되지 않습니다."
echo " -> 권장 변경: esxcli storage nmp device set -d ${DEV_NAME} --psp VMW_PSP_RR"
fi
done
# 4. vmkernel.log 내 최근 10분간의 스토리지 지연 및 재시도 이벤트 집계
echo -e "\n[4] 스토리지 I/O Abort 및 타임아웃 이벤트 검사:"
ABORT_COUNT=$(tail -n 1000 /var/log/vmkernel.log | grep -ic "aborting command\|task abort\|resetting device")
if [ "$ABORT_COUNT" -gt 0 ]; then
echo " [위험] 최근 로그에서 스토리지 명령 취소(Abort) 이벤트가 ${ABORT_COUNT}건 감지되었습니다."
echo " -> 스토리지 큐(Queue Full) 또는 심각한 패브릭 패킷 유실 가능성 높음."
else
echo " [정상] 최근 명령 취소 및 타임아웃 이벤트가 없습니다."
fi
echo -e "\n=========================================="
echo " [진단 완료]"
echo "=========================================="
해설
가상화 인프라에서 ESXi 데이터스토어 I/O 지연 시간(Latency)이 급증하면 전체 VM의 디스크 I/O 응답 속도가 멈추고 심한 경우 OS 커널 패닉이나 블루스크린이 발생합니다. 이를 트러블슈팅할 때는 esxtop의 대기 시간 지표를 세분화하여 문제의 계층(ESXi 커널 vs SAN 패브릭/스토리지 LUN)을 정확히 분리해야 합니다.
1. esxtop 스토리지 레이턴시 4대 핵심 지표
| 지표명 | 측정 위치 | 정상 기준치 | 급증 시 원인 |
|---|---|---|---|
KAVG/cmd |
ESXi 커널 내부 대기 시간 | $< 2\text{ms}$ | ESXi 호스트 내부 큐 병목(HBA 큐 깊이 초과), 호스트 CPU 리소스 고갈 |
DAVG/cmd |
물리 디스크/스토리지 컨트롤러 응답 시간 | $< 15\text{ms}$ (SSD/NVMe $< 3\text{ms}$) | 스토리지 어레이 과부하, 백업 작업(I/O 스톰), RAID 재빌드, SAN 패브릭 지연 |
GAVG/cmd |
게스트 OS가 체감하는 총 지연 시간 | $< 20\text{ms}$ | $GAVG = KAVG + DAVG$. 둘 중 높은 쪽이 총 지연을 견인함 |
QAVG/cmd |
드라이버 큐(Queue) 대기 시간 | $0\text{ms}$ (0에 수렴해야 함) | HBA/스토리지 큐가 꽉 차서 커널에서 대기열에 쌓아두는 상태 |
- KAVG가 낮고 DAVG가 매우 높다면: ESXi 호스트는 정상이며, 외장 스토리지 컨트롤러 자체의 병목이거나 SAN 스위치/케이블 문제입니다.
- KAVG와 QAVG가 매우 높다면: 스토리지 LUN의 큐 깊이(Queue Depth)가 작아 ESXi 호스트 단에서 명령이 밀리고 있는 상태입니다.
2. 주요 발생 원인
- 스토리지 경로 단절(Dead Path) 및 잦은 페일오버:
- SAN 스위치의 SFP 모듈 불량이나 광케이블 꺾임으로 특정 패스가 끊겼을 때, ESXi가 I/O 타임아웃(기본 30~60초)을 기다린 후 다른 패스로 페일오버하면서 일시적인 대기 시간 스파이크가 발생합니다.
- 부적절한 멀티패싱 정책 (Fixed vs Round Robin):
- 다중 패스(예: 4개 포트)가 연결되어 있음에도 정책이
VMW_PSP_FIXED로 되어 있으면 1개의 액티브 패스로만 모든 VM의 I/O가 집중되어 특정 컨트롤러/포트가 포화됩니다.
- 다중 패스(예: 4개 포트)가 연결되어 있음에도 정책이
- Round Robin 전환 주기(I/O Limit) 미최적화:
- 기본 Round Robin 정책은 단일 패스로 1,000번의 I/O를 보낸 후에야 다음 패스로 전환합니다. 이를 1번 단위(
iops=1)로 낮추지 않으면 트래픽 급증 시 순간적인 패스 쏠림 현상이 발생합니다.
- 기본 Round Robin 정책은 단일 패스로 1,000번의 I/O를 보낸 후에야 다음 패스로 전환합니다. 이를 1번 단위(
3. 단계별 해결 방법
1) 다중 경로 정책을 Round Robin(RR)으로 변경
# 특정 디바이스의 정책을 Round Robin으로 변경
esxcli storage nmp device set -d naa.60050768028085a12000000000000101 --psp VMW_PSP_RR
# 향후 신규 LUN 연결 시 기본 정책을 Round Robin으로 지정 (기본 SATP 룰 변경)
esxcli storage nmp satp rule add -s VMW_SATP_ALUA -P VMW_PSP_RR
2) Round Robin 전환 임계값(IOPS)을 1로 튜닝
모든 패스에 균등하게 I/O를 1건씩 분산시켜 대기 시간을 획기적으로 줄입니다.
# 1000회 기본값 -> 1회 I/O마다 패스 전환 (iops=1)
esxcli storage nmp psp roundrobin deviceconfig set -d naa.60050768028085a12000000000000101 --type iops --iops 1
3) HBA 어댑터 큐 깊이(Queue Depth) 확인 및 상향
QAVG가 지속적으로 발생한다면 HBA 드라이버 모듈 파라미터를 통해 큐 깊이를 64~128 수준으로 상향 조율합니다.
주의사항
- Active/Passive 스토리지에서의 무분별한 Round Robin 적용 금지:
- 스토리지가 ALUA(Asymmetric Logical Unit Access)를 지원하지 않는 순수 Active/Passive 컨트롤러인 경우, 무리하게 Round Robin을 적용하면 컨트롤러 간 LUN 소유권이 계속 핑퐁처럼 이동하는 트레스패스(Trespass / LUN Thrashing) 장애가 발생하여 서비스가 전면 마비될 수 있습니다. 반드시 스토리지 벤더 가이드를 확인해야 합니다.
- 광패브릭 CRC 에러(SAN Fabric Errors) 주기적 점검:
- ESXi 로그에
SCSI status: 0x2 / Check Condition에러가 반복된다면 SAN 스위치 관리 화면(Brocade, Cisco MDS)에서 해당 포트의CRC error및Link failure카운터가 증가하는지 점검해야 합니다.
- ESXi 로그에
- 스토리지 I/O 제어(SIOC) 활성화 고려:
- 특정 VM의 대량 백업이나 배치 작업으로 동일 데이터스토어를 공유하는 다른 업무 VM들이 피해를 입는 Noisy Neighbor 문제를 방지하기 위해 vSphere의 스토리지 I/O 제어(SIOC)를 활성화하여 지연 시간 임계치(예: 30ms) 초과 시 I/O 쉐어를 강제 적용하도록 구성하는 것이 안전합니다.