Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ซอฟต์แวร์ >> เครื่องเสมือน

การเลือกจำนวน vCPUs และ Cores สำหรับเครื่องเสมือน

ตอนสร้าง VM ใน Hypervisors ต่างๆ (VMware, KVM, Hyper-V ฯลฯ) อาจพบว่า VM บางครั้งไม่เห็น Virtual Processor Sockets (vCPU) ที่มอบหมายทั้งหมด ในกรณีของผม มอบหมาย 8 vCPUs ให้ KVM VM และติดตั้ง Windows 10 เป็น Guest OS แต่ Windows Detect vCPUs นี้เป็น Processors แยกตัว (ไม่ใช่ Cores) และใช้ได้แค่ 2 ตัว

Windows 10 VM ใช้ได้แค่ 2 Cores

เปิด Windows Device Manager จะเห็น Allocated Cores ทั้งหมดมองเห็นเป็น 8 Virtual Processors แยกตัว QEMU Virtual CPU version 2.5+

การเลือกจำนวน vCPUs และ Cores สำหรับเครื่องเสมือน

แต่ Windows 10 Properties (Computer → Properties) และ Task Manager แสดงว่ามี QEMU Virtual Processors ใช้ได้แค่ 2 ตัว

การเลือกจำนวน vCPUs และ Cores สำหรับเครื่องเสมือน

หมายความว่า Windows 10 ใช้ได้แค่ 2 Cores ไม่ว่าเพิ่มมากน้อยแค่ไหน ขณะเดียวกัน VM ที่รัน Windows Server 2016 บน Hypervisor เดียวกัน เห็น 16 vCPUs ที่จัดสรรทั้งหมด

จำนวน Processors ที่ Windows รองรับ

ปัญหาคือ Desktop Windows Versions (Windows 10/8.1/7) มีข้อจำกัด จำนวน Physical Processors (Sockets) สูงสุด ที่ Computer ใช้ได้:

  • Windows 10 Home – 1 CPU
  • Windows 10 Professional – 2 CPU
  • Windows 10 Workstation – ถึง 4 CPU
  • Windows Server 2016 – ถึง 64 CPU

แต่ข้อจำกัดนี้ไม่เกี่ยวกับจำนวน Cores เพื่อเพิ่ม Performance ของ VM สามารถใช้ Processor ที่มี Cores มากกว่าได้ Hypervisors ส่วนใหญ่สามารถ Present vCPUs เป็น Processors, Processor Cores หรือ Threads ได้ หมายถึงแทน 8 vCPUs สามารถเพิ่ม 2 vCPUs (2 Sockets) พร้อม 4 Cores ต่อ Socket ได้ มาดูวิธี Assign Virtual Processors เป็น Cores ใน Hypervisors ต่างๆ และการ Bind กับ NUMA Architecture ที่ใช้ใน Processor สมัยใหม่

การจัดการ Virtual Core & vCPU ใน KVM

ใน KVM VM ที่รัน Windows 10 ของผม Virtual Cores ที่มอบหมายทั้งหมดถูกมองว่าเป็น Separate Processors

เพื่อให้ VM ใช้ CPU Resources ที่จัดสรรทั้งหมด VM ต้องเห็น 1 Processor 8 Cores, 2 vCPUs พร้อม 4 Cores ต่อ Socket หรือ 1 vCPU พร้อม 4 Cores ใน 2 Threads แทนที่จะเป็น 8 vCPUs ลองเปลี่ยนการจัดสรร Virtual Cores สำหรับ KVM VM

Shut Down VM:

# virsh shutdown w10testvm – โดย w10testvm คือชื่อ VM

แสดง XML Config ปัจจุบันของ KVM VM:

# virsh dumpxml w10testvm

ต้องการ Block ที่อธิบาย VM CPU Settings:

<vcpu placement='static'>8</vcpu>
<cputune>
  <shares>1000</shares>
</cputune>
<resource>
  <partition>/machine</partition>
</resource>
<os>
  <type arch='x86_64' machine='pc-i440fx-rhel7.6.0'>hvm</type>
  <bootmenu enable='yes'/>
</os>
<features>
  <acpi/>
  <apic/>
  <pae/>
</features>

เห็นว่าตั้ง 8 vCPUs ไว้ ลองเปลี่ยน Config:

# virsh edit w10testvm

เพิ่ม Block ต่อไปนี้หลัง </features>:

<cpu mode='host-passthrough' check='none'>
  <topology sockets='1' cores='4' threads='2'/>
</cpu>

โดย:

  • host-passthrough คือ Emulation Mode ที่ VM เห็น Physical Processor ของ Cluster Node
  • sockets='1' บ่งบอกว่ามี 1 vCPU (Socket)
  • cores='4' Processor มี 4 Cores ต่อ Socket
  • threads='2' แต่ละ Core มี 2 Threads

Save Config File และ Start VM Login เข้า Windows 10 Guest VM รัน Task Manager หรือ Resource Monitor ตรวจสอบว่า Windows เห็น Allocated Virtual Cores ทั้งหมด

การเลือกจำนวน vCPUs และ Cores สำหรับเครื่องเสมือน

Physical Processor ของ Host Intel(R) Xeon(R) Silver 4114 CPU แสดงใน System Properties แทน Virtual Processor

การเลือกจำนวน vCPUs และ Cores สำหรับเครื่องเสมือน

นี่คือวิธีที่แก้ปัญหา Heavy Load สำหรับ VM เพราะ 2 Cores ไม่พอสำหรับ Apps ทำงาน

การตั้งค่าจำนวน Cores ต่อ vCPU สำหรับ VMware VM

สามารถเปลี่ยนการ Present vCPU สำหรับ VMware VM ใน vSphere Client Interface ได้

  1. Shut Down VM และเปิด Settings
  2. Expand ส่วน CPU
  3. เปลี่ยน Config ให้ Guest OS เห็น 2 Processors พร้อม 4 Cores ต่อตัว เปลี่ยนค่า Cores per Socket เป็น 4 หมายถึง Guest OS จะเห็น 2 CPUs ที่มี 4 Cores ต่อ Socket (2 Sockets × 4 Cores);
    การเลือกจำนวน vCPUs และ Cores สำหรับเครื่องเสมือน
  4. Save Changes และ Run VM

Virtual Machine vCPU และ NUMA Architecture

ยังมีประเด็นการ Assign vCPUs และ Cores ให้ VM ที่ต้องเข้าใจ

ตอนกำหนด Cores Per Socket ต้องแน่ใจว่ามี NUMA Architecture (ใช้ใน CPU สมัยใหม่เกือบทุกตัว) ไม่แนะนำ ให้ Assign Cores Per Socket (และ Total vCPUs) ให้ VM มากกว่า Cores ที่มีบน Physical Socket (NUMA Node) หนึ่งตัว เมื่อวางบน Single Physical NUMA Node VM จะใช้ Fast Local RAM ที่มีบน NUMA Node นั้นได้ มิฉะนั้น Process จะต้องรอ Response จาก NUMA Node อื่น (ใช้เวลานานกว่า)

หาก Assign 2 Virtual Sockets ให้ VM Hypervisor อาจรันบน NUMA Nodes ต่างกัน ส่งผลต่อ VM Performance

หากจำนวน vCPUs ที่ต้องการมากกว่า Cores บน 1 Physical Socket (NUMA Node) ให้สร้างหลาย Virtual Sockets (Processors) พร้อม Cores ที่จำเป็น ไม่แนะนำให้ใช้ Odd Number ของ Processors (ดีกว่าเพิ่ม 1 vCPU)

สิ่งนี้ช่วยรักษา VM Performance

การเลือกจำนวน vCPUs และ Cores สำหรับเครื่องเสมือน

เช่น Config ที่แนะนำสำหรับ 2-Processor Host ที่มี 10 Cores ต่อ Socket (40 vCPUs รวม Hyper-Threading) ตอน Config vCPUs สำหรับ VM:

vCPU Number Needed Number of Virtual Sockets Number of Cores per Virtual Processor
1 1 1
……
10 1 10
11 Not Optimal
12 2 6
……
20 2 10

ใน Free ESXi Version ไม่สามารถสร้าง VM มากกว่า 8 vCPUs ได้

เช่น VM รัน Microsoft SQL Server 2016 Enterprise Edition ด้วย 16 vCPU (Config 8 Sockets with 2 Cores per Socket) จะมี Performance แย่กว่า VM Config 2 Sockets × 8 Cores per Socket
จำได้ว่าบาง Applications License ขึ้นอยู่กับจำนวน Physical Sockets (เช่น SQL Server รุ่นเก่า) บางครั้ง License 1 Multi-core Processor ก็คุ้มกว่า Multiple Processors ที่มี Cores น้อยกว่า

Modern Windows Server Versions มี Licensing แบบพิเศษใน Virtual Environment ยังมีประเด็น Processor Licensing ใน VMware vSphere อีกด้วย