이 문서에서는 SR-IOV(단일 루트 I/O 가상화) 분할을 통해 가상화된 다른 유형의 컴퓨팅 디바이스(GPU, NPU 등)의 실시간 마이그레이션 기능 설계에 대해 설명합니다. WDDM 및 MCDM 드라이버 모델을 통한 분할을 지원하는 디바이스는 이제 가상화 제품의 필수적인 부분입니다. 따라서 실시간 마이그레이션을 지원하고 가상화 추상화가 리소스 할당을 변경해야 할 때 고객에게 미치는 영향을 최대한 안정적으로 유지하도록 돕는 것이 중요합니다. 이 문서에서는 이러한 디바이스의 빠른 마이그레이션 대해서도 설명합니다.
실시간 마이그레이션은 Windows 11 버전 24H2(WDDM 3.2)부터 지원됩니다. 일반적으로 기능을 노출하는 드라이버에 대한 GPU 패러가상화 (GPU-P) DDIs의 확장입니다. GPU-P 가상화 인터페이스를 구현하는 MCDM 드라이버는 선택적으로 triage 이벤트가 포함된 확장을 통해 이러한 라이브 마이그레이션 인터페이스를 구현할 수도 있습니다.
이 문서에서 "GPU"는 WDDM이든 MCDM이든 관계없이 GPU-P 가상화 프레임워크를 구현하는 디바이스와 GPU, NPU 또는 기타 다른 유형의 컴퓨팅 디바이스를 참조하기만 하면 됩니다.
리소스 마이그레이션의 종류 및 목적
리소스 마이그레이션은 가상화를 새 물리적 리소스로 이동하는 기능입니다. 다음을 포함하여 가상화된 실행을 이동할 수 있는 다양한 방법이 있습니다.
전원 강제 종료. 가상 마더보드의 전원을 직접 끄면 가상 리소스의 실행을 멈춥니다. powerhit-tolerant가 아닌 모든 애플리케이션은 작동 중인 데이터가 손실되고 모든 디바이스 상태가 초기화됩니다. 그런 다음 VHD(가상 하드 디스크)를 다른 호스트 머신에서 가상화하여 콜드 부팅할 수 있습니다.
부드러운 전원 차단. 이 전원 다운은 단순히 게스트 OS에 전원 요청을 전송한다는 점에서 하드 파워 다운과 다릅니다. 그런 다음 게스트 OS는 전원 차단 메커니즘을 애플리케이션에 배포하여 완전히 종료합니다. 애플리케이션은 이 알림을 사용하여 모든 데이터를 안전하게 저장하고 부팅 시 다시 시작하도록 등록할 수 있지만 각 애플리케이션의 프로그래밍에 따라 달라집니다. 소프트 파워 다운을 사용하려면 이 클린 종료 메커니즘을 지원하는 게스트 OS와 현재 상태를 저장하고 다시 부팅 시 다시 시작하는 적절한 서비스가 필요합니다.
동면. 게스트 기원 기술을 통해 게스트 기기에서 모든 애플리케이션 프로세스를 고정하고, 디바이스 상태를 CPU 메모리로 이동한 후 모든 메모리를 스토리지로 전송하여 하드웨어의 전원이 꺼질 수 있도록 빠르게 시작하는 절전 상태로 전환할 수 있습니다. 그런 다음 다른 컴퓨터에서 VM 스토리지 VHD를 다시 시작하고, 메모리를 로드하며, 디바이스 상태를 복원하고, 프로세스가 재개될 수 있습니다. 최대 절전 모드는 이를 지원하는 게스트 OS에서만 사용할 수 있습니다. 게스트 안정성에 의존하는 상당히 침습적인 프로세스이지만 전원 다운 메커니즘이 제공하지 않는 상태로 애플리케이션 프로세스를 복원하는 메커니즘을 제공합니다.
빠른 마이그레이션(VM 저장 및 복원이라고도 함). 이 기술을 사용하면 VM이 일시 중지되고(vCPU 예약 중지) 새 물리적 리소스의 상태를 복원하는 데 필요한 모든 상태가 호스트 OS 내에 수집됩니다(VM의 메모리 및 모든 디바이스의 상태 포함). 그런 다음 이 상태는 모든 vCPU 컨텍스트가 로드된 VM을 만들고, 메모리를 VM 공간에 매핑하고, 디바이스 상태를 복원하는 새 호스트로 전송됩니다. 그런 다음 PowerOnRestore는 vCPU 실행을 다시 시작합니다. 이 기술은 게스트 OS와 독립적이며 게스트 환경에서의 실행에 의존하지 않으므로 최대 절전 모드보다 프로세스 및 디바이스 상태를 유지하는 것이 더 안정적입니다. VM 메모리가 많은 GB가 될 수 있고 전송 시간이 눈에 띄기 때문에 가상화 사용자는 상당한 가동 중지 시간을 알 수 있습니다.
실시간 마이그레이션. 가상화된 리소스가 여전히 활성 상태인 동안 콘텐츠를 전송할 수 있고 더러워지는 콘텐츠를 추적할 수 있는 경우 가상화를 활성 상태로 유지하면서 중요한 콘텐츠를 전송할 수 있습니다. 그런 다음 VM이 일시 중지되면 훨씬 적은 콘텐츠를 전송해야 하며 가상화가 실행되지 않는 시간을 최소화할 수 있습니다. 마이그레이션 중에 발생하는 모든 작업이 방해받지 않고 계속 발생하고 리소스 사용률에 미치는 영향이 현재 가능한 한 감소하므로 최종 사용자 영향은 최소화됩니다. 특히 중단 기한(TCP 및 외부 엔드포인트가 있는 다른 프로토콜 시간 제한과 같은 가상화 중단에 대한 외부 시간 제약 조건)을 최소화하거나 제거할 수 있습니다.
각 진행은 가상화의 물리적 할당 변경에 대한 일부(종종 주요) 고객 인식을 줄이거나 제거하므로 가상화가 점점 더 완전하고 투명해집니다. 인프라에 대한 고객 종속성을 구분하는 다른 기술(예: 호스트 크래시 격리)과 함께 가상화 솔루션을 할당 독립성 및 진정한 임시 컴퓨팅의 이상으로 이동합니다.
Large-Scale 디자인
실시간 마이그레이션은 원본 호스트에서 대상 호스트로 가상화 콘텐츠를 전송합니다. 가상화는 메모리, 컴퓨팅 및 스토리지를 포함할 수 있는 다양한 상태 저장 디바이스로 구성되며, 각각 원본의 디바이스에서 대상의 디바이스로 전송해야 하는 데이터가 있습니다. 클러스터에서 가상화를 관리하는 관리 에이전트는 호스트와 통신하여 기존 VM의 원본 마이그레이션(콘텐츠가 호스트를 떠날 때) 또는 새 VM으로 대상 마이그레이션(콘텐츠를 받기 위해)에 대한 오케스트레이션을 설정하도록 알릴 수 있습니다. 이 상호 작용의 주요 플레이어는 다음 다이어그램에 표시됩니다.
:
원본 호스트의 시대
다음 다이어그램에서는 원본 쪽 마이그레이션 상태를 보여 줍니다.
:
소스 측 부팅
호스트가 일반적으로 부팅되면 KMD는 다양한 초기화 호출을 통해 디바이스 기능을 커널에 보고합니다.
KMD가 DXGKQAITYPE_GPUPCAPS 데이터에 대한 DxgkDdiQueryAdapterInfo 호출을 받으면, DXGK_GPUPCAPS에 추가되어 있는 LiveMigration 기능 비트를 설정할 수 있습니다. KMD가 이 비트를 설정하면 드라이버가 실시간 마이그레이션을 지원한다는 것을 나타냅니다.
라이브 마이그레이션 지원의 필수 조건은 더티 비트 추적에서 설명한 대로 모든 GPU 로컬 메모리 세그먼트에서 수정된 VRAM 페이지를 추적하는 것입니다. 다른 DxgkDdiQueryAdapterInfo 호출을 통해서 지정된 다른 정보 유형에 대한 지원이 보고됩니다. 실시간 마이그레이션에 대한 지원을 보고하는 드라이버는 더티 비트 추적에 대한 지원도 보고해야 합니다. 실시간 마이그레이션을 지원하지만 더티 비트 추적은 잘못된 구성이며 Dxgkrnl 어댑터를 시작하지 못합니다.
온라인 가상 머신
호스트가 부팅되고 관리 스택이 온라인 상태가 되면 가상 머신 작업이 온라인 상태가 됩니다. VM 시작 및 중지에 대한 요청이 도착하기 시작하며 이러한 가상화에 프로젝션된 GPU-P vGPU가 표시되기 시작합니다.
성능이 뛰어난 더티 비트 평면 기능을 가정하면 Dxgkrnl VF(가상 함수)에 대한 VRAM 리소스를 예약한 후 DxgkDdiStartDirtyTracking호출합니다. 그러면 나중에 VF가 마이그레이션 시나리오에 참여하는 경우 시스템에서 VRAM 정리를 추적할 수 있습니다.
이 VM 시작은 인터럽트 테이블 액세스를 가로채서 인터럽트 지원을 가상화하기 시작하며, 이는 VM의 수명 동안 진행됩니다.
실시간 마이그레이션 보내기 준비
관리 스택은 컨트롤로 표시될 때 실시간 마이그레이션을 시작하기 위해 이벤트를 보내고, 마이그레이션 상태 컴퓨터 관리는 대상에서 vGPU를 다시 구성하기 위해 가상화(vGPU 파티션 구성 메트릭)의 수명 동안 변경할 수 없는 가상 디바이스에서 모든 상태를 수집합니다. 준비가 되면 전송 버퍼를 준비하고 전송 스택을 초기화하는 프로세스가 시작됩니다.
이 epoch는 도입된 DxgkDdiPrepareLiveMigration DDI에 대한 호출을 생성합니다. KMD는 VF에 대한 공정한 성능을 유지하면서, 호스트의 VRAM에서 더티 콘텐츠를 스트리밍할 수 있는 라이브 마이그레이션 기능을 제공하는 PF/VF 스케줄링 정책을 수립해야 합니다. 더티 추적이 비효율적인 것으로 보고되는 경우, 이 지점에서 더티 추적이 시작되기도 합니다.
실시간 마이그레이션 보내기
: 실시간 마이그레이션 보내기를 보여 주는
그런 다음 더러운 VRAM 전송의 활성 단계로 들어갑니다. 이 단계에서는 더티 비트플레인 DDI를 통해 호출하여 VF 프레임 버퍼의 스냅샷을 만든 다음, GPU에서 이전에 준비한 CPU 버퍼로 해당 페이지를 페이징합니다.
이 전송에는 VM 및 모든 가상 디바이스가 일시 중지되는 단계가 있습니다. VF의 게스트 스케줄링이 중지될 수 있으며, 이 시점에 PF가 콘텐츠 페이징을 완료할 수 있도록 가능한 추가 시간을 부여해야 합니다. VF와 vCPU가 모두 VM에서 일시 중지되므로 이 시점 이후에 마이그레이션되는 콘텐츠(CPU 또는 디바이스-로컬 메모리)가 더 이상 변경되지 않아야 합니다.
일시 중지된 마이그레이션 전송하기
더티 페이지의 마지막 반복은 일시 중지된 동안 전송됩니다. 이 시점에서 활성 상태에서 변경 가능하고 이전 준비에서 전송할 수 없었던 디바이스 및 드라이버 상태의 마지막 부분을 수집하기 위한 호출이 수행됩니다. 이 상태는 다른 쪽에 필요한 상태 재구성, 추적 구조 또는 일반적으로 대상 쪽에서 VF 상태 복원을 완료하는 데 필요한 모든 정보일 수 있습니다.
실시간 마이그레이션 중단
마지막으로, VM 및 모든 가상 디바이스가 상태를 새 물리적 실현으로 전송하면 원본 쪽에서 VM 잔재를 정리할 수 있습니다. 버퍼 및 기타 마이그레이션 상태가 지워지고 vGPU가 제거됩니다.
대상 호스트의 에포크
다음 다이어그램에서는 대상 쪽 마이그레이션 상태를 보여 줍니다.
: 대상 쪽 마이그레이션 상태를 보여 주는
대상 측 부팅
대상의 부팅은 원본과 동일하게 표시됩니다. 시스템 부팅은 전체 시스템에 대해 수행되며, 이는 수명 주기 내내 서로 다른 VF에서 원본과 대상 역할을 할 수 있습니다. 드라이버는 참여하려면 실시간 마이그레이션 지원을 지정하기만 하면됩니다.
실시간 마이그레이션 수신 준비
대상 쪽에서 VM은 마치 새 VM인 것처럼 시작하여 생성됩니다. VM 및 가상 디바이스가 만들어집니다. 이 만들기 프로세스에는 원본 쪽에서 만든 것과 동일한 매개 변수를 사용하여 만든 가상 GPU가 포함됩니다. 만든 후 유효성 검사 데이터가 수신되고 드라이버에 전달되어 대상 쪽이 VM을 복원하기 위해 원본과 호환되는지 확인합니다. 이 시점에서 드라이버 버전, 펌웨어 버전 및 대상 시스템 및 드라이버의 다른 주변 상태를 포함하여 이러한 호환성에 영향을 줄 수 있는 모든 것을 확인해야 합니다. 드라이버는 VF가 아직 활성화되지 않은 동안, 일반적으로 VF에 할당되는 모든 페이징의 시간 슬롯에 대해 PF가 액세스할 수 있도록 구성됩니다.
실시간 마이그레이션 수신
:
더티 페이지 데이터를 받는 것은 페이징 방향이 CPU 버퍼에서 VRAM으로 가는 것을 제외하고는 원본의 단계와 유사합니다. 모든 전송은 VF가 일시 중지되는 동안 수행되므로 전체 전송은 VF 예산 내에서 수행할 수 있습니다.
VM 시작 및 종료
모든 VRAM 마이그레이션이 완료되면 vGPU는 전송해야 하는 추가 상태(최종 변경 가능한 저장 데이터)를 설정할 기회를 얻습니다. 그런 다음 대상에서 VM을 시작하고 전송에 사용되는 버퍼를 포함하여 마이그레이션 상태를 중단합니다.
성능 목표
실시간 마이그레이션의 중요한 부분은 응답성입니다. 특히 외부에서 응답하지 않는 가상화의 가동 중지 시간을 최소화합니다(가상화 사용자 또는 추가 연결될 수 있는 엔드포인트에 대해). 많은 네트워크 스택 프로토콜은 원격 컴퓨터에서 매우 짧은 시간 제한을 가지고 있어 재시도/다시 설정이 실패하기 전에 연결이 끊기면 사용자에게 불편을 줄 수 있습니다. 일반적인 고정 목표로서 전송 및 시작에 대한 총 일시 중지 시간은 0.75초(750ms) 미만이어야 하며, 이로 인해 많은 일반적인 스택 시간 제한보다 연락이 끊기는 시간을 줄일 수 있습니다.
또한 활성 시스템의 성능 변경은 가능한 경우 다른 최종 사용자 중단을 트리거해서는 안 됩니다. 이러한 DDI를 사용하는 디바이스에서, 시스템은 예약된 시간 슬라이스를 늦추어 TDR 속도를 과도하게 증가시키지 않아야 합니다. 이제 대부분의 TDR은 긴 패킷이 아니라 디바이스가 멈춘 것으로 예상하며, 패킷을 실행하는 시간을 두 배나 세 배로 늘려도 대부분의 패킷이 길고 긴 시간 초과(초 단위)의 영향을 받지는 않을 것입니다. 그러나 전체적인 성능 관점에서 시간 제한을 트리거하지 않도록 주의해야 합니다.
디바이스 드라이버 인터페이스
일반적으로, 실시간 마이그레이션 DDI는 WDDM과 MCDM DDI의 일반적인 개념을 참조하며, 특히 GPU-P 가상화 DDI를 언급합니다.
hAdapter 일반적으로 이 드라이버가 관리하는 특정 디바이스를 나타내는 핸들 토큰을 나타냅니다. 시스템에 의해 열거된 여러 물리적 디바이스가 있는 시스템은 드라이버가 여러 hAdapter를 관리하도록 할 수 있으므로 hAdapter 특정 디바이스로 지역화됩니다.
vfIndex 참조되는 가상 함수/vDEV를 식별합니다. 특정 가상 디바이스로 지역화됩니다. 파티션 ID라고도 합니다.
DeviceLuid은 특정 가상 디바이스를 식별하며, UMED 인터페이스의 언어로 가상 디바이스 관리에서 사용됩니다.
SegmentId VRAM 예약과 같이 디바이스에 저장된 콘텐츠를 참조할 때 특정 VidMm 세그먼트 노출을 식별합니다.
인터페이스 정의에 대한 참고 사항
이 문서에서는 동적으로 크기가 조정된 구조를 참조합니다. 이러한 구조는 참조 페이지에서 다음과 같이 설명하는 동적 크기 배열을 통해 구현됩니다.
size_t ArraySize;
ElementType Array[ArraySize];
여기서 인터페이스는 구조의 앞부분에서 배열 크기를 전달하고, 인터페이스 개체의 구문 분석을 통해 배열이 제공될 경우 그 만큼의 요소를 반복합니다. 이러한 선언은 정적으로 크기가 조정된 조각을 표현하기 때문에 유효한 C/C++가 아닙니다. 먼저 정적 크기의 구조체에서 데이터를 읽고, 그 후에 코드에서 동적으로 구문을 분석합니다.
기기 시작 및 캡스 상태 보고
다음 기능이 추가됩니다: DXGK_GPUPCAPS.
- LiveMigration 상한은 실시간 마이그레이션 기능에 대한 드라이버 지원을 나타냅니다(일반적으로 DxgkDdiSetVirtualGpuResources2제외하면 이 문서에서 언급한 추가 DDI).
- ScatterMapReserve 상한은 향후 릴리스에서 추가될 DxgkDdiSetVirtualGpuResources2대한 드라이버 지원을 나타냅니다.
KMD는 OS가 DxgkDdiQueryAdapterInfo를 DXGKQAITYPE_GPUPCAPS 요청과 함께 호출할 때 이러한 기능을 채워야 합니다. OS는 DxgkDdiStartDevice 호출된 후와 어댑터가 GPU 분할을 지원하는 경우 디바이스 초기화 중에 캡을 쿼리합니다.
드라이버가 ScatterMapReserve 한도를 반환하는 경우 OS가 드라이버의 분산 예약 기능을 쿼리할 수 있도록 다음과 같은 연결된 구조로 추가된 DXGKQAITYPE_SCATTER_RESERVE 형식을 노출해야 합니다.
- DXGK_QUERYSCATTERRESERVEIN 대한 pInputData
- DXGK_QUERYSCATTERRESERVEOUT 에 대한 pOutputData
분산 페이징 지원
비연속적인 더티 페이지와 프레임 버퍼 간의 전송을 지원하기 위해 이 기능은 연속적인 물리적 주소로 지원되지 않는 GPU-VA 매핑을 활용하는 최초의 기능 중 하나입니다. 현재 페이징 인터페이스는 항상 페이지 테이블에서 지원되는 일반적인 가능성이기 때문에 이 지원을 위해 업데이트할 필요가 없습니다. 그러나 인접성에 대한 가정을 한 잠재적 구현 세부 사항은 이러한 변경으로 인해 노출될 가능성이 높습니다. 따라서 이 OS 메커니즘을 이해하고, 가상 페이징 인터페이스를 실행하는 방법을 이해하고, 페이징이 이 변경에 강력한지 확인하는 것이 중요합니다.
특히 TransferVirtual 인터페이스는 이제 프레임 버퍼에 연속적으로 매핑되지 않은 VA 범위를 전달합니다.
실시간 마이그레이션 송신 측 시작
시스템이 마이그레이션의 라이브 구성 요소를 시작하면 추가된 DxgkDdiPrepareLiveMigration DDI를 호출해야 합니다. 이 호출은 이 에포크가 시작되었음을 드라이버에게 통지하고, 마이그레이션에 대한 VF 스케줄링 정책을 구성할 수 있도록 하며, PF 페이징에 대해 일부 여유 및 마이그레이션 VF 자원을 할당해야 합니다.
Dxgkrnl KMD의 DxgkDdiSaveImmutableMigrationData DDI를 호출하여 대상 쪽에서 복원할 디바이스에 대한 정보를 수집합니다.
시스템이 변경할 수 없는 데이터 및 유효성 검사 데이터를 수집하고 보내면 더티 송신의 기본 반복 루프가 시작됩니다.
반복 저장/보내기
개요 섹션에 설명된 대로 반복된 저장 작업은 DxgkDdiQueryDirtyBitData 사용하여 각 반복 시작 시 VF에 대한 현재 더티 비트플레인을 스냅샷하고 표준 DXGK_OPERATION_VIRTUAL_TRANSFER 작업을 사용하여 보고된 더티 페이지를 페이징합니다. 이 작업이 더티 추적 기능에서 무시할 수 있는 성능 영향이 아니라고 보고한 디바이스에서 발생하는 경우 시스템의 반복 컨트롤은 먼저 더티 추적을 사용하도록 설정한 다음, 더티 비트플레인을 쿼리하는 첫 번째 호출 전에 전체 프레임 버퍼를 전송합니다.
가상 전송의 경우, 주된 업데이트된 동작은 매핑이 연속적인 VA에서 연속적인 PA로 되지 않는다는 것입니다. 대신, 매핑 내에 PA의 연결이 끊긴 페이지가 있을 수 있습니다. 그렇지 않으면 동작은 원래 페이징 및 더티 비트플레인 추적 설명서에 설명된 대로 수행되며 이 기능은 추가되지 않습니다.
라이브 마이그레이션 송신 쪽 종료
마이그레이션이 끝나면 시스템은 아직 전송되지 않은 상태 다시 빌드 및 추적을 완료하는 데 필요한 모든 디바이스 및 드라이버 상태를 수집해야 합니다. 이 데이터는 이전 마이그레이션 데이터의 불변성 요구 사항에 맞지 않으며 VRAM 더티 콘텐츠가 아니므로 전송할 수 없습니다. Dxgkrnl 추가된 DxgkDdiSaveMutableMigrationData DDI를 호출합니다. 이 DDI의 사용법은 DxgkDdiSaveImmutableMigrationData와 비슷합니다.
결국 이 VF에서 마이그레이션 구성이 더 이상 필요하지 않은 경우 DxgkDdiEndLiveMigration 호출됩니다. 모든 스케줄링 및 상태는 비이동성 구성으로 돌아가야 합니다.
실시간 마이그레이션 수신 측 시작
변경할 수 없는 데이터가 수신 쪽에 들어오면 시스템은 DxgkDdiRestoreImmutableMigrationData호출을 통해 KMD에 직접 전달합니다.
이 DDI는 현재 일시 중지된 VF에 대해서만 호출해야 합니다.
반복 복원/받기
다시 말하지만, 분산 페이징은 반복적인 방식으로 작동하지만 이번에는 대상의 더러운 비트 평면이 페이징에 의해 생성되기 때문에 VF에서 예약된 프레임 버퍼에 연결된 더티 비트플레인을 검사하기 위한 호출이 없습니다. 페이징 방향이 반전됩니다. 수신된 버퍼의 콘텐츠가 VRAM으로 전송되고 페이지 배치가 결정됩니다.
실시간 마이그레이션 종료 수신 쪽
마이그레이션이 종료되면 수신 쪽 시스템은 드라이버의 DxgkDdiRestoreMutableMigrationData 함수를 복원할 최종 상태 패키지를 호출합니다. 이 패키지는 드라이버가 자신의 상태 복구 및 추적을 위해 전달해야 할 모든 콘텐츠와 VF 상태의 남은 복구를 위해 필요한 콘텐츠를 제공해야 합니다.
이 DDI는 현재 일시 중지된 VF에 대해서만 호출해야 합니다.
이 호출 후 시스템은 KMD의 DxgkDdiEndLiveMigration 함수를 호출하여 대상 측이 일반 VF 일정 복원을 포함하여 실시간 마이그레이션과 관련된 상태를 정리할 수 있도록 합니다.
UMED와의 통신
UMED(사용자 모드 에뮬레이션 DLL) 인터페이스는 실시간 마이그레이션 중에 콘텐츠를 저장하고 유효성을 검사하는 기능을 노출하기 위해 IGPUPMigration 인터페이스로 확장됩니다.
HRESULT SaveImmutableGpup(
[in] PLUID DeviceLuid,
[in,out] UINT64 * Length,
[in,out] BYTE * SaveBuffer
);
HRESULT RestoreImmutableGpup(
[in] PLUID DeviceLuid,
[in] UINT64 Length,
[in] BYTE * RestoreBuffer
);
KMD가 유사하게 호출되는 실시간 마이그레이션 준비 작업 중에 UMED는 환경에서 UMED 수준에서 마이그레이션을 지원하는 마이그레이션 또는 유효성 검사를 위해 UMED를 준비하는 데 유용할 수 있는 모든 정보를 보낼 수 있습니다. UMED에 사용되는 표준 인터페이스 계약(스레딩 및 프로세스 컨텍스트, 제한된 OS 노출 등)을 준수하는 선택적 인터페이스입니다. 호출 패턴은 KMD DD를 모방하고 2단계 저장을 사용합니다. 이러한 호출에는 다른 저장/복원 UMED 인터페이스와 같은 상태 플래그가 없습니다. 디바이스 및 해당 LUID의 수명 동안 유효하고 일정해야 하므로.
UMED의 변경 가능한 상태는 기존 저장/복원 인터페이스에서 전송됩니다. 과거에는 이 인터페이스가 GPU-P 드라이버로 실행되지 않도록 차단되었지만 KMD에서 LiveMigration대한 지원을 보고할 때 차단이 해제되었습니다. 이러한 UMED 설명선 함수 및 KMD 기능의 연결은 의도적인 것입니다. 실시간 마이그레이션은 시스템에서 이러한 디바이스의 가상화를 위한 빠른 마이그레이션을 구현하는 방법입니다. 동일한 작업 시퀀스가 수행되며 활성 전송이 없는 실시간 마이그레이션의 특수한 경우로 빠른 마이그레이션(저장/복원)을 생각할 수 있습니다. 저장/복원을 지원하는 UMED에는 라이브 마이그레이션 DDI(드라이버 인터페이스)를 지원하는 KMD가 필요합니다. 마찬가지로 UMED는 IGPUPMigration 인터페이스를 인식하고 KMD가 실시간 마이그레이션되기 전에 설계에 필요한지 여부를 평가해야 합니다.
인터럽트 가상화
마이그레이션 중에 기본 하드웨어가 변경됨에 따라 MSI-X 테이블 액세스를 올바르게 서비스하려면 게스트 인터럽트 관리의 물리적 주소를 가상화해야 합니다. UMED는 실시간 마이그레이션을 지원하는 모든 드라이버에 대해 MSI-X 인터럽트 테이블을 가로채야 합니다. 메시지 상한 주소 및 메시지 주소 필드에 대한 모든 읽기 또는 쓰기는 실제 하드웨어 값에 매핑해야 합니다. Dxgkrnl 가상화된(또는 게스트) 주소의 매핑을 유지하고 호출 스택에 필요한 경우 대체를 수행합니다.
OS는 테이블이 읽거나 쓰는 게스트 물리적 주소의 가상화/매핑을 관리하며, 실제 인터럽트 서비스에 필요한 호스트 물리적 주소를 사용하여 게스트 쪽을 참조할 수 있습니다. 이 일반적인 경로는 별도의 UMED 구현 또는 커널 전달이 필요하지 않으며 OS가 테이블을 가로챌 때 OS가 UMED에 알리지 않습니다. UMED에 대한 유일한 요구 사항은 테이블의 BAR 페이지에 대해 디바이스에 대한 완화를 설정해야 한다는 것입니다.
그러나 커널에서 Dxgkrnl KMD가 실제 쓰기를 서비스하려고 합니다. KMD는 추가된 DxgkDdiWriteVirtualizedInterrupt 콜백 함수를 구현함으로써 이를 수행합니다.
UMD는 값비싼 커널 점프가 필요하지 않도록 쓰기(가상화/게스트 번역 형식)를 로컬로 추적하기 때문에 읽기가 필요하지 않습니다. 이 추적은 가상 디바이스로 마이그레이션됩니다.
DDI 동기화 및 IRQL 컨텍스트
| DDI | 동기화 수준 | IRQL |
|---|---|---|
| DxgkDdiPrepareLiveMigration | 0 | 수동적 |
| DxgkDdiEndLiveMigration | 0 | 수동적 |
| DxgkDdiSaveImmutableMigrationData | 0 | 수동적 |
| DxgkDdiSaveMutableMigrationData | 0 | 수동태 |
| DxgkDdiRestoreImmutableMigrationData | 0 | 수동적 |
| DxgkDdiRestoreMutableMigrationData | 0 | 수동태 |
| DxgkDdiWriteVirtualizedInterrupt | 0 | 수동적 |
| DxgkDdiSetVirtualGpuResources2 | 0 | 수동 |
| DxgkDdiSetVirtualFunctionPauseState | 0 | 수동적 |
| IGPUPMigration::SaveImmutableGpup | 0 | 수동적 |
| IGPUPMigration::RestoreImmutableGpup | 0 | 수동적 |
VF 예약에 대한 중요한 고려 사항
전송의 효율성은 PF에 대한 페이징 전송 예약에 의해 강력하게 결정됩니다. PF가 버스를 포화시키고 최상의 처리량을 얻기 위해 장치의 페이징 엔진에 더 많이 액세스할수록, 전송의 전반적인 성능이 향상되고 특히 일시 중지된 전송에서 그 효과가 두드러집니다. 지정된 시간에 캡처하고 전송할 수 있는 콘텐츠가 많을수록 더 좋습니다. 적어도 네트워크 채도까지.
예약 변경이 페이징 엔진에만 영향을 주며 다른 디바이스 리소스에는 영향을 주지 않는 것이 좋지만, 모든 VF 예약 디자인에서 이를 허용하지는 않습니다. 최소한 다음의 예약이 필요합니다.
- 마이그레이션 중인 VF 또는 할당되지 않은 VF 일정에서만 예산을 가져옵니다.
- 컴퓨터의 다른 가상화에 대한 성능이 저하되지 않습니다.
VF가 전송 전체 동안 일시 중지되고 전체 예산이 사용 가능하므로, 대상 측에서는 이러한 조건을 훨씬 더 쉽게 충족할 수 있습니다. 원본 쪽에서는 마이그레이션 요구 사항과 VM 요구 사항의 분산이 필요하며, 궁극적으로 일시 중지 전송 목표를 충족해야 합니다.