易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 4887|回复: 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。# D1 d3 F5 o% u+ @3 {
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。: z* k7 v" [* D  f4 k( G
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。* N0 ^, ]* l' p/ n1 o3 ~3 w
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存


4 m3 v3 r; x4 j/ x+ Y7 H

什么是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
  • 3
    - }- M7 b; ~& U* O8 v: k

解决方法:

很简单,按提示的操作(将vm.overcommit_memory 设为1)即可: 有三种方式修改内核参数,但要有root权限:
  • 1
  • 2
  • 31 c4 B. x1 @0 K  f% Z# G

(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是什么?  ! O6 R8 `# x5 U* l& V
' J! q, W+ ^$ e1 M( b) c; b' Q* _- H
      overcommit_memory是一个内核对内存分配的一种策略。 具体可见/proc/sys/vm/overcommit_memory下的值& e7 Q( T; z0 q0 K9 P

' g, `1 c+ ?8 J6 `; C+ M- n     
, ~2 t* L: y3 x  P7 S1 Y2.  overcommit_memory有什么作用?  & u$ s" ~: h# R
" L: J. ]. |& _2 _$ i1 A0 l
     overcommit_memory取值又三种分别为0, 1, 26 ^( A3 f5 P7 M9 q
% Y" M: u/ G. @: H
    overcommit_memory=0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。5 j, A2 x8 [# Z: k) J  L: E# b1 Y
    overcommit_memory=1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
, i1 n4 |# N* B! @$ U    overcommit_memory=2, 表示内核允许分配超过所有物理内存和交换空间总和的内存% s, M. h- `* q. a0 x: o- z; a
4 |% M. r; c* O
3.  overcommit_ratio是什么? / s* ~; u1 [4 x* q7 Y$ O

, {, s/ M' t$ q4 X% m    当overcommit_memory=2的时候,它一般是代表的是系统中总的内存的百分比. T3 H$ u$ w/ b5 ^; u8 N; t

/ Y% q9 y& g8 G# ^4 Q. c
# h& f# Z! d6 O0 @+ n7 p9 V0 h, ]1 j' t  U" l9 e
4. 虚拟内存
! I% _1 t$ N5 b/ V! O* J" l
7 r' [# O" i8 E% }  CommitLimit = SwapTotal + MemTotal * overcommit_ratio
. Q! q- X+ {4 z* _. V2 K* Z4 D- E; x4 Q8 v6 ]5 H# A
  总的虚拟内存 = 总的交换分区 + 总的物理内存 * overcommit_ratio3 l, G/ _3 w9 O7 s0 X+ G7 A

) H) M9 d/ I+ ?) n" [* J8 F  这些信息可以到cat  /proc/meminfo中看到,  可以通过上述的计算公式可以计算就可以获得系统的CommitLimit的值$ Z; T  [# _2 {+ o* ~6 R

$ J- f$ {0 N5 W
$ M' y( L/ d; `% y) s
$ n! o& V* A1 L: W. ^" t; v- z5. Committed_AS:是什么?1 ^$ ?9 w+ y0 R
* _# u$ {: N" o" k
  Committed_AS代表了系统已经用了的内存情况
# B3 n6 M6 t1 W" B) _: R3 S" G5 O" P- Z6 Y- E( o+ w

4 k0 g( @9 e' [( K6.  overcommit_memory的系统默认值是0, overcommit_ratio的默认值是50。可以实际中会遇到相同配置的电脑,相同的程序一个可以申请到内存,一个不可一申请到。这时候可以看看overcommit_memory的值是否被修改了。
# W9 p/ m$ R3 i, e, W$ d
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

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

GMT+8, 2026-4-9 01:05 , Processed in 0.053773 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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