Khi tạo máy ảo trong các hypervisor khác nhau (VMware, KVM, Hyper-V, v.v.), bạn có thể thấy đôi khi máy ảo không nhìn thấy tất cả socket bộ vi xử lý ảo (vCPU) được gán cho nó. Trong trường hợp của chúng tôi, 8 vCPU được gán cho máy ảo KVM và Windows 10 được cài đặt trên nó như hệ điều hành khách. Tuy nhiên, Windows phát hiện các vCPU này như các bộ vi xử lý riêng biệt (không phải nhân) và nó chỉ có thể dùng 2 trong số đó.
Máy ảo Windows 10 chỉ sử dụng 2 nhân
Nếu bạn mở Windows Device Manager, bạn có thể chắc chắn rằng tất cả nhân được cấp phát hiển thị như 8 bộ vi xử lý ảo riêng biệt QEMU Virtual CPU version 2.5+.

Cùng lúc đó, thuộc tính Windows 10 (Computer → Properties) và Task Manager cho thấy chỉ có 2 bộ vi xử lý QEMU Virtual khả dụng.
Điều này có nghĩa là Windows 10 chỉ có thể dùng 2 nhân bất kể bạn thêm bao nhiêu. Cùng lúc đó, máy ảo chạy Windows Server 2016 trên cùng hypervisor có thể thấy tất cả 16 vCPU được cấp phát cho nó.
Số bộ vi xử lý được hỗ trợ trong Windows
Vấn đề là các phiên bản Windows desktop (Windows 10/8.1/7) có giới hạn về số lượng tối đa bộ vi xử lý vật lý (socket) một máy tính có thể dùng:
- Windows 10 Home – 1 CPU
- Windows 10 Professional – 2 CPU
- Windows 10 Workstation – lên đến 4 CPU
- Windows Server 2016 – lên đến 64 CPU
Tuy nhiên, giới hạn này không liên quan đến số nhân. Để cải thiện hiệu suất máy ảo của bạn, bạn có thể dùng bộ vi xử lý với nhiều nhân hơn. Hầu hết hypervisors có thể cung cấp vCPU như bộ vi xử lý, nhân bộ vi xử lý hoặc thậm chí luồng (thread). Điều đó có nghĩa là thay vì 8 vCPU, bạn có thể thêm 2 vCPU (2 socket) với 4 nhân mỗi socket. Hãy xem cách gán bộ vi xử lý ảo làm nhân trong các hypervisor khác nhau và cách liên kết nó với kiến trúc NUMA dùng trong bộ vi xử lý hiện đại.
Quản lý nhân ảo & vCPU trong KVM
Trong máy ảo KVM chạy Windows 10 của tôi, tất cả nhân ảo được cấp phát được coi là các bộ vi xử lý riêng biệt.
Để sử dụng tất cả tài nguyên CPU được cấp phát cho máy ảo, nó phải nhìn thấy một bộ vi xử lý 8 nhân, 2 vCPU với 4 nhân mỗi cái hoặc 1 vCPU với 4 nhân trong hai luồng thay vì 8 vCPU. Hãy thử thay đổi cấp phát nhân ảo cho máy ảo KVM.
Tắt máy ảo của bạn:
# virsh shutdown w10testvm – nơi w10testvm là tên máy ảo của bạn
Dưới đây là các khía cạnh quản lý máy ảo KVM từ console bằng virsh.
Hiển thị cấu hình XML hiện tại của máy ảo KVM:
# virsh dumpxml w10testvm
Chúng ta cần khối mô tả cài đặt CPU của VM:
<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>
Như bạn thấy, 8 vCPU được đặt ở đây. Hãy thay đổi cấu hình:
# virsh edit w10testvm
Thêm khối sau sau </features>:
<cpu mode='host-passthrough' check='none'> <topology sockets='1' cores='4' threads='2'/> </cpu>
Nơi:
host-passthroughlà chế độ giả lập mà máy ảo thấy bộ vi xử lý vật lý của nút cụmsockets='1'chỉ ra rằng có một vCPU (socket)cores='4'bộ vi xử lý có 4 nhân mỗi socketthreads='2'mỗi nhân có 2 luồng
Lưu file cấu hình và khởi động máy ảo. Đăng nhập vào VM Windows 10 khách, chạy Task Manager hoặc Resource Monitor, và đảm bảo Windows thấy tất cả nhân ảo được cấp phát.

Bộ vi xử lý vật lý của máy chủ, Intel(R) Xeon(R) Silver 4114 CPU, hiện hiển thị thay vì ảo trong thuộc tính hệ thống.

Đây là cách chúng ta giải quyết vấn đề tải nặng cho VM vì hai nhân không đủ cho ứng dụng hoạt động đúng.
Đặt số nhân trên mỗi vCPU cho VMware VM
Bạn có thể thay đổi cách trình bày vCPU cho máy ảo VMware trong giao diện vSphere Client.
- Tắt VM và mở cài đặt của nó;
- Mở rộng phần CPU;
- Thay đổi cấu hình VM để hệ điều hành khách thấy 2 bộ vi xử lý với 4 nhân mỗi cái. Thay đổi giá trị Cores per Socket thành 4. Điều đó có nghĩa là hệ điều hành khách sẽ thấy hai CPU 4 nhân (2 socket với 4 nhân mỗi socket);

- Lưu thay đổi và chạy VM.
vCPU máy ảo và kiến trúc NUMA
Có thêm một số khía cạnh về gán vCPU và nhân cho máy ảo bạn phải hiểu.
Khi gán số nhân trên mỗi socket, hãy đảm bảo xem bạn có kiến trúc NUMA (dùng trong hầu hết CPU hiện đại). Không khuyến khích gán nhiều nhân trên mỗi socket (và tổng số vCPU) cho VM nhiều hơn số nhân có sẵn trên socket vật lý (NUMA node). Khi đặt trên một NUMA node vật lý đơn, máy ảo sẽ có thể dùng RAM cục bộ nhanh có sẵn trên NUMA node cụ thể. Ngược lại, tiến trình sẽ phải chờ phản hồi từ NUMA node khác (mất thời gian lâu hơn).
Nếu bạn gán hai socket ảo riêng biệt cho VM, hypervisor có thể chạy chúng trên các NUMA node khác nhau. Nó sẽ ảnh hưởng đến hiệu suất VM.
Nếu số vCPU cần thiết nhiều hơn số nhân trên 1 socket vật lý (NUMA node), hãy tạo một số socket ảo (bộ vi xử lý) với số nhân cần thiết. Cũng không khuyến khích dùng số lẻ bộ vi xử lý (tốt hơn thêm 1 vCPU).
Điều này cho phép duy trì hiệu suất máy ảo.

Ví dụ, khuyến khích dùng cấu hình sau cho host 2 bộ vi xử lý với 10 nhân mỗi socket (40 vCPU có sẵn tổng cộng bao gồm Hyper—Threading) khi cấu hình vCPU cho VM:
| Số vCPU cần | Số Socket ảo trong cài đặt VM | Số nhân trên mỗi bộ vi xử lý ảo trong cài đặt VM |
|---|---|---|
| 1 | 1 | 1 |
| …… | ||
| 10 | 1 | 10 |
| 11 | Không tối ưu | |
| 12 | 2 | 6 |
| …… | ||
| 20 | 2 | 10 |
Trong phiên bản ESXi miễn phí bạn không thể tạo VM với hơn 8 vCPU.
Ví dụ, VM chạy Microsoft SQL Server 2016 Enterprise Edition với 16 vCPU (cấu hình 8 Socket với 2 Cores per Socket) sẽ có hiệu suất kém hơn VM với 2 Socket x 8 Cores per Socket.
Cũng nhớ rằng một số ứng dụng được cấp phép tùy thuộc vào số socket vật lý (như các phiên bản SQL Server trước đây). Đôi khi cấp phép một bộ vi xử lý đa nhân lợi hơn nhiều bộ vi xử lý với ít nhân hơn.
Các phiên bản Windows Server hiện đại được cấp phép trong môi trường ảo theo cách đặc biệt. Cũng có một số khía cạnh về cấp phép bộ vi xử lý trong VMware vSphere.