内存超配(Memory Overcommitment)是一种云服务提供商或虚拟化平台用来提高物理服务器资源利用率的策略,其核心思想是:分配给所有虚拟机的内存总量可以超过物理主机实际拥有的物理内存总量。
这基于一个假设:并非所有虚拟机都会在同一时间达到其分配的最大内存使用量。
超配本身不是一个简单的“开关”,而是通过一系列技术组合实现的:
1、内存去重(Memory Deduplication / Page Sharing):
* 虚拟化层会扫描所有虚拟机的内存页。
* 如果发现多个虚拟机拥有完全相同的内存内容(相同的操作系统文件、应用程序库),则只在物理内存中保留一份副本,并通过写时复制(Copy-on-Write)技术让多个虚拟机共享该只读页。
例如10台都运行 Ubuntu 的虚拟机,它们的内核内存大部分是相同的,可以共享。
2、内存气球(Memory Ballooning):
* 在虚拟机内部安装一个特殊的驱动程序(通常叫balloon
驱动,是 VMware Tools、VirtualBox Guest Additions 或qemu-guest-agent
的一部分)。
* 当宿主机物理内存紧张时,Hypervisor 会“吹大”这个气球,向虚拟机内部的驱动发出指令,让驱动在虚拟机内部申请一部分内存。
* 这样,虚拟机认为自己使用了更多内存(可能开始使用交换空间),而实际上这部分被“申请”的内存被交还给了宿主机,供其他更需要的虚拟机使用。
3、交换(Swapping):
* 这是最后一道防线,也是性能影响最大的手段。
* 当物理内存严重不足,且气球驱动也无法回收足够内存时,Hypervisor 会强制将某些虚拟机的内存页交换到宿主机硬盘上的特定交换文件(.vswp
)或分区中。
注意这会导致严重的性能下降,因为磁盘I/O速度远慢于内存。
设置超配通常不是在单个虚拟机上操作,而是在虚拟化集群或资源池的层面进行配置,不同的平台设置方式不同。
通用概念:超配比率(Overcommit Ratio)
超配比率 = (所有虚拟机分配的内存总和) / (宿主机实际物理内存总和)
比率 = 1 1:1 分配,无超配。
比率 > 1 存在超配,1.5:1 表示分配了 150G 内存给虚拟机,但物理主机只有 100G 内存。
你的目标是找到一个在资源利用率和性能之间取得平衡的最佳比率。
1. VMware vSphere / ESXi
这是企业级虚拟化中最成熟的平台,提供了精细的控制。
位置 在 vSphere Client 中,选择集群(Cluster) ->配置(Configure) ->服务(Services) ->资源管理(Resource Management)。
关键参数
内存超配(Memory Overcommitment) 这里会显示当前的超配比率。
内存负载(Memory Reservations) 这是更重要的控制手段,你可以为每个虚拟机设置“预留(Reservation)”,即保证分配给它的最低物理内存量,总和预留值不能超过物理内存总量,超配主要发生在“预留”之外的部分。
份额(Shares)和限制(Limit) 用于精细控制虚拟机在资源争用时的优先级和能使用的上限。
建议 对于生产关键型负载,设置较高的“预留”;对于测试/开发环境,可以设置较低的“预留”以实现更高的超配。
2. Proxmox VE (基于 KVM)
位置 超配是默认启用的,主要通过以下方式管理:
气球驱动(Ballooning) 在创建或编辑虚拟机时,在“硬件(Hardware)”选项卡中,为虚拟机设置内存(Memory) 时,勾选“气球(Balloon)” 设备,并确保虚拟机内安装了qemu-guest-agent
。
超配控制 没有直接的全局比率滑块,你需要监控集群的总体内存使用情况(在“页面查看),并据此决定创建多少虚拟机,你可以为虚拟机设置“最小内存”(相当于预留)和“最大内存”。
3. OpenStack
超配由计算节点(通常是 Nova)的配置参数控制。
配置文件/etc/nova/nova.conf
关键参数
[DEFAULT] # 内存超配比率,默认是 1.0 (无超配) ram_allocation_ratio = 1.5
* 将ram_allocation_ratio
设置为大于 1 的值即可启用超配,例如1.5
表示允许超配 50%。
4. 公有云 (阿里云、腾讯云、AWS等)
用户无法直接设置超配比率。
超配是云提供商底层架构的一部分,由其自行管理和优化。
作为用户,你选择不同的实例规格(如 2C4G),云平台保证你获得的是“规格”所承诺的资源量(即 4G 内存),其底层的超配策略对你来说是透明的,提供商通过庞大的资源池和智能调度来规避风险。
风险:
性能断崖式下跌 一旦发生内存交换(Swapping),所有虚拟机的性能都会受到严重影响,可能导致服务不可用。
虚拟机崩溃 在极端情况下,如果宿主机内存完全耗尽,Hypervisor 可能会强制终止某些虚拟机进程以释放内存。
最佳实践:
1、了解你的工作负载: 不要盲目超配,分析你虚拟机的内存使用模式,测试/开发环境、桌面虚拟化(VDI)通常是超配的良好候选,因为它们的内存利用率通常不高且可共享内容多,而数据库、内存计算等高性能应用则不适合超配。
2、监控,监控,再监控: 必须严密监控宿主机和虚拟机的内存使用情况、交换率(swap rate)和气球驱动活动,设置警报,在内存使用达到临界值(如 80%)时发出通知。
3、使用预留(Reservation): 为生产关键型虚拟机设置内存预留,保证其至少有足够的物理内存运行,不会被超配策略影响。
4、从保守开始: 如果不确定,先从低的超配比率开始(如 1.1:1),然后根据监控数据逐步调整。
5、准备好应急计划: 确保你有能力快速将虚拟机迁移到其他宿主机,或者有快速扩容的计划。
操作步骤 | 说明 |
1. 选择平台 | 确定你使用的是 VMware, Proxmox, OpenStack 还是其他平台。 |
2. 定位设置 | 在集群或资源池级别查找内存分配比率、预留或气球驱动设置。 |
3. 谨慎配置 | 设置一个保守的超配比率(如 1.2:1 或 1.5:1),并为关键VM设置内存预留。 |
4. 启用监控 | 部署监控工具,密切关注宿主机的可用内存和交换活动。 |
5. 迭代优化 | 根据实际运行数据,逐步调整超配比率,找到安全与效率的平衡点。 |
最后的重要提示:对于大多数生产环境,尤其是对性能敏感的应用,不建议进行激进的内存超配,超配的主要价值在于提升非关键工作负载的资源密度,从而节约成本。
文章摘自:https://idc.huochengrm.cn/zj/15807.html
评论