---
title: 虚拟机绑核
description: "在服务器上运行多个虚拟机，每台虚拟机的业务不同，造成不同程度的资源占用，对于存储IO密集型的虚拟机，为了避免相邻的虚拟机的干扰，需要将不同虚拟机处理IO的存储进程完全隔离，由于QEMU主进程是处理前后端的主要服务进程，故需要实现隔离。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengcpfs/ecosystemEnable/QEMU-KVM/kunpengkvm_05_0008.html
sourcePath: /source/zh/kunpengcpfs/ecosystemEnable/QEMU-KVM/kunpengkvm_05_0008.html
indexId: 66c6aaec41a9efa6adb7b1ac83ade0b59240d6f6d254d3100ba5d60b9f73143871
---
# 虚拟机绑核

#### 绑定QEMU进程至物理CPU

在服务器上运行多个虚拟机，每台虚拟机的业务不同，造成不同程度的资源占用，对于存储IO密集型的虚拟机，为了避免相邻的虚拟机的干扰，需要将不同虚拟机处理IO的存储进程完全隔离，由于QEMU主进程是处理前后端的主要服务进程，故需要实现隔离。

虚拟机进行绑核时，建议物理CPU0~CPU3保留，不使用。


1. 打开虚拟机xml配置文件。
  1 virsh edit vm1

  vm1为虚拟机名称。

2. 按“i”进入编辑模式，在xml中进行如下配置：
  1 2 3 4 5 6 7 8 9 10 11 12 <domain type = 'KVM'> ... <vcpu placement = 'static' cpuset='4-7'>4</vcpu> <cputune> <vcpupin vcpu='0' cpuset='4'/> <vcpupin vcpu='1' cpuset='5'/> <vcpupin vcpu='2' cpuset='6'/> <vcpupin vcpu='3' cpuset='7'/> <emulatorpin cpuset='4-7'/> </cputune> ... <domain>

  vcpu placement = 'static' cpuset='4-7'：用于IO线程、worker threads线程仅能使用4-7这4个核，若不配置此参数，虚拟机任务线程会在CPU任意core上浮动，会存在更多的跨NUMA和跨DIE损耗。 vcpupin用于限制对CPU线程做一对一绑核。若不使用vcpupin绑CPU线程，则线程会在4-7这4个核之间切换，造成额外开销。 emulatorpin cpuset='4-7'：表示将QEMU主线程绑定到4至7核上。

3. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。


#### 跨CPU Cluster绑核

鲲鹏920系列处理器包含2个Super CPU Cluster（简称SCCL），每个SCCL包含6~8个CPU Cluster，每个CPU Cluster包含4个CPU Core。在KVM虚拟机环境下对KVM进行CPU绑核时，建议尽量分布到多个CPU Cluster中，可以减少同一个CPU Cluster内多个Core竞争导致L3 Cache出现内存带宽瓶颈问题，从而整体提升虚拟机性能。

1. 在Linux系统中先查询NUMA节点信息以及拓扑结构。
  1 numactl -H

2. 在Linux系统中编辑虚拟机xml配置文件，设置CPU绑核尽量分布到多个CPU Cluster上，配置举例如下：
  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <domain type = 'KVM'> ... <vcpu placement = 'static' cpuset='4,5,8,9,12,16,22,23'>8</vcpu> <cputune> <vcpupin vcpu='0' cpuset='4'/> <vcpupin vcpu='1' cpuset='5'/> <vcpupin vcpu='2' cpuset='8'/> <vcpupin vcpu='3' cpuset='9'/> <vcpupin vcpu='4' cpuset='12'/> <vcpupin vcpu='5' cpuset='16'/> <vcpupin vcpu='6' cpuset='22'/> <vcpupin vcpu='7' cpuset='23'/> </cputune> ... </domain>
