การเลือกจำนวน vCPU และคอร์สำหรับเครื่องเสมือน
เมื่อสร้างเครื่องเสมือนในไฮเปอร์ไวเซอร์ต่างๆ (VMWare, KVM, Hyper-V ฯลฯ) คุณอาจเห็นว่าบางครั้งเครื่องเสมือนอาจไม่เห็นซ็อกเก็ตตัวประมวลผลเสมือน (vCPU) ทั้งหมดที่กำหนดให้กับเครื่อง ในกรณีของเรา 8 vCPU ถูกกำหนดให้กับเครื่องเสมือน KVM และติดตั้ง Windows 10 เป็นระบบปฏิบัติการแขก อย่างไรก็ตาม Windows ตรวจพบ vCPU เหล่านี้เป็นโปรเซสเซอร์แยกต่างหาก (ไม่ใช่คอร์) และสามารถใช้เพียง 2 ตัวเท่านั้น
เครื่องเสมือน Windows 10 ใช้เพียง 2 คอร์
หากคุณเปิด Windows Device Manager ขึ้นมา คุณจะมั่นใจได้ว่าแกนประมวลผลที่จัดสรรทั้งหมดจะมองเห็นเป็นตัวประมวลผลเสมือน 8 ตัวแยกกัน QEMU Virtual CPU เวอร์ชัน 2.5+
ในขณะเดียวกัน คุณสมบัติ Windows 10 (คอมพิวเตอร์ -> คุณสมบัติ) และตัวจัดการงานแสดงว่ามีตัวประมวลผลเสมือน QEMU เพียง 2 ตัวเท่านั้น
หมายความว่า Windows 10 สามารถใช้ได้เพียง 2 คอร์ ไม่ว่าคุณจะเพิ่มกี่คอร์ก็ตาม ในเวลาเดียวกัน เซิร์ฟเวอร์เสมือนที่ใช้ Windows Server 2016 บนไฮเปอร์ไวเซอร์เดียวกันสามารถเห็น vCPU ทั้งหมด 16 ตัวที่จัดสรรให้
จำนวนโปรเซสเซอร์ที่รองรับใน Windows
ปัญหาคือเวอร์ชัน Windows บนเดสก์ท็อป (Windows 10/8.1/7) มีข้อจำกัดเกี่ยวกับจำนวนตัวประมวลผลทางกายภาพ (ซ็อกเก็ต) สูงสุดที่คอมพิวเตอร์สามารถใช้ได้:
Windows 10 Home - 1 ซีพียู
Windows 10 Professional - 2 ซีพียู
เวิร์กสเตชัน Windows 10 - สูงสุด 4 CPU
Windows Server 2016 - สูงสุด 64 CPU
อย่างไรก็ตาม ข้อจำกัดนี้ไม่เกี่ยวข้องกับจำนวนคอร์ เพื่อปรับปรุงประสิทธิภาพของเครื่องเสมือนของคุณ คุณสามารถใช้โปรเซสเซอร์ที่มีคอร์มากขึ้น ไฮเปอร์ไวเซอร์ส่วนใหญ่สามารถจัดเตรียม vCPU เป็นโปรเซสเซอร์ แกนประมวลผล หรือแม้แต่เธรด หมายความว่าแทนที่จะเป็น 8 vCPU คุณสามารถเพิ่ม 2 vCPU (2 ซ็อกเก็ต) โดยมี 4 ต่อซ็อกเก็ต มาดูวิธีกำหนดตัวประมวลผลเสมือนเป็นคอร์ในไฮเปอร์ไวเซอร์ต่างๆ และวิธีผูกกับสถาปัตยกรรม NUMA ที่ใช้ในตัวประมวลผลสมัยใหม่
การจัดการ Virtual Core & vCPU ใน KVM
ในเครื่องเสมือน KVM ของฉันที่ใช้ Windows 10 แกนเสมือนที่กำหนดทั้งหมดจะถือเป็นโปรเซสเซอร์แยกต่างหาก
หากต้องการใช้ทรัพยากร CPU ทั้งหมดที่จัดสรรให้กับเครื่องเสมือน จะต้องเห็นโปรเซสเซอร์ 8 คอร์หนึ่งตัว, vCPU 2 ตัวที่มี 4 คอร์ในแต่ละตัว หรือ 1 vCPU ที่มี 4 คอร์ในสองเธรดแทนที่จะเป็น 8 vCPU มาลองเปลี่ยนการจัดสรรแกนเสมือนสำหรับเครื่องเสมือน KVM
ปิดเครื่องเสมือนของคุณ:
# virsh shutdown w10testvm
- โดยที่ w10testvm คือชื่อเครื่องเสมือนของคุณ
แสดงการกำหนดค่า XML ปัจจุบันของเครื่องเสมือน KVM:
# virsh dumpxml w10testvmเราต้องการบล็อกที่อธิบายการตั้งค่า VM CPU:
<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 vCPU ถูกตั้งค่าไว้ที่นี่ มาเปลี่ยนการกำหนดค่า:
# virsh edit w10testvmเพิ่มบล็อกต่อไปนี้หลัง :
<cpu mode='host-passthrough' check='none'>
<topology sockets='1' cores='4' threads='2'/>
</cpu>ที่ไหน :
host-passthroughเป็นโหมดการจำลองที่เครื่องเสมือนเห็นตัวประมวลผลทางกายภาพของโหนดคลัสเตอร์
sockets='1'ระบุว่ามีหนึ่ง vCPU (ซ็อกเก็ต)
cores='4'โปรเซสเซอร์มี 4 คอร์ต่อซ็อกเก็ต
threads='2'แต่ละคอร์มี 2 เธรด
บันทึกไฟล์การกำหนดค่าและเริ่มเครื่องเสมือน เข้าสู่ระบบ Windows 10 guest VM เรียกใช้ Task Manager หรือ Resource Monitor และตรวจสอบให้แน่ใจว่า Windows มองเห็นแกนเสมือนที่จัดสรรทั้งหมด
ขณะนี้มีการแสดงตัวประมวลผลทางกายภาพของโฮสต์ Intel(R) Xeon(R) Silver 4114 CPU แทนตัวเสมือนในคุณสมบัติของระบบ
นี่คือวิธีที่เราจัดการเพื่อแก้ปัญหาการโหลดจำนวนมากสำหรับ VM เนื่องจากสองคอร์ไม่เพียงพอสำหรับแอปที่จะทำงานได้อย่างถูกต้อง
การตั้งค่าจำนวนคอร์ต่อ vCPU สำหรับ VMWare VM
คุณสามารถเปลี่ยนวิธีการนำเสนอ vCPU สำหรับเครื่องเสมือน VMWare ในอินเทอร์เฟซ vSphere Client
ปิด VM และเปิดการตั้งค่า
ขยายส่วน CPU
เปลี่ยนการกำหนดค่า VM เพื่อให้ระบบปฏิบัติการเกสต์สามารถเห็นโปรเซสเซอร์ 2 ตัวโดยแต่ละตัวมี 4 คอร์ เปลี่ยนค่า Cores per Socket เป็น 4 หมายความว่าระบบปฏิบัติการเกสต์จะเห็นซีพียู 4 คอร์สองตัว (2 ซ็อกเก็ตที่มี 4 คอร์ต่อซ็อกเก็ต);
บันทึกการเปลี่ยนแปลงและเรียกใช้ VM
เครื่องเสมือน vCPU และสถาปัตยกรรม NUMA
มีบางแง่มุมเพิ่มเติมในการกำหนด vCPU และแกนให้กับเครื่องเสมือนที่คุณต้องเข้าใจ
เมื่อกำหนดจำนวนคอร์ต่อซ็อกเก็ต ตรวจสอบให้แน่ใจว่าคุณมีสถาปัตยกรรม NUMA (ใช้ใน CPU สมัยใหม่ส่วนใหญ่) ไม่แนะนำให้กำหนดคอร์ต่อซ็อกเก็ต (และจำนวน vCPU ทั้งหมด) ให้กับ VM มากกว่าจำนวนคอร์ที่มีอยู่บนซ็อกเก็ตจริงของคุณ (โหนด NUMA) เมื่อวางบนโหนด NUMA จริงเครื่องเดียว เครื่องเสมือนจะสามารถใช้ RAM ภายในเครื่องที่รวดเร็วซึ่งมีอยู่บนโหนด NUMA เฉพาะ มิฉะนั้น กระบวนการจะต้องรอการตอบกลับจากโหนด NUMA อื่น (ซึ่งใช้เวลานานกว่า)
หากคุณกำหนดซ็อกเก็ตเสมือนสองซ็อกเก็ตแยกกันให้กับ VM ไฮเปอร์ไวเซอร์สามารถเรียกใช้ซ็อกเก็ตเหล่านั้นบนโหนด NUMA ที่ต่างกันได้ มันจะส่งผลต่อประสิทธิภาพของ VM
หากจำนวน vCPU ที่ต้องการมีมากกว่าจำนวนคอร์บน 1 ซ็อกเก็ตจริง (โหนด NUMA) ให้สร้างซ็อกเก็ตเสมือน (โปรเซสเซอร์) หลายตัวด้วยจำนวนคอร์ที่จำเป็น นอกจากนี้ ไม่แนะนำให้ใช้โปรเซสเซอร์จำนวนคี่ (ควรเพิ่ม 1 vCPU)
ช่วยให้สามารถรักษาประสิทธิภาพของเครื่องเสมือนได้
ตัวอย่างเช่น ขอแนะนำให้ใช้การกำหนดค่าต่อไปนี้สำหรับโฮสต์ 2 โปรเซสเซอร์ที่มี 10 คอร์ต่อซ็อกเก็ต (มีทั้งหมด 40 vCPU รวมถึง ไฮเปอร์—เธรดดิ้ง) เมื่อคุณ กำหนดค่า vCPU สำหรับ VM:
| vCPU Number Needed | Number of Virtual Sockets in the VM Settings | Number of Cores per a Virtual Processor in the VM Settings |
| 1 | 1 | 1 |
| …… | ||
| 10 | 1 | 10 |
| 11 | Not optimal | |
| 12 | 2 | 6 |
| …… | ||
| 20 | 2 | 10 |
ในเวอร์ชัน ESXi ฟรี คุณไม่สามารถสร้าง VM ที่มี vCPU มากกว่า 8 ตัวได้
ตัวอย่างเช่น VM ที่ใช้ Microsoft SQL Server 2016 Enterprise Edition ที่มี 16 vCPU (ในการกำหนดค่า 8 ซ็อกเก็ตที่มี 2 คอร์ต่อซ็อกเก็ต) จะมีประสิทธิภาพต่ำกว่า VM ที่มี 2 ซ็อกเก็ต x 8 คอร์ต่อซ็อกเก็ต
โปรดจำไว้ว่าบางแอปพลิเคชันได้รับอนุญาตโดยขึ้นอยู่กับจำนวนของซ็อกเก็ตที่มีอยู่จริง (เช่นเดียวกับใน SQL Server เวอร์ชันก่อนหน้า) บางครั้งการให้สิทธิ์ใช้งานโปรเซสเซอร์แบบมัลติคอร์หนึ่งตัวให้ผลกำไรมากกว่าโปรเซสเซอร์หลายตัวที่มีจำนวนคอร์น้อยกว่า
เวอร์ชัน Windows Server ที่ทันสมัยได้รับอนุญาตในสภาพแวดล้อมเสมือนจริงด้วยวิธีพิเศษ นอกจากนี้ยังมีบางแง่มุมของสิทธิ์การใช้งานโปรเซสเซอร์ใน VMWare vSphere





