igozhang

——

    kvm_optimize

    环境:Ubuntu 20.04


    1. 开启电源性能模式

    1.1 硬件与 BIOS

    1. 内存组双通道:确保内存按主板手册以双通道方式安装,以提升内存带宽。
    2. BIOS 电源性能模式:在 BIOS 中开启电源性能模式(Performance / High Performance)。并非所有主板都有此选项。
    3. NUMA:若服务器有多颗 CPU,建议在 BIOS 中开启 NUMA。
    4. 散热:确保服务器散热器、机箱盖、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 客户机系统优化

    1. 激活系统:未激活状态下,系统部分功能受限,可能影响性能或体验。
    2. 禁用 WinSAT 任务计划:关闭 Windows System Assessment Tool 相关计划任务,减少定期跑分带来的干扰。
    3. 关闭系统自动更新:避免更新过程占用 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 客户机优化 否

    文档根据原笔记整理:修正命令断行与拼写错误,并补充持久化、安全与拓扑相关说明;请按实际硬件与发行版微调参数。

    MP3