易陆发现论坛

 找回密码
 开始注册
查看: 402|回复: 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。. K7 L6 d2 o" [6 `& J& S
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。( U* O( s  Y7 P: U) V
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。/ _7 I! Q' ]9 k" C
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存

& }( ^9 R) Q+ d' f3 p% P

什么是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
  • 30 m6 Q9 {/ y1 _

解决方法:

很简单,按提示的操作(将vm.overcommit_memory 设为1)即可: 有三种方式修改内核参数,但要有root权限:
  • 1
  • 2
  • 35 \0 N) s6 Z  `! d, l0 `( i

(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是什么? 
6 H1 r; _& v. \# b1 |  ^: N- u
0 h# _% e3 G2 u* L% r& r5 J      overcommit_memory是一个内核对内存分配的一种策略。 具体可见/proc/sys/vm/overcommit_memory下的值
* ?& H( S. p6 H8 o: R0 S. f! F# i
' {! k1 H# f( A) X- c3 R/ ]' f      & J* Q7 M" j% a( C% @
2.  overcommit_memory有什么作用?  " k0 p. K1 q! `* ]& |

$ k) W$ P) g# ^/ Q6 u  @     overcommit_memory取值又三种分别为0, 1, 2
5 E% J8 u- v- Y1 f8 [5 ?: n
. I$ U1 J# p- u" F/ h    overcommit_memory=0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
; g" x$ f) O4 m    overcommit_memory=1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
. W: d- k; Z' j" u( g$ w    overcommit_memory=2, 表示内核允许分配超过所有物理内存和交换空间总和的内存
" H$ B. [: k: Y  t$ p3 Y
7 a+ d$ m4 v" f  c3.  overcommit_ratio是什么? 6 H- J9 \) D% }- V
+ i9 g' F9 S  n, U
    当overcommit_memory=2的时候,它一般是代表的是系统中总的内存的百分比
/ j+ b  M4 p! [+ l7 j4 N
* ^. j' {% \( b9 n) _5 @  b/ b
  o5 O! D' i: e" e. [7 B
( c% A/ F8 K- w7 ]8 [4. 虚拟内存
5 I4 ~0 q3 L6 E* x: s
( N6 m6 f1 B, w3 k  CommitLimit = SwapTotal + MemTotal * overcommit_ratio
; }  f% E: E% m3 O+ A/ F9 ]
& z" l3 o% o& f3 N: X  总的虚拟内存 = 总的交换分区 + 总的物理内存 * overcommit_ratio  D9 I$ j- e, r& K3 K* l7 \1 S& C

: O. \: n8 e' u! {4 E! v  这些信息可以到cat  /proc/meminfo中看到,  可以通过上述的计算公式可以计算就可以获得系统的CommitLimit的值
$ b: j9 C; |0 x5 n
# @7 m  a) z: @" n# g- c: ]8 K0 R; {  J4 X

6 b0 A. c9 n3 N! O3 K5. Committed_AS:是什么?+ C; q! e" O4 A* L# ~0 ?
. a+ q- Y, k8 P
  Committed_AS代表了系统已经用了的内存情况) d( C  n) ?( f3 _$ H
5 ]* f, T5 U/ k+ H

/ a$ S" V0 ]; B3 I6.  overcommit_memory的系统默认值是0, overcommit_ratio的默认值是50。可以实际中会遇到相同配置的电脑,相同的程序一个可以申请到内存,一个不可一申请到。这时候可以看看overcommit_memory的值是否被修改了。
+ b% h1 G8 U; t9 e* e
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

如有购买积分卡请联系497906712

QQ|返回首页|Archiver|手机版|小黑屋|易陆发现 点击这里给我发消息

GMT+8, 2020-4-4 22:09 , Processed in 0.048432 second(s), 19 queries .

Powered by 龙睿 bbs168x X3.2

© 2001-2020 Comsenz Inc.

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