---
title: 在虚拟化环境中使能cluster调度优化特性
description: "在使用cluster调度优化特性之前，需要使能cluster调度优化特性。本文将介绍在虚拟化环境中使能cluster调度优化特性的方法。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengcpfs/systuningguide/systemtg/kunpengcluster_05_0007.html
sourcePath: /source/zh/kunpengcpfs/systuningguide/systemtg/kunpengcluster_05_0007.html
indexId: 988fd3370562e45423e08034887cc7f980f85f0ff785f7b5c0afb5571c88551674
---
# 在虚拟化环境中使能cluster调度优化特性

在使用cluster调度优化特性之前，需要使能cluster调度优化特性。本文将介绍在虚拟化环境中使能cluster调度优化特性的方法。

在虚拟化环境中，虚拟机的ACPI或DT信息是由虚拟化组件生成的。虚拟化组件会根据用户配置的CPU拓扑信息生成ACPI或DT，并将其与虚拟机内核一起加载到虚拟机内存地址空间中，以支持虚拟机内部感知CPU拓扑信息，从而优化任务调度决策。

本文将展示如何设置虚拟机的vCPU拓扑信息，以及验证虚拟机是否已经接收到这些信息，最后使能cluster调度优化特性。

使能cluster调度优化特性要求用户具有root权限，操作步骤如下：

1. 查看物理机CPU的拓扑结构和cluster分组情况。
  不同型号的CPU cluster分组可能会有所不同，因此在使用之前需要确认CPU cluster的分组情况。

```
cat /sys/devices/system/cpu/cpu0/topology/cluster_cpus_list
```


  预期结果：

```
0-3
```


  本例表示CPU0所在的cluster中包含CPU 0～3，即4个core为一组cluster。

2. 设置虚拟机xml配置。
例如需要配置16个CPU的虚拟机，则需要设置vCPU的拓扑配置。

  a. 使用libvirt对虚拟机配置进行管理，执行如下命令打开虚拟机的xml配置文件，其中VM是待编辑的虚拟机的名称。

```
virsh edit VM
```


  b. 按“i”进入编辑模式，在编辑界面中修改虚拟机的xml。
    将第一行<domain type='kvm'>修改为如下内容。

```
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
```


    在domain节中添加以下内容。

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <cputune> <vcpupin vcpu='0' cpuset='32'/> <vcpupin vcpu='1' cpuset='33'/> <vcpupin vcpu='2' cpuset='34'/> <vcpupin vcpu='3' cpuset='35'/> <vcpupin vcpu='4' cpuset='36'/> <vcpupin vcpu='5' cpuset='37'/> <vcpupin vcpu='6' cpuset='38'/> <vcpupin vcpu='7' cpuset='39'/> <vcpupin vcpu='8' cpuset='40'/> <vcpupin vcpu='9' cpuset='41'/> <vcpupin vcpu='10' cpuset='42'/> <vcpupin vcpu='11' cpuset='43'/> <vcpupin vcpu='12' cpuset='44'/> <vcpupin vcpu='13' cpuset='45'/> <vcpupin vcpu='14' cpuset='46'/> <vcpupin vcpu='15' cpuset='47'/> <emulatorpin cpuset='32-47'/> </cputune> <qemu:commandline> <qemu:arg value='-smp'/> <qemu:arg value='cpus=16,maxcpus=16,sockets=1,dies=1,clusters=4,cores=4,threads=1'/> </qemu:commandline>

    在vcpupin中，vcpu代表虚拟机中的CPU编号，而cpuset则代表物理机中的CPU编号，通过这个参数完成vCPU和物理CPU的1:1绑核操作。 QEMU的commandline中描述了vCPU的拓扑，其中包括16个CPU，最大支持16个CPU。每个CPU都位于一个socket上，每个socket上有一个die，每个die上有4个cluster，每个cluster上有4个core，每个core可以执行1个线程。这种拓扑结构可以帮助优化虚拟机的性能。 在配置vCPU拓扑时，需要注意符合物理CPU的结构，以确保最佳的性能优化效果。在设置cores为4时，QEMU会将vCPU 0-3绑定在一个cluster上。因此，在使用vcpupin对vCPU和物理CPU进行绑定时，需要绑定在同一个cluster上的4个物理CPU，例如CPU 32～35。如果物理CPU不在同一个cluster上，可能会导致期望的优化效果失效。

  c. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
3. 确认vCPU拓扑生效。

  a. 启动虚拟机。

```
virsh start VM --console
```


  b. 等待虚拟机系统启动完成后，在虚拟机控制台中执行如下命令查看CPU0所属的CPU集群中的CPU编号列表。

```
cat /sys/devices/system/cpu/cpu0/topology/cluster_cpus_list
```


    预期结果：

```
0-3
```


根据2中的参数说明，可以发现vCPU 0～3被绑定在同一个cluster上，而这个cluster中的物理核心为32～35。由此可知，拓扑已经生效。
4. 在虚拟机中使能cluster调度优化，将Linux内核的调度器设置为集群调度器。

```
echo 1 > /proc/sys/kernel/sched_cluster
```
