vm.overcommit_memory
一、概念与作用
vm.overcommit_memory 是 Linux 内核中的一个参数,用于控制内存分配的“过度承诺”(Overcommit)策略。它决定了内核在分配内存时的保守程度,直接影响系统内存管理的行为和稳定性。
二、参数取值与含义
该参数可设置为 0、1、2 三种值,每种取值对应不同的内存管理策略:
| 取值 | 策略描述 | 适用场景 |
| 0 | 启发式过度承诺(默认值) 内核根据当前内存使用情况动态判断是否允许分配内存。 当系统内存充足时允许适度过度承诺,内存紧张时则更保守。 | 适用于大多数常规场景,平衡性能与稳定性。 |
| 1 | 允许无条件过度承诺 内核会无条件允许内存分配请求,不严格检查物理内存是否足够。 可能导致内存耗尽(OOM, Out of Memory),但能最大化应用程序的内存申请成功率。 | 适用于需要运行大量进程或内存使用波动大的场景(如数据库、缓存服务),但需谨慎使用,避免 OOM。 |
| 2 | 严格禁止过度承诺 内核会根据物理内存和 swap 空间的总量限制内存分配,确保分配的内存不超过 swap + 物理内存 * overcommit_ratio(overcommit_ratio 默认为 50%)。 | 适用于对稳定性要求极高的场景(如服务器关键服务),避免因内存过度分配导致系统崩溃。 |
三、相关参数与配置方式
vm.overcommit_ratio
当 vm.overcommit_memory=2 时生效,用于设置物理内存的过度承诺比例(默认 50%)。
例如:vm.overcommit_ratio=30 表示允许分配的内存总量不超过 swap + 物理内存 * 30%。
配置方式
临时修改(无需重启系统):
查看当前值
sysctl vm.overcommit_memory
设置为 1(允许无条件过度承诺)
sysctl -w vm.overcommit_memory=1
设置 overcommit_ratio 为 30
sysctl -w vm.overcommit_ratio=30
永久修改(修改配置文件):
编辑 /etc/sysctl.conf,添加或修改以下行后执行 sysctl -p 生效:
vm.overcommit_memory = 1
vm.overcommit_ratio = 30
四、实际应用场景建议
场景 1:常规服务器(如 Web 服务、中小型数据库)
建议保持默认值 vm.overcommit_memory=0,内核会自动平衡内存分配。
场景 2:高内存需求服务(如 Redis、MongoDB)
可设置 vm.overcommit_memory=1,但需配合 OOM Killer 策略(vm.oom_killer_enabled),避免关键进程因内存耗尽被终止。
场景 3:稳定性优先的关键服务(如金融、医疗系统)
建议设置 vm.overcommit_memory=2,并合理调整 overcommit_ratio(如设为 30-50),确保内存分配在安全范围内。
五、注意事项
OOM 风险:当 vm.overcommit_memory=1 时,系统可能因内存耗尽触发 OOM Killer,终止某个进程以释放内存。可通过 oom_score_adj 参数调整进程被终止的优先级。
监控与调优:修改参数后需持续监控内存使用情况(如使用 free、top、htop 等工具),避免因配置不当导致性能问题或系统崩溃。
原文连接:
https://blog.csdn.net/cui_win/article/details/148765199?spm=1001.2101.3001.10752
https://cuiwin.blog.csdn.net/category_12596158_2.html
- 本文固定链接: http://www.jiagou.cc/1665/
- 转载请注明: 摘星怪 于 架构迷 发表
