토폴로지가 선언되지 않은 경우 가상 머신에 잘못된 수의 vCPU가 할당되는 이유는 무엇입니까?

토폴로지가 선언되지 않은 경우 가상 머신에 잘못된 수의 vCPU가 할당되는 이유는 무엇입니까?

저는 Xeon E5-2680v2 @ 2.8GHz CPU 2개가 장착된 MPU 시스템에서 kvm을 실행하고 있습니다. 내 가상 머신은 모두 Windows 머신이며 주로 버전 10입니다. libvirtd는 버전 5이지만 이전 버전에서도 설명된 문제가 있었습니다.

에 관해서는CPU 모드, 가상 머신이 CPU의 전체 기능 세트를 사용할 수 있도록 "호스트 통과" 구성을 사용합니다.

<vcpu placement='static'>6</vcpu>
<cpu mode='host-passthrough' check='partial'/>

자, 이것이 내가 조금 길을 잃은 곳입니다. 위와 같이 6개의 vCPU로 VM을 구성하고 토폴로지를 지정하지 않는다고 가정하면(유효한 접근 방식인 것 같음) Windows VM에서는 총 2개의 소켓과 2개의 가상 프로세서에만 액세스할 수 있다고 주장합니다. 이는 단순히 표시 내용의 문제가 아니라 성능에 명확히 반영됩니다.

토폴로지를 지정하고 위 줄을 다음과 같이 변경하면 다음과 같습니다.

<vcpu placement='static'>6</vcpu>
<cpu mode='host-passthrough' check='partial'>
   <topology sockets='1' cores='6' threads='1'/>
</cpu> 

이제 Windows VM은 올바른 vCPU 수를 인식하고 이에 따라 성능이 향상됩니다.

소켓, 프로세서 및 스레드가 배포되는 방식에 따라 토폴로지가 다를 수 있다는 것을 이해하지만 토폴로지를 지정하지 않으면 올바른 총 vCPU 수가 가상 머신에 제공되지 않는다는 것이 이상해 보입니다.

지금은 제대로 작동하고 있어 기쁘지만, 이 문제가 존재하는 이유와 문제를 해결하기 위한 최선의 접근 방식을 선택했는지 여부를 더 잘 이해하고 싶습니다.

답변1

여기에 질문한 지 1년이 넘었는데 이미 답을 얻었을 수도 있습니다.

libvirt 자체 홈페이지에서는 확인된 정보를 찾을 수 없지만,오픈스택 위키그것은 말한다:

libvirt 드라이버는 모든 vCPU를 하이퍼스레딩 없이 코어 1개가 있는 별도의 소켓으로 노출합니다.

libvirt 프로젝트 자체에서 이러한 명확한 설명을 보는 것은 좋지만, 이는 질문에서 언급한 내 관찰에 의해 확증되는 것 같습니다. 그렇다면 내 Windows 10 Pro VM이 올바른 수의 vCPU를 표시하지 않는 이유는 분명합니다. Windows 10 Pro는 2개의 물리적 소켓으로 제한됩니다.이 위키피디아 기사. libvirt가 6개의 소켓을 생성한다고 말해도 무방합니다. 그 중 Windows 10 Pro에서는 2개만 허용합니다. 이는 제가 설명하는 동작을 설명합니다.

관련 정보