ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Interrupt Remapping
    VMware/vSphere 2018. 5. 1. 22:48

    iovDisableIR 값과 관련하여 위 KB의 장애 상황을 겪었다.

    단순히 Work-around로 'Kernel 파라미터 값에서 iovDisableIR=false 로 변경하시면 됩니다.' 라고 전달하면 끝이겠지만 위 KB 내용에서 명시하는 Interrupt Remapping 이나 MSI-X에 대해지식이 없기 때문에 몇 가지 확인해 봤다.

    1. Interrupt 란 ?
    기본적으로 '인터럽트'에 대해서는 알기 때문에 간단히 설명하겠다. 프로세서가 순차적으로 작업을 처리 중인 상황에서 처리 중인 작업을 일시적으로 중단하고 우선적으로 먼저 처리해줘야 할 긴급한 작업을 인터럽트라고 한다.
    << 그림1. 인터럽트 처리 >>


    2. NMI ?
    인터럽트의 종류는 발생 원인에 따라 '외부 인터럽트', '내부 인터럽트'로 나눌 수 있고 인터럽트를 차단 가능 유무에 따라 'Maskable 인터럽트', 'Non Maskable
    인터럽트'로 나눠진다.
    차단 불 가능한 인터럽트가 바로 흔히 ESXi PSOD 발생 시 동반하는 NMI를 뜻한다.

    << 그림2. NMI로 인한 PSOD >>

    3. Interrupt Remapping ?
    하드웨어 지원 가상화 기능에 대해 생각해보자.
    대표적으로 Intel CPU 가상화 기능인 VT-x와, I/O Direct Mapping 기능인 VT-d가 떠오를 것이다.
    기존 x86 서버에 직접 OS가 올라갈 때에는 User / Kernel 영역 뿐 이였지만 가상화 Layer가 추가되면서 User-Guest / Kernel-Guest / Kernel-Hypervisor로 바뀌었다.
    이에 따라 기존에는 Binary 변환을 하던 작업을 VT-x에서 지원하는 vmx 전환을 통해 유연하게 Guest OS와 하이퍼바이저에서 CPU 제어권을 가져갈 수 있게 되었다.
    ( VT-x, VT-d 에 관한 내용은 추 후에 포스팅 할 예정이다. )

    어쨌든, 요약하면 하이퍼바이저 커널에서 수행하던 가상화에 연관 된 작업들을 Intel CPU에서 지원이 가능함으로써 커널의 부하를 덜어줄 수 있게 되었다.

    VT-d 역시 기존에 커널에서 수행하던 I/O 작업들을 더 이상 커널을 통하지 않고 Device에 직접 접근하여 처리하는 기능이다.

    << 그림3. Intel VT-d >>

    Interrupt Remapping 역시 VT-d에서 제공하는 기능 중 일부이며 위와 마찬가지로 Interrupt 제어를 Guest OS에 직접 할당하여 하이퍼바이저의 부하를 줄일 수 있다.

    4. MSI-X ? 
    맨 위 KB에서 명시되어 있지 않은 Work-around가 있는데 바로 디바이스 드라이버의 'msi-x disable' 이다.
    레거시 환경에서는 PCI 디바이스에서 핀 기반의 인터럽트 라인을 통해 인터럽트를 전송했으며 이 라인은 한정적이기 때문에 공유되었다.
    MSI는 Message Signalled Interrupts로 핀 기반의 라인이 아닌 내부 메세지 버스를 통해 인터럽트를 전송하며 최대 2048개의 인터럽트를 지원한다.

    Intel 문서를 보면 MSI-X 기능을 완전히 사용하려면 Interrupt Remapping이 활성화가 필요한 것으로 추측된다.

    << 그림 4. Interrupt Remapping과 MSI-X의 상관 관계 >>


    5. 요약

    KB에 명시되어 있는 vmkernel 로그를 확인해 보자.

    vmkernel.all:2018-03-10T15:00:00.352Z cpu14:33510)IntrCookie: 3429: Interrupt received on invalid vector (cpu 14, vector 7a); ignoring it.

    유효하지 않은 vector라고 하는데 여기서 vector는 아래에서 설명하는 Interrupt Vector 인 것으로 추측된다.
    아래 그림을 보면 Interrupt Service Routine (ISR)이 있는데 이는 인터럽트 발생 시 '어떤 작업을 실행할 것인지' 에 대한 목록이다. 
    그리고 Interrupt Vector은 이 ISR의 시작 주소를 나타내는 값이다.
    정리하자면 
    인터럽트 신호 발생 -> Vector 값 참조하여 ISR 주소 확인 -> 해당 ISR주소에 명시되어 있는 작업 수행

    << 그림5. 인터럽트 처리 루틴 >>




    VMware 문서만으로는 정확하게 분석을 할 수 없기 때문에 어디까지나 추측일 뿐 이며 잘못 된 정보가 있을 시 즉시 수정 하겠습니다.


    'VMware > vSphere' 카테고리의 다른 글

    VMKernel NIC Multi-homing Test  (0) 2019.01.27
    VMtools 설치 진행 중 Unmount 에러  (0) 2018.05.01
    hostd로 인한 ESXi 서비스 비 정상  (0) 2018.05.01
    ESXTOP cpu 메트릭 분석  (0) 2018.05.01

    댓글

Designed by Tistory.