KVM 大页内存配置
大页把内存页从常规的 4KiB 放大到 2MiB 或 1GiB,减少 TLB 缺失与页表层级,对内存密集、随机访问多的负载收益明显。KVM 里用大页要两步配合:先在宿主静态预留大页,再在域 XML 的 memoryBacking 中声明使用大页。只改 XML 不预留,虚机启动时会直接报内存分配失败。
基本信息
| 查看现状 | cat /proc/meminfo | grep -i huge 查看已预留与已用大页数 |
|---|---|
| 预留 2MiB 页 | 向 hugepages-2048kB/nr_hugepages 写入页数 |
| 1GiB 页 | 通过 hugepagesz 与 default_hugepagesz 内核参数在启动时预留 |
| 域侧声明 | 域 XML 中使用 memoryBacking 的大页标签 |
| 校验 | virsh dumpxml 与宿主 meminfo 对照,确认大页真的被用上 |
典型使用场景
- 数据库虚机:内存随机访问密集,减少页表开销收益明显
- 大数据与内存计算:工作集大,TLB 缺失是主要开销来源
- 低延迟业务:对内存访问抖动敏感的服务
- 性能基准对比:验证大页对特定负载的实际收益
- 宿主规划:按业务虚机需求统一预留大页并纳入容量管理
预留 4096 个 2MiB 大页(约 8GiB)
预留 4096 个 2MiB 大页(约 8GiB)
echo 4096 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
cat /proc/meminfo | grep -i hugepages # 核对总数与空闲数
# 域 XML:<memoryBacking><hugepages/></memoryBacking>
virsh dumpxml vm1 | grep -i hugepages # 确认定义已生效
# 持久化:写入 sysctl 或内核启动参数,重启后仍保留预留大页规格对比
| 页规格 | 特点 | 适用 |
|---|---|---|
| 4KiB(默认) | 无需预留,管理简单 | 通用场景 |
| 2MiB | 可在运行时预留,粒度适中 | 多数虚机与数据库 |
| 1GiB | TLB 收益最大,必须在启动时预留 | 超大内存虚机 |
静态大页长期占用宿主内存:虚机内存与预留页数要匹配,预留不足会导致虚机启动失败,预留过多则闲置内存无法被其他虚机使用。
大页预留量与虚机内存要对得上账:一台 8GiB 内存的虚机需要 4096 个 2MiB 页,扩容内存时预留量也要同步增加。
大页与超分、气球回收存在冲突:大页内存通常不可换出,启用后虚机的内存基本被锁定,宿主可用于弹性的余量随之减少,容量规划时要把这部分单独算清楚,不要在两套策略之间互相挤占。