找回密码
 注册
查看: 4890|回复: 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。
% q: \  q; M& N. @* B8 s: ~0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
- y- f) t/ v: s" a. ^6 v1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
* D0 M! N) D. _! Y0 t2, 表示内核允许分配超过所有物理内存和交换空间总和的内存

9 \  v1 D4 h- P, A6 D! d- r. A  g

什么是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/ z; i# q4 Q" i6 C! H% u4 O) B' r

解决方法:

很简单,按提示的操作(将vm.overcommit_memory 设为1)即可: 有三种方式修改内核参数,但要有root权限:
  • 1
  • 2
  • 3
    5 X  Z' \7 S$ l2 x/ Q* B

(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是什么?  2 D7 ?- Y, @; H- j

' }* s; g& E- i) b      overcommit_memory是一个内核对内存分配的一种策略。 具体可见/proc/sys/vm/overcommit_memory下的值/ T0 _8 i2 d6 O7 Y, M% v

, T9 c6 G) h- C2 i" H8 x2 c     
9 F3 E& _% F- [) I2.  overcommit_memory有什么作用? 
- b! b, U# l6 ~2 O: D
' v$ u/ M) {; Q: \     overcommit_memory取值又三种分别为0, 1, 2) s4 P: c# f" \* H5 G8 j

# z1 [; B6 C' @" l* o! N+ p& t    overcommit_memory=0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
( x% ~9 X+ K' }' C    overcommit_memory=1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。" @- _( Y" S+ |$ m
    overcommit_memory=2, 表示内核允许分配超过所有物理内存和交换空间总和的内存- |3 z4 t- l2 n

! p9 v+ b  J0 ^' }6 W1 D1 U: b3.  overcommit_ratio是什么?
2 l6 a6 e6 O! b0 p9 h* E4 \6 S; R0 J3 K: E
    当overcommit_memory=2的时候,它一般是代表的是系统中总的内存的百分比. ~) s/ m3 Y0 T7 Y/ Z' Q
" z% P0 u* Z; q6 N' k! c$ @9 B

0 ?" U- p+ }3 y; `8 F8 v6 H& l7 l1 h) Q) F0 d5 [
4. 虚拟内存; f8 C- q1 \7 ~/ g

7 E# y* T2 j: x1 ^% A# A! h  CommitLimit = SwapTotal + MemTotal * overcommit_ratio
* v# f" g4 a' ^$ D. N5 C2 A0 r
( {* }. z, R1 |/ \6 m- a$ N$ U  总的虚拟内存 = 总的交换分区 + 总的物理内存 * overcommit_ratio% t% s8 n5 N" D2 Q
9 |. ^! c9 u: ~+ B6 Q
  这些信息可以到cat  /proc/meminfo中看到,  可以通过上述的计算公式可以计算就可以获得系统的CommitLimit的值
& [" e! b6 q3 w* @" U, [4 V$ {1 a0 E8 u, ^: p' Q" R4 j) K0 L2 Y

4 \2 q" f0 V( x& D" B
4 R9 W) R! W3 [& g. M# q% A5. Committed_AS:是什么?# M) N7 z$ B3 o6 p$ `9 @4 [6 L4 k
8 l# j& D2 m) m5 R" t
  Committed_AS代表了系统已经用了的内存情况: o# V, d7 U: p! m' i7 r# W3 G
5 x; _2 h3 F$ c8 S+ e; i+ _0 l) [4 ~
6 q9 M- o9 y) U6 b# E
6.  overcommit_memory的系统默认值是0, overcommit_ratio的默认值是50。可以实际中会遇到相同配置的电脑,相同的程序一个可以申请到内存,一个不可一申请到。这时候可以看看overcommit_memory的值是否被修改了。% v+ P4 h4 O# L8 O! c7 n8 V
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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