ทำไม Windows 7 VM ของฉันทำงานภายใต้ Linux 'KVM ไม่ได้ใช้โปรเซสเซอร์เสมือนทั้งหมด?


12

ทั้งหมด

ฉันมีปัญหาบนเซิร์ฟเวอร์ของฉันตั้งแต่ฉันโยกย้ายหนึ่งใน VM ของฉันจาก Windows 2008 Server เป็น Windows 7 (ขั้นสุดท้าย): แม้ว่าฉันได้กำหนดสี่คอร์ให้กับ VM และดูเหมือนว่าจะเห็นพวกเขาดูเหมือนว่าจะคิดว่ามัน มีสองแกน!

มันรู้จักโปรเซสเซอร์ของฉัน แต่ไม่ได้ใช้!

ใครสามารถบอกฉันว่าเกิดอะไรขึ้นที่นี่ ฉันคิดว่าอาจมีความไม่ลงรอยกันระหว่าง KVM และ Windows 7 แต่เนื่องจากเห็นโปรเซสเซอร์เสมือนฉันเริ่มคิดว่าไม่ ... มีเงื่อนงำอะไรบ้าง

นี่เป็นภาพหน้าจอของผู้จัดการกระบวนการที่แสดงเพียงสองแกนในกล่องเดียวกัน:

ผู้จัดการงาน


คุณแน่ใจหรือว่าไม่แสดง procs แบบดูอัลคอร์สองรายการให้คุณ
phoebus

@phoebus: ฉันสงสัยว่า แต่แล้วในทุกรุ่นของ windows ที่ฉันได้เรียกใช้การตั้งค่านี้ก่อนที่ฉันจะเห็นสี่แกนเมื่อมองในการตรวจสอบโปรเซสเซอร์ซึ่งฉันไม่ได้ที่นี่
jkp

เมื่อคุณพูดการตรวจสอบตัวประมวลผลคุณหมายถึงส่วนการตรวจสอบประสิทธิภาพของตัวจัดการงานหรือไม่ เนื่องจากตามภาพหน้าจอของคุณ แต่เพียงผู้เดียวคุณกำลังแสดงหลักฐานของโปรเซสเซอร์สองคอร์สองตัว หากเป็นเช่นนั้นคุณควรเห็นทั้ง 4 คอร์ในการตรวจสอบประสิทธิภาพ หากคุณไม่เช่นนั้นใช่บางสิ่งบางอย่างสกปรก
phoebus

@phoebus: ใช่ฉันหมายถึงส่วนการตรวจสอบประสิทธิภาพของตัวจัดการงาน ดูเหมือนจะ
ไร้สาระ

คำตอบ:


17

ฉันสงสัยว่าโปรเซสเซอร์กำลังถูกนำเสนอเป็นโปรเซสเซอร์แกนเดียวในซ็อกเก็ตแยกกัน Windows 7 ultimate รองรับระบบซ็อกเก็ตได้สูงสุด 2 ระบบดังนั้นจะใช้โปรเซสเซอร์ 2 ตัว

ฉันไม่ทราบว่าคุณสามารถกำหนดค่าให้ KVM แสดงตัวประมวลผลเป็น CPU แบบควอดคอร์เดี่ยวหรือซีพียูแบบดูอัลคอร์ 2 ตัวซึ่งควรแก้ไขปัญหาได้หรือไม่


1
ถูกต้อง. ATM ไม่มีวิธีในการเปลี่ยนโทโพโลยี
Luca Tettamanti

1
ว้าวฉันไม่รู้เรื่องนี้เลย ขอบคุณที่วางนิ้วลงบนปัญหาอย่างถูกต้อง @Luca: คุณรู้ไหมว่าการสนับสนุนดังกล่าวมีการวางแผน? ฉันใช้สองแกนพิเศษจริง ๆ หรือพวกเขาจะเสียเปล่า
jkp

2
@Luca: จริง ๆ แล้วตั้งแต่ qemu 0.12 คุณสามารถเปลี่ยนโทโพโลยี ฉันได้อัปเกรดส่วนประกอบ userspace kvm แล้ว แต่ฉันคิดว่าฉันต้องการเคอร์เนล mod ใหม่เพื่อให้สามารถใช้งานได้ .... อย่างไรก็ตามมันสามารถทำได้ :)
jkp

อ๊ะเจ๋ง ... ฉันควรอัพเกรดด้วย :)
Luca Tettamanti

โปรดทราบว่าคุณสามารถเรียกใช้โมดูลเคอร์เนล kvm ใหม่ล่าสุดในเคอร์เนลเก่าของคุณในปัจจุบัน คุณอาจจะต้องรวบรวมโมดูลด้วยตัวคุณเองเว้นแต่คุณจะสามารถหาที่เก็บของ distro ที่มีไบนารี่ให้คุณได้ แต่การสร้างโมดูลนั้นไม่ยากเกินไป
3dinfluence

21

บน libvirt 0.8.3 หากคุณพิมพ์:

virsh capabilities | grep topology

มันจะแสดงรายการทอพอโลยีของโฮสต์:

<topology sockets='1' cores='4' threads='1'/>

หมายเลขอ้างอิงถึงซ็อกเก็ตแกนต่อซ็อกเก็ตและเธรดต่อคอร์ เพิ่มบรรทัดนี้ในรายการ cpu ในไฟล์ xml เพื่ออนุญาตให้ windows ใช้ทั้ง 4 คอร์เช่น:

 <vcpu>4</vcpu>
 <cpu>
     <topology sockets='1' cores='4' threads='1'/>
 </cpu>

รู้แล้ว แต่ลืมไปเลย - แล้วก็อีกครั้งที่เซิร์ฟเวอร์มีข้อผิดพลาดและทุกคนที่เขียนสิ่งที่ยอดเยี่ยมนี้ทั้งหมด ขอบคุณสำหรับทิป!
fen

1
ฉันลองสิ่งนี้กับเครื่อง RHEL 7.2 ของฉัน เพิ่ม<topology sockets='1' cores='4' threads='1'/>ไปยัง xml ของฉัน แสดงให้เห็นว่าvirsh capabilities | grep topology <topology sockets='1' cores='6' threads='2'/>สำคัญ: ดำเนินการkill -HUP nnnnnโดยที่ nnnnn เป็น PID ของกระบวนการ libvirtd ของฉัน เริ่มต้น VM มันได้ผล +1! ขอบคุณ! ... แต่อย่าลืมเตะ libvirtd ด้วยสัญญาณ HUP หรือเริ่มใหม่!
Mike S

4

การตั้งค่าทอพอโลยีได้รับการสนับสนุนอย่างสมบูรณ์ใน virt-manager ตั้งแต่ Ubuntu 15.04

จาก virt-manager> CPUs> โทโพโลยี:

  • ตรวจสอบ: ตั้งค่าโทโพโลยี CPU ด้วยตนเอง
  • ซ็อกเก็ต: 2
  • แกน: 2
  • หัวข้อ: 2

ต่อไปนี้ถูกสร้างขึ้นจากการตั้งค่าด้านบนใน virt-manager คุณไม่จำเป็นต้องป้อนสิ่งเหล่านี้ด้วยการแก้ไข virsh

<vcpu placement='static'>8</vcpu>
<cpu mode='host-model'>
  <model fallback='allow'/>
  <topology sockets='2' cores='2' threads='2'/>
</cpu>

โทโพโลยีหยุดการจดจำโดย windows หลังจากการอัพเดตและ จำกัด CPU เสมือนเป็น 2 ซ็อกเก็ตอีกครั้ง

ในการแก้ไขปัญหานี้ให้ใช้ 'virsh edit' เพื่อซ่อนคุณสมบัติ kvm และเพิ่มคุณสมบัติ hyperv หลังจากการปิดระบบสมบูรณ์และรีบูต Windows VM จะจดจำ CPU หลายตัวอีกครั้ง

ทำไม Windows 7 VM ของฉันทำงานภายใต้ Linux 'KVM ไม่ได้ใช้โปรเซสเซอร์เสมือนทั้งหมด?

<features>
  <acpi/>
  <apic/>
  <hyperv>
    <relaxed state='on'/>
    <vapic state='on'/>
    <spinlocks state='on' retries='8191'/>
  </hyperv>
  <kvm>
    <hidden state='on'/>
  </kvm>
</features>

2

ใน RHEL / CentOS 5.5 (kvm> = 83-164.el5) kvm ไบนารีรองรับตัวเลือก "-smp N, cores = N" เช่นกัน (มีแพทช์ backport ในแพ็คเกจ); อย่างไรก็ตามเวอร์ชัน libvirt ไม่สนับสนุนองค์ประกอบ <topology> ใน XML ของโดเมน วิธีแก้ปัญหาคือการสร้างสคริปต์ตัวตัดสำหรับ / usr / libexec / kvm ซึ่งเพิ่มตัวเลือกที่เหมาะสมและระบุสคริปต์นั้นในองค์ประกอบ <emulator> แทนเส้นทางเริ่มต้น


1

เป็นที่น่าสังเกตว่า Ubuntu 10.4 (Lucid) มีเวอร์ชัน 0.7.5 ของ libvirt ในขณะที่การสนับสนุนสำหรับทอพอโลยีถูกเพิ่มเข้ากับ libvirt ในเวอร์ชัน 0.7.6 Ubuntu 10.10 (ไม่ฝักใฝ่ฝ่ายใด) มี 0.8.3 libvirt และดังนั้นควรสนับสนุนสเปคทอพอโลยีโดยตรงใน XML โดยไม่ต้องใช้ตัวคลุม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.