Proxmox 性能调优全攻略
系列文章 #8 | 后 VMware 时代企业虚拟化实战
目录
- 调优的基本原则
- [CPU 调优](#CPU 调优)
- 内存调优
- [磁盘 I/O 调优](#磁盘 I/O 调优)
- 网络调优
- [Guest OS 内调优](#Guest OS 内调优)
- 性能基准测试
- 典型场景调优案例
一、调优的基本原则
- 先测量,再调优:没 baseline 就没有调优
- 一次只改一个参数:否则无法归因
- 关注瓶颈,不要"通用优化":CPU 不是瓶颈时调 CPU 没意义
- 记录每次变更:方便回滚和复盘
性能瓶颈定位工具链:
bash
# 整体概览
top / htop / atop
# CPU
mpstat -P ALL 1
perf top
# 内存
free -h / slabtop
# 磁盘
iostat -xz 1
iotop
# 网络
iftop / nload / sar -n DEV 1
# 综合
dstat -tcmnd 1
二、CPU 调优
2.1 CPU Type 选择
PVE 默认 CPU 类型 kvm64 是最大兼容性,但性能损失大。选项:
| CPU 类型 | 适用 | 性能 |
|---|---|---|
kvm64 |
最大兼容 | 低 |
x86-64-v2-AES |
2012+ CPU | 中 |
x86-64-v3 |
Haswell+ (2013+) | 较高 |
x86-64-v4 |
AVX-512 | 最高 |
host |
直接透传物理 CPU | 最高(不能迁移异构) |
推荐 :集群 CPU 一致用 host,否则用 x86-64-v3。
2.2 NUMA 配置
多路 CPU(2 socket+)必配 NUMA,避免跨节点访问:
VM → Hardware → Processors:
Sockets: 2
Cores: 8
NUMA: [✓]
CLI:
bash
qm set 100 --numa 1 --sockets 2 --cores 8
2.3 CPU Pinning(极致场景)
绑定 VM 到特定物理核,避免调度抖动:
bash
# 查看拓扑
lscpu -e
# 编辑 VM 配置
echo "args: -cpu host,+topoext -smp sockets=1,cores=4,threads=1 -object memory-backend-ram,id=ram0,size=16G,host-nodes=0,policy=bind -numa node,memdev=ram0" >> /etc/pve/qemu-server/100.conf
代价:失去灵活性,不能自由迁移。仅用于 DB 等关键应用。
2.4 vCPU 超分比例
| 业务类型 | 推荐比例 | 说明 |
|---|---|---|
| CPU 密集(编码、DB) | 1:1 | 不超分 |
| Web 应用 | 1:2 - 1:4 | 适度超分 |
| 办公/测试 | 1:4 - 1:8 | 可以激进 |
监控 pve_cpu_ready,持续 > 5% 说明超分过度。
三、内存调优
3.1 Ballooning
开启气球驱动可动态回收未用内存:
VM → Hardware → Memory:
Minimum: 2048
Maximum: 8192
Ballooning: [✓]
注意 :DB/JVM 类应用禁用 balloon,否则 GC 抖动。
3.2 HugePages(大页内存)
对大内存 VM(> 16GB)显著减少 TLB miss:
bash
# 计算需要的 2M 大页数量(如 32GB VM)
echo "vm.nr_hugepages = 16384" >> /etc/sysctl.conf
sysctl -p
# 验证
grep HugePages /proc/meminfo
VM 配置:
qm set 100 --hugepages 1024 # 1GB 大页
# 或 2 表示 2MB 大页
3.3 KSM(Kernel Same-Page Merging)
相当于 VMware TPS,去重相同内存页。默认开启:
bash
systemctl status ksmtuned
cat /sys/kernel/mm/ksm/pages_sharing # 已合并页数
缺点:CPU 有开销,安全隐患(Side channel)。内存充足时可关。
3.4 VM 内存对齐
bash
# 禁用 swap 尽量让 VM 用物理内存
sysctl vm.swappiness=10
# 关闭透明大页(和 HugePages 冲突)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
四、磁盘 I/O 调优
4.1 存储后端性能对比
| 后端 | 顺序读 | 4K 随机读 | 延迟 |
|---|---|---|---|
| Local NVMe | 7 GB/s | 600K IOPS | µs 级 |
| Local SATA SSD | 500 MB/s | 80K IOPS | ms 级 |
| Ceph 25GbE | 6 GB/s | 200K IOPS | 2-5ms |
| Ceph 10GbE | 1.2 GB/s | 60K IOPS | 5-10ms |
| NFS over 10GbE | 1 GB/s | 30K IOPS | 3-8ms |
4.2 VM 磁盘缓存策略
| Cache 模式 | 性能 | 数据安全 | 说明 |
|---|---|---|---|
| none | 高 | 高 | 推荐默认 |
| writethrough | 低 | 最高 | DB 用 |
| writeback | 最高 | 低 | 非关键业务 + UPS |
| unsafe | 最高 | 无 | 仅测试 |
| directsync | 低 | 高 | - |
bash
qm set 100 --scsi0 local-zfs:vm-100-disk-0,cache=none
4.3 SCSI Controller 选择
必选 VirtIO SCSI single:每个磁盘独立 queue,支持 IO 多线程。
bash
qm set 100 --scsihw virtio-scsi-single
qm set 100 --scsi0 local-zfs:vm-100-disk-0,iothread=1,ssd=1,discard=on
iothread=1:独立 IO 线程ssd=1:上报 SSD,Guest 会用 TRIMdiscard=on:回收已删除块(thin provisioning 必开)
4.4 ZFS 专项
bash
# 根据盘类型调
zfs set recordsize=16K pool/vm # DB 用小块
zfs set recordsize=128K pool/vm # 默认,通用
zfs set primarycache=metadata pool/vm # 内存紧张时
# ARC 大小限制
echo "options zfs zfs_arc_max=17179869184" > /etc/modprobe.d/zfs.conf # 16GB
update-initramfs -u
4.5 磁盘 IO 调度器
bash
# 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 Frame
bash
# Host
ip link set eno1 mtu 9000
# VM 内 (Linux)
ip link set eth0 mtu 9000
注意:链路全程必须都支持 9000,否则分片反而慢。
5.2 VirtIO 多队列
bash
# 8 queue 可跑满 25GbE
qm set 100 --net0 virtio,bridge=vmbr0,queues=8
VM 内启用:
bash
ethtool -L eth0 combined 8
5.3 内核网络参数
bash
# /etc/sysctl.conf
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.core.netdev_max_backlog = 30000
net.ipv4.tcp_congestion_control = bbr
sysctl -p
5.4 SR-IOV(直通场景)
网卡支持 SR-IOV 时,VF(虚拟功能)直通给 VM,绕过软件交换机:
bash
# 启用 VF
echo 4 > /sys/class/net/eno1/device/sriov_numvfs
# VM 直通 VF
qm set 100 --hostpci0 0000:01:10.0
性能等同物理网卡,但失去迁移能力。
六、Guest OS 内调优
6.1 Linux VM
bash
# 禁用透明大页
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# 时钟源
echo kvm-clock > /sys/devices/system/clocksource/clocksource0/current_clocksource
# IRQ 均衡
systemctl enable --now irqbalance
# 安装 qemu-guest-agent
apt install qemu-guest-agent
6.2 Windows VM
1. 安装 virtio-win 最新驱动
2. 关闭可视特效(性能选项)
3. 关闭 Windows Search / Superfetch(服务器版)
4. 电源选项设"高性能"
5. 禁用不需要的服务(Print Spooler 等)
6. 安装 QEMU Guest Agent
七、性能基准测试
7.1 CPU
bash
# sysbench
sysbench cpu --threads=8 --time=60 run
# 预期:现代 CPU 单核 1000+ events/s
7.2 内存
bash
sysbench memory --memory-block-size=1M --memory-total-size=100G run
# 预期:DDR4 > 10 GB/s
7.3 磁盘
bash
# fio 随机 4K 读写
fio --name=rand --rw=randrw --bs=4k --size=10G \
--numjobs=8 --iodepth=32 --runtime=60 \
--group_reporting --direct=1
# 顺序读写
fio --name=seq --rw=rw --bs=1M --size=10G \
--numjobs=1 --iodepth=16 --runtime=60 \
--direct=1
7.4 网络
bash
# 服务端
iperf3 -s
# 客户端
iperf3 -c <server> -P 8 -t 60
八、典型场景调优案例
8.1 MySQL/PostgreSQL DB
CPU: host, 1:1 不超分, NUMA 开
内存: 无 balloon, HugePages 开
磁盘: cache=none, iothread=1, Local NVMe 或 Ceph NVMe
网络: VirtIO, 多队列, jumbo frame
8.2 高密度 Web 服务器
CPU: 1:4 超分, x86-64-v3
内存: balloon 可开
磁盘: cache=writeback(有 UPS)
网络: 1GbE 够,无需调优
8.3 Jenkins/CI 构建机
CPU: 1:2, host
内存: 大(> 32GB)
磁盘: Local NVMe + writeback, iothread
网络: 10GbE(下载包用)
8.4 GPU 计算 VM
CPU: host, pinning
PCI 直通: GPU passthrough
IOMMU: 启用
内存: HugePages, balloon 关
结语
性能调优不是拼参数,是拼对瓶颈的判断。先测量、再调优、一次一个变量------这三条做到了,调优效果不会差。常见的"通用优化指南"大部分对你的具体场景收益有限,根据业务画像针对性调整才是正解。
下一篇 → 虚拟化平台横评:Proxmox vs XCP-ng vs OpenStack vs Nutanix