kvm_optimize
环境:Ubuntu 20.04
1. 开启电源性能模式
1.1 硬件与 BIOS
- 内存组双通道:确保内存按主板手册以双通道方式安装,以提升内存带宽。
- BIOS 电源性能模式:在 BIOS 中开启电源性能模式(Performance / High Performance)。并非所有主板都有此选项。
- NUMA:若服务器有多颗 CPU,建议在 BIOS 中开启 NUMA。
- 散热:确保服务器散热器、机箱盖、CPU 硅脂等散热条件正常。温度过高可能导致 CPU 降频,抵消性能优化效果。
1.2 设置 CPU 调度器为 performance
将所有 CPU 核心的频率调节策略设为 performance,避免动态降频:
#!/bin/bash
value=$(cat /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor)
if [ "X$value" != "Xperformance" ]; then
for file in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
echo "performance" > "$file"
done
fi
补充说明:
- 重启后该设置可能失效,可写入开机脚本(如
/etc/rc.local)或通过cpufrequtils/tuned持久化。- 部分发行版也可使用:
cpupower frequency-set -g performance。
2. 安装低延迟内核
apt install linux-image-5.8.0-50-lowlatency
安装完成后重启,并确认当前内核:
uname -r
补充说明:
lowlatency内核可降低调度延迟,更适合对延迟敏感的虚拟机场景(如游戏、实时应用)。请按实际可用的内核包版本调整包名。
3. 开启 HugePages
3.1 安装工具
apt install libhugetlbfs-bin
3.2 配置内核参数
编辑 /etc/sysctl.conf,增加:
vm.nr_hugepages = x
其中 x 为 HugePage 数量:
x × 2M应 大于 分配给所有虚拟机的内存之和。- 设置过大:系统可用内存不足,可能卡顿。
- 设置过小:虚拟机无法启动,提示无法分配内存。
执行以下命令查看建议值:
hugeadm --explain
会给出类似建议:
kernel.shmmax = xxx
vm.hugetlb_shm_group = xxx
将上述建议值一并追加到 /etc/sysctl.conf,然后执行:
sysctl -p
3.3 透明大页(可选)
echo always > /sys/kernel/mm/transparent_hugepage/enabled
补充说明:若已使用静态 HugePages(
vm.nr_hugepages)分配给 KVM/QEMU,部分场景更推荐将透明大页设为madvise或never,避免与静态大页争用。请按实际压测结果选择。
4. 关闭 KSM
KSM(Kernel Samepage Merging)会合并相同内存页,带来 CPU 开销,对性能敏感场景通常建议关闭。
编辑 /etc/default/qemu-kvm:
KVM_HUGEPAGES=1
KSM_ENABLED=0
重启相关服务并使 KSM 立即生效:
# Ubuntu 20.04 上服务名可能为 libvirtd
service libvirt-bin restart
# 或:systemctl restart libvirtd
echo 0 > /sys/kernel/mm/ksm/run
注意:部分配置需 重启系统 后才完全生效。
5. 关闭 KVM MSR 检查(ignore_msrs)
部分客户机(尤其是 Windows / 游戏)会访问宿主机不支持的 MSR,可能导致异常。可忽略这些 MSR 访问。
5.1 modprobe 配置
编辑 /etc/modprobe.d/kvm.conf:
options kvm ignore_msrs=Y
options kvm report_ignored_msrs=N
5.2 GRUB 内核参数
编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX_DEFAULT 中增加相关参数,例如:
GRUB_CMDLINE_LINUX_DEFAULT="modprobe.blacklist=nouveau net.ifnames=0 biosdevname=0 intel_iommu=on kvm.ignore_msrs=1 mitigations=off"
参数说明(简要):
| 参数 | 作用 |
|---|---|
modprobe.blacklist=nouveau |
禁用 Nouveau 开源显卡驱动(便于后续直通等) |
net.ifnames=0 biosdevname=0 |
使用传统网卡命名(如 eth0) |
intel_iommu=on |
开启 Intel IOMMU(设备直通需要) |
kvm.ignore_msrs=1 |
忽略客户机访问的未知 MSR |
mitigations=off |
关闭部分 CPU 漏洞缓解(可提升性能,但降低安全性) |
然后执行:
update-grub
重启后生效。
安全提示:
mitigations=off会关闭 Spectre/Meltdown 等缓解措施,仅建议在可信、封闭的高性能环境使用。
6. 虚拟机 CPU 绑定优化
6.1 emulatorpin 与 iothread 绑定
- 将
emulatorpin和iothread绑定到宿主机指定核心(示例为 12 核相关核心)。 - 不要绑定到虚拟机的第一个 vCPU 所在核心。
- 原因:部分游戏(如《原神》)对单个 CPU 核心占用较高,若与 emulator / iothread 争用同一核心,易出现卡顿。
示例(libvirt XML 思路):
<!-- 将 emulator 固定到宿主机某几个核心,避开客户机主负载核 -->
<cputune>
<vcpupin vcpu='0' cpuset='1'/>
<vcpupin vcpu='1' cpuset='2'/>
<!-- ... -->
<emulatorpin cpuset='11'/>
<iothreadpin iothread='1' cpuset='11'/>
</cputune>
6.2 隔离分配给虚拟机的 CPU
修改 /etc/default/grub,追加 isolcpus,将准备给虚拟机使用的核心从宿主机通用调度中隔离,例如:
GRUB_CMDLINE_LINUX_DEFAULT="modprobe.blacklist=nouveau net.ifnames=0 biosdevname=0 intel_iommu=on isolcpus=1,2,3,4,5,6,11,24,25,26,27,28,29,30 kvm.ignore_msrs=1 mitigations=off"
要点:
- 所有中断通常落在 第一个物理 CPU 的第一个核心(CPU0),因此一般 不要隔离 CPU0,也不要把 CPU0 绑定给虚拟机。
isolcpus中的核心列表需按本机拓扑(lscpu、numactl -H)自行调整。
执行:
update-grub
重启后生效。
补充说明:较新内核也可配合
nohz_full=、rcu_nocbs=等做更细的实时/隔离优化;isolcpus在新内核上行为有变化,配置前建议先查阅当前内核文档。
7. Windows 客户机系统优化
- 激活系统:未激活状态下,系统部分功能受限,可能影响性能或体验。
- 禁用 WinSAT 任务计划:关闭 Windows System Assessment Tool 相关计划任务,减少定期跑分带来的干扰。
- 关闭系统自动更新:避免更新过程占用 CPU / 磁盘 / 网络,影响虚拟机稳定性(需自行权衡安全更新需求)。
附录:操作检查清单
| 步骤 | 操作 | 是否需重启 |
|---|---|---|
| 1 | BIOS 性能模式 / NUMA / 散热检查 | 视 BIOS 而定 |
| 2 | CPU governor → performance | 通常否(重启后可能丢失) |
| 3 | 安装 lowlatency 内核 | 是 |
| 4 | 配置 HugePages | 部分立即生效,建议重启确认 |
| 5 | 关闭 KSM、开启 KVM HugePages | 建议重启 |
| 6 | ignore_msrs / GRUB 参数 | 是 |
| 7 | isolcpus / CPU 绑定 | 是(isolcpus);绑定可热更新 XML |
| 8 | Windows 客户机优化 | 否 |
文档根据原笔记整理:修正命令断行与拼写错误,并补充持久化、安全与拓扑相关说明;请按实际硬件与发行版微调参数。