openstack + kvm을 실행 중이고 openstack에서 VM을 빌드할 때 기본 CPU 토폴로지는 vCPU 수 = 소켓 수입니다.
예:
32vCPU로 VM을 생성하면 내 lscpu
모습은 다음과 같습니다.
# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 32
On-line CPU(s) list: 0-31
Thread(s) per core: 2
Core(s) per socket: 1
Socket(s): 16
내 게스트 VM에는 소켓당 1개의 코어와 2개의 스레드가 있는 16개의 소켓이 있다고 합니다. 예, 현실 세계에서는 마더보드에 16개의 소켓을 갖는 것이 거의 불가능하므로 문제는 Linux 커널입니다. CPU 토폴로지를 기반으로 스케줄링 결정을 내리고 있습니까?
게스트 성능에 좋은 최고의 CPU 토폴로지가 무엇인지 이해하려고 노력 중입니다.
더 많은 소켓과 더 많은 코어?
편집하다
저는 CPU 고정, 호스트용 pCPU 예약, HugePage, SRIOV 등과 같은 OpenStack 성능에 대한 모든 모범 사례를 따릅니다.
답변1
아니요, Linux는 소켓에 관심이 없습니다. 확인하다CPU 토폴로지에 대한 Kernel.org 문서. 이 관련 구절을 통해 상황이 명확해져야 합니다.
소켓은 소프트웨어와 아무 관련이 없기 때문에 커널은 물리적 소켓의 개념에 신경 쓰지 않습니다. 전기기계 부품입니다. 과거에는 소켓에 항상 단일 패키지(아래 참조)가 포함되어 있었지만 MCM(멀티 칩 모듈)의 출현으로 소켓은 여러 패키지를 수용할 수 있습니다.
OpenStack은 기본적으로 소켓 수를 vCPU 수와 동일하게 만듭니다. ~에서오픈스택 위키여기에 이 구절이 있습니다(강조):
OpenStack의 각 가상화 드라이버에는 게스트 가상 머신에서 볼 수 있는 CPU 토폴로지를 정의하는 고유한 방법이 있습니다. libvirt 드라이버는 모든 vCPU를 하이퍼스레딩 없이 코어 1개가 있는 별도의 소켓으로 노출합니다.
UNIX 운영 체제는 최대 총 논리 CPU 수까지 노출된 모든 CPU 토폴로지를 기꺼이 사용합니다. 즉, 다른 토폴로지를 선택하면 성능에 영향을 미칠 수 있습니다. 예를 들어 하이퍼스레드 2개는 일반적으로 코어 또는 소켓 2개와 성능이 동일하지 않으므로 운영 체제 스케줄러에는 작업 배치를 처리하는 특수 논리가 있습니다. 따라서 호스트에 2개의 코어와 2개의 스레드가 있는 CPU가 있고 두 개의 작업을 실행하려는 경우 하나의 코어 내의 다른 스레드에 배치하는 대신 다른 코어에 배치하려고 합니다. 따라서 4개의 소켓이 게스트에게 표시되면운영 체제는 제한된 스레드 리소스에 대한 경합을 피하기 위해 최적의 스케줄러 배치 결정을 내리지 않습니다..
따라서 Linux 커널 설명서와 Openstack 설명서의 정보가 충돌합니다. Linux 커널 문서에 따르면 이제 다중 칩 모듈이 있으므로 소켓은 전체적인 체계에서 의미 없는 용어입니다. 그러나 OpenStack은 UNIX 스케줄러가 작업을 실행하기 위해 "논리적 코어"보다는 "물리적 코어"를 사용하는 것을 선호하며 각 코어를 자체 소켓으로 처리해야 하는 제약에 직면한다는 점을 지적하는 것 같습니다. 그러나 이는 OpenStack 또는 VM의 확장성을 설명하지 않습니다. OpenStack이 서버 클러스터에서 실행 중인 경우 코어를 소켓 1개로 제한하는 것이 합리적입니까?
그럼 무엇이 중요한가?너가상 머신의 가상 토폴로지가 물리적 토폴로지와 일치합니까? 물리적 토폴로지는 "클라우드"입니까, 아니면 여러 서버의 클러스터에 있습니까?