找回密码
 注册
查看: 4892|回复: 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。
, V0 ?) g2 k; S" ?0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
8 R9 J& @9 K3 H, i2 |& Q( I4 X9 J1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
  B) y2 ^0 U0 q/ b4 o2, 表示内核允许分配超过所有物理内存和交换空间总和的内存

/ X: n/ F/ a( E! }5 |% |6 |$ q; {& c

什么是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
  • 34 o% ?) S0 r! r: b: [- O2 Z

解决方法:

很简单,按提示的操作(将vm.overcommit_memory 设为1)即可: 有三种方式修改内核参数,但要有root权限:
  • 1
  • 2
  • 3/ R- q' K" b5 \& ~

(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是什么?  # O' h& s9 a; \' j9 v2 |  p/ h

7 I+ B, [* x3 k6 B1 S' l9 J! s) U      overcommit_memory是一个内核对内存分配的一种策略。 具体可见/proc/sys/vm/overcommit_memory下的值
4 M1 l5 [$ M8 _  E' L& m" _; k" m6 }+ S# X& P' Z
      & r/ g, ^7 i  }, Y6 @
2.  overcommit_memory有什么作用? 
- e- y3 K! H- T8 j- }3 [
6 ^, x4 u( v- |. n" R$ H     overcommit_memory取值又三种分别为0, 1, 2
7 d( E6 x5 I7 x1 k+ q) U# F1 O  f' l! ~  e" Q
    overcommit_memory=0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。( a8 ]! z+ g7 M* }
    overcommit_memory=1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
9 |- g& M& @* _) m  N    overcommit_memory=2, 表示内核允许分配超过所有物理内存和交换空间总和的内存
9 A8 B$ l3 q7 O6 F! i$ M$ e. u' ?
% w5 t- k- X1 V% G8 Q  {3.  overcommit_ratio是什么?
9 O1 [5 {; ~, Q* b/ m
/ v# l) S7 x; C8 l( t) p( C    当overcommit_memory=2的时候,它一般是代表的是系统中总的内存的百分比! C$ E" u2 A/ {' V
0 u2 h" T; b0 R
, D# V4 d) a- u3 n- I" n
# i* H0 c: M; V
4. 虚拟内存/ [% v2 o" U! m, K  p* V0 ^2 G

' c/ r) c: w/ ?  CommitLimit = SwapTotal + MemTotal * overcommit_ratio! A. X, ~% D3 D3 T

0 P: I1 \4 n/ Q' a; {- p  总的虚拟内存 = 总的交换分区 + 总的物理内存 * overcommit_ratio9 X$ G7 n- B1 ]2 ]* h9 D# \( T' T
( a  y0 {; k4 E( R
  这些信息可以到cat  /proc/meminfo中看到,  可以通过上述的计算公式可以计算就可以获得系统的CommitLimit的值: A# R6 P; y# v2 @1 g
8 f0 N3 b& j. \- e& Z$ |2 _: O
) r7 ]) f- w! L% z+ f

! _$ X; N! U$ \1 |* G, U/ i5. Committed_AS:是什么?$ [2 _( Q# |! o/ H

% L5 I7 N; ]$ Y( ~; k7 H9 i  Committed_AS代表了系统已经用了的内存情况
, f6 N* {; L. J( x  b8 [8 X
2 Q$ P) c' k7 i" h. k$ D
8 G* o/ v0 \$ a0 g7 m, v, ?% Z6.  overcommit_memory的系统默认值是0, overcommit_ratio的默认值是50。可以实际中会遇到相同配置的电脑,相同的程序一个可以申请到内存,一个不可一申请到。这时候可以看看overcommit_memory的值是否被修改了。
7 [& A. g- ?; d/ G' |
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 05:30 , Processed in 0.016969 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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