一、调优基本原则
- 先测量,再调优
- 没 baseline 就没调优
- 一次只改一个参数
- 否则无法归因
- 关注瓶颈
- CPU 不是瓶颈时调 CPU 没意义
- 记录每次变更
- 方便回滚
瓶颈定位工具链:
top / htop / atop # 概览
mpstat -P ALL 1 # CPU
free -h / slabtop # 内存
iostat -xz 1 / iotop # 磁盘
iftop / sar -n DEV 1 # 网络
dstat -tcmnd 1 # 综合
二、CPU 调优
2.1 CPU Type 选择
| 类型 | 适用 | 性能 |
|---|---|---|
| kvm64 | 最大兼容 | 低 |
| x86-64-v2-AES | 2012+ CPU | 中 |
| x86-64-v3 | Haswell+ | 较高 |
| host | 直接透传物理 CPU | 最高 |
推荐:集群 CPU 一致用 host,否则用 x86-64-v3。
2.2 NUMA 配置
qm set 100 --numa 1 --sockets 2 --cores 8
2.3 CPU Pinning (极致)
绑定 VM 到特定物理核,避免调度抖动。代价:失去灵活性,不能自由迁移。仅用于 DB 等关键应用。
2.4 vCPU 超分比例
| 业务 | 比例 |
|---|---|
| CPU 密集 (编码/DB) | 1:1 |
| Web 应用 | 1:2 - 1:4 |
| 办公/测试 | 1:4 - 1:8 |
监控 pve_cpu_ready,持续 > 5% 说明超分过度。
三、内存调优
3.1 Ballooning
开启可动态回收未用内存。DB/JVM 应用禁用(否则 GC 抖动)。
3.2 HugePages
echo "vm.nr_hugepages = 16384" >> /etc/sysctl.conf
sysctl -p
qm set 100 --hugepages 1024
3.3 KSM
类似 VMware TPS,默认开启。CPU 有开销,内存充足时可关。
3.4 系统参数
sysctl vm.swappiness=10
echo never > /sys/kernel/mm/transparent_hugepage/enabled
四、磁盘 I/O 调优
4.1 存储后端性能对比
| 后端 | 顺序读 | 4K 随机 | 延迟 |
|---|---|---|---|
| Local NVMe | 7 GB/s | 600K | µs |
| Local SATA SSD | 500 MB/s | 80K | ms |
| Ceph 25GbE | 6 GB/s | 200K | 2-5ms |
| Ceph 10GbE | 1.2 GB/s | 60K | 5-10ms |
| NFS 10GbE | 1 GB/s | 30K | 3-8ms |
4.2 VM 磁盘缓存策略
| Cache | 性能 | 安全 | 说明 |
|---|---|---|---|
| none | 高 | 高 | 推荐默认 |
| writethrough | 低 | 最高 | DB 用 |
| writeback | 最高 | 低 | 非关键 + UPS |
4.3 SCSI Controller
qm set 100 --scsihw virtio-scsi-single
qm set 100 --scsi0 local-zfs:vm-100-disk-0,iothread=1,ssd=1,discard=on
4.4 ZFS 专项
zfs set recordsize=16K pool/vm # DB 小块
zfs set recordsize=128K pool/vm # 通用
# ARC 限制 16GB
echo "options zfs zfs_arc_max=17179869184" > /etc/modprobe.d/zfs.conf
update-initramfs -u
4.5 IO 调度器
# NVMe 用 none, SSD 用 mq-deadline, HDD 用 bfq
echo none > /sys/block/nvme0n1/queue/scheduler
echo mq-deadline > /sys/block/sda/queue/scheduler
五、网络调优
5.1 MTU Jumbo
ip link set eno1 mtu 9000
链路全程必须都支持 9000。
5.2 VirtIO 多队列
qm set 100 --net0 virtio,bridge=vmbr0,queues=8
# VM 内
ethtool -L eth0 combined 8
5.3 内核网络参数
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
net.ipv4.tcp_congestion_control = bbr
5.4 SR-IOV
echo 4 > /sys/class/net/eno1/device/sriov_numvfs
qm set 100 --hostpci0 0000:01:10.0
性能等同物理网卡,但失去迁移能力。
六、Guest OS 内调优
6.1 Linux VM
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo kvm-clock > /sys/devices/system/clocksource/clocksource0/current_clocksource
systemctl enable --now irqbalance
apt install qemu-guest-agent
6.2 Windows VM
- 安装 virtio-win 最新驱动
- 关闭可视特效
- 关闭 Windows Search / Superfetch
- 电源"高性能"
- 安装 QEMU Guest Agent
七、性能基准测试
# CPU
sysbench cpu --threads=8 --time=60 run
# 内存
sysbench memory --memory-block-size=1M --memory-total-size=100G run
# 磁盘 4K 随机
fio --name=rand --rw=randrw --bs=4k --size=10G --numjobs=8 --iodepth=32 --runtime=60 --direct=1
# 网络
iperf3 -c -P 8 -t 60
八、典型场景调优
8.1 MySQL/PostgreSQL DB
CPU: host, 1:1 不超分, NUMA 开
内存: 无 balloon, HugePages 开
磁盘: cache=none, iothread=1, Local NVMe
网络: VirtIO, 多队列, jumbo frame
8.2 高密度 Web
CPU: 1:4 超分, x86-64-v3
内存: balloon 可开
磁盘: cache=writeback(有 UPS)
8.3 Jenkins/CI
CPU: 1:2, host
内存: > 32GB
磁盘: Local NVMe + writeback, iothread
8.4 GPU 计算
CPU: host, pinning
PCI 直通: GPU passthrough
IOMMU: 启用
内存: HugePages, balloon 关
性能调优不是拼参数,是拼对瓶颈的判断。先测量、再调优、一次一个变量 —— 这三条做到了,调优效果不会差。