易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 4886|回复: 1
收起左侧

linux下overcommit_memory

[复制链接]
发表于 2020-1-15 03:00:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x

[13223] 17 Mar 13:18:02.207 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add ‘vm.overcommit_memory = 1’ to /etc/sysctl.conf and then reboot or run the command ‘sysctl vm.overcommit_memory=1’ for this to take effect.

于是通过搜索,也有人跟我遇到同样的问题,基本可以确定是由它引起的。

内核参数overcommit_memory

它是 内存分配策略

可选值:0、1、2。* I+ C  r2 d, S9 U& H+ d% {
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。, y4 P  t/ Y4 @% w4 A2 A, p9 B
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。% z5 B6 F9 x9 ^  R7 E7 P7 v
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存

3 t6 Y) P2 U8 f2 ?

什么是Overcommit和OOM

Linux对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存。这种技术叫做Overcommit。当linux发现内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存。当oom-killer发生时,linux会选择杀死哪些进程?选择进程的函数是oom_badness函数(在mm/oom_kill.c中),该函数会计算每个进程的点数(0~1000)。点数越高,这个进程越有可能被杀死。每个进程的点数跟oom_score_adj有关,而且oom_score_adj可以被设置(-1000最低,1000最高)。
  • 1
  • 2
  • 33 x5 ~, ^/ q' T1 I* f4 e2 o1 ]9 M

解决方法:

很简单,按提示的操作(将vm.overcommit_memory 设为1)即可: 有三种方式修改内核参数,但要有root权限:
  • 1
  • 2
  • 3* W/ L8 d& z, A$ \  u

(1)编辑/etc/sysctl.conf ,改vm.overcommit_memory=1,然后sysctl -p 使配置文件生效

(2)sysctl vm.overcommit_memory=1

(3)echo 1 > /proc/sys/vm/overcommit_memory

 楼主| 发表于 2020-1-15 03:00:50 | 显示全部楼层
1.   overcommit_memory是什么?  / P0 c2 M2 z/ \/ Y) e) t

0 R. N7 {# W- K3 o. C6 ]      overcommit_memory是一个内核对内存分配的一种策略。 具体可见/proc/sys/vm/overcommit_memory下的值  S- C# H# N) t- }
( \, `7 f  b" h4 n) H' z* M) i
        s) P. b- C2 Q& J  @# A8 [
2.  overcommit_memory有什么作用?  . \0 _, M- g8 e- ]
8 d" H7 l# e6 d/ b6 t8 C  T" X
     overcommit_memory取值又三种分别为0, 1, 24 n6 |3 J; x/ P1 Y4 j
7 F5 H# f; H; _: C! g$ ]
    overcommit_memory=0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。4 p5 p8 k- j6 j/ E
    overcommit_memory=1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。* n0 g$ q* e8 Q& p3 q' f$ V
    overcommit_memory=2, 表示内核允许分配超过所有物理内存和交换空间总和的内存6 l6 {2 W5 k9 ]
& Y3 v$ I  k: b0 [$ N8 }
3.  overcommit_ratio是什么? " i* v& H$ k, o6 o: X! R

1 A% A4 _2 M5 a    当overcommit_memory=2的时候,它一般是代表的是系统中总的内存的百分比
9 |! X; r' O. R- ?- Y# _6 V7 m3 ^7 r
. t, S9 m1 s2 k0 \/ {/ p  t9 C

; F. m' a1 V  M. ]4 \% Q& ?4. 虚拟内存
2 ~) w1 \" e0 q$ h2 c
5 G3 G* o2 X' c* G  CommitLimit = SwapTotal + MemTotal * overcommit_ratio
0 f8 ]1 `. y& s2 O5 x4 \9 @5 Q. V, A& d- _; D0 p: ^1 B
  总的虚拟内存 = 总的交换分区 + 总的物理内存 * overcommit_ratio9 |3 A/ f" D; ?. U0 L) K: ^% \0 Z

9 k; M2 m9 ?0 }: I0 _  这些信息可以到cat  /proc/meminfo中看到,  可以通过上述的计算公式可以计算就可以获得系统的CommitLimit的值
* X- e$ [; D) n1 `
4 f: v2 Z+ ^, }$ H2 {& o' f
. |: s& t7 n' o' X1 T0 J
+ ]/ q$ Q) N/ K3 M: z5. Committed_AS:是什么?
% f4 X, a: ^& y7 P! d+ s) K9 Q
, ], r4 ~% R8 O, ~( [& R- `8 K; z  Committed_AS代表了系统已经用了的内存情况
! E7 f9 L' K, E+ Z; z" @6 }7 f  P' q8 w+ i
4 {; U: L2 N. l3 @/ d- x
6.  overcommit_memory的系统默认值是0, overcommit_ratio的默认值是50。可以实际中会遇到相同配置的电脑,相同的程序一个可以申请到内存,一个不可一申请到。这时候可以看看overcommit_memory的值是否被修改了。
; _# A; ~/ v/ e; k( o; h1 A
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-8 21:37 , Processed in 0.040912 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

快速回复 返回顶部 返回列表