一.CPU优化

提升虚拟机cpu性能的手段,包括CPU透传, CPU缓存, CPU亲和性以及CPU线程调度策略

1.CPU透传

CPU透传是指将host的CPU信息对guest可见,由于guest中某些软件算法会依赖特定的CPU指令,通过透传可以提高这些软件算法的性能,libvirt中CPU透传的配置如下:

1
2
3
4
<cpu mode='host-passthrough'>
<cache mode='passthrough'/>
<feature policy='disable' name='lahf_lm'/>
</cpu>

cache mode设置为passthrough,意味着通过将host的cache信息透传给虚拟机,虽然cpu是透传模式,但也可以配置cpu的某些feature是启用还是禁用。

2.CPU亲和性

CPU亲和性是指将vcpu、qemu主线程、io线程绑定到某个或某些物理cpu上,减少cpu调度,提高虚拟机的性能,CPU亲和性在libvirt中配置如下:

1
2
3
4
5
6
7
<cputune>
<vcpupin vcpu='0' cpuset='0'/>
<vcpupin vcpu='1' cpuset='1'/>
<emulatorpin cpuset='1'/>
<iothreadpin iothread='1' cpuset='2'/>
<iothreadpin iothread='2' cpuset='3'/>
</cputune>

vcpupin是指将指定vcpu绑定到指定的cpuset上,emulatorpin以及iothreadpin的绑定方式也是如此

3.CPU线程调度策略

CPU调度策略是指通过调度sched_setscheduler设置指定线程的调度策略,以及调度优先级,cpu调度策略在libvirt中配置如下:

1
2
3
4
5
6
7
8
<cputune>
<vcpusched vcpus='0' scheduler='fifo' priority='0'/>
<vcpusched vcpus='1' scheduler='fifo' priority='0'/>
<iothreadsched iothreads='1' scheduler='rr' priority='0'/>
<iothreadsched iothreads='2' scheduler='rr' priority='0'/>
<iothreadsched iothreads='3' scheduler='rr' priority='0'/>
<emulatorsched scheduler='rr' priority='0'/>
</cputune>

libvirt支持的调度策略包括以下几个:
none表示普通进程,采用cfs调度;
batch是普通进程调度策略的分化版本。采用分时策略,根据动态优先级(nice()API设置),分配CPU运算资源;
idle表示在系统空闲时才跑这类进程,优先级最低;
fifo表示先入先出调度算法,属于实时调度策略,相同优先级的任务先到先服务,高优先级的任务可以抢占低优先级的任务;
rr表示时间片轮转调度算法,也属于实时调度策略,使用 Roound-Robin算法,相同优先级的任务当用完时间片会被放到队列尾部,以保证公平性,同样,高优先级的任务可以抢占低优先级的任务。

4.CPU cache

CPU cache功能是在Qemu v2.8.0-rc0开始合入qemu(链接),可以通过”-cpu l3-cache=on”方式为虚拟机的cpu创建一个l3的cache,l3 cache的支持可以显著的减少IPI中断(一种cpu之间的中断),原因是一些软件算法是基于硬件cache信息实现的, 例如在x86 kernel中, 当cpu1想在cpu2唤醒一个任务时, cpu1会触发一个resched IPI 中断,并且告诉cpu2如果不共享低级别缓存,就需要去唤醒这个任务. 相反,如果cpu2有低级别缓存, cpu1 可以直接访问cpu2的runqueue,从而不需要通过IPI中断.cpu cache在libvirt中的配置如下:

1
2
3
4
5
6
7
8
9
10
<cachetune vcpus='0-3'>
<cache id='0' level='3' type='both' size='3' unit='MiB'/>
<cache id='1' level='3' type='both' size='3' unit='MiB'/>
<monitor level='3' vcpus='1'/>
<monitor level='3' vcpus='0-3'/>
</cachetune>
<cachetune vcpus='4-5'>
<monitor level='3' vcpus='4'/>
<monitor level='3' vcpus='5'/>
</cachetune>