找回密码
 注册
查看: 4891|回复: 1

linux下overcommit_memory

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2020-1-15 03:00:49 | 显示全部楼层 |阅读模式

[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。4 p* E/ t/ q/ W" S4 {# g
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。% n6 H5 `6 l1 o3 p- v
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。! l6 m. I) F) t! }
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存

5 y  w  z& d& H' W( Y* |

什么是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
    7 F: M& s7 }( m2 v% D& i0 d( D

解决方法:

很简单,按提示的操作(将vm.overcommit_memory 设为1)即可: 有三种方式修改内核参数,但要有root权限:
  • 1
  • 2
  • 3( r% e/ M8 W8 I/ u3 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

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2020-1-15 03:00:50 | 显示全部楼层
1.   overcommit_memory是什么? 
+ s; W" `& M5 B5 N
7 z) C4 `8 E: @" F- }) `% n      overcommit_memory是一个内核对内存分配的一种策略。 具体可见/proc/sys/vm/overcommit_memory下的值
( b, y* z& k' M4 p- Z5 j; h1 [7 |1 B7 S# K
      ) t5 t) q8 X0 d, o% r
2.  overcommit_memory有什么作用?  $ h% {6 Q7 P$ l+ O  }! h

) j* A5 q; S* n1 [  ?' E     overcommit_memory取值又三种分别为0, 1, 2
, x/ M9 ?5 f4 X+ C: s
$ r# t' m& Y! b7 W. h/ z    overcommit_memory=0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。1 c8 @7 E$ Z) G$ [% g
    overcommit_memory=1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。. ?, P3 E8 w2 @; H. T1 w' A# h
    overcommit_memory=2, 表示内核允许分配超过所有物理内存和交换空间总和的内存& @- o" J% [6 m% @/ [! {
; Z5 Z5 Z+ C: {0 n) T% F. L( o* {* c
3.  overcommit_ratio是什么? % m; ~  T# B; U. M
- b9 i; X- G! A4 E
    当overcommit_memory=2的时候,它一般是代表的是系统中总的内存的百分比) \; h0 q9 ]" Y- Q) Z( w0 u) s

* N2 u) t( D* r8 Y  q9 a/ S: v8 \. d' {; I6 E( d

# b) p9 P8 A( `3 f* z1 M! E. F( n4. 虚拟内存
! A2 _# C4 Z. Q) C6 i" `# q+ r4 V$ w+ ?7 I) B
  CommitLimit = SwapTotal + MemTotal * overcommit_ratio+ @7 {% Y2 B9 Q, G3 `6 J

1 k9 o  \' N$ D! q% P  总的虚拟内存 = 总的交换分区 + 总的物理内存 * overcommit_ratio# f) E3 ^/ a) ?$ N( \4 j0 c

& }/ g* j7 c2 D( a  这些信息可以到cat  /proc/meminfo中看到,  可以通过上述的计算公式可以计算就可以获得系统的CommitLimit的值$ Y9 d  o) R. t) X5 Y$ w) B

& Q( n+ Q7 u+ S5 T2 b  `* ]1 {9 _
; {. n1 i) S+ D# d# I; U- l, v/ J0 H' ]4 t% J
5. Committed_AS:是什么?
" u+ T7 x9 w. B, z( p* {# W* |% ^" V) N# j5 E; v
  Committed_AS代表了系统已经用了的内存情况
& {; a, v* t, w1 m4 O7 t
- C& l6 N- V6 U4 q2 F% ?* Y3 e6 c4 s" `( a- U* O
6.  overcommit_memory的系统默认值是0, overcommit_ratio的默认值是50。可以实际中会遇到相同配置的电脑,相同的程序一个可以申请到内存,一个不可一申请到。这时候可以看看overcommit_memory的值是否被修改了。
4 t2 V- f/ ~1 l* Y, P" |! L
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 04:28 , Processed in 0.016725 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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