cgroup memory使用超过限制会怎样?

cgroup可以对一个进程或者一组进程使用的资源进行限制,可以限制的资源包括cpu、memory、io等。其中memory可以对内存资源进行限制,比如我们限制进程所能使用的内存最大是1G,那么当进程已经使用了1G的内存的时候,这个时候进程再申请内存会怎么样呢 ?

内存使用超过限制的时候有如下两种结果:

(1)默认情况下,内存使用超过限制,会oom(out of memory),oom的时候系统会使用SIGKILL信号将进程杀死。

(2)cgroup中也可以进行配置,oom的时候不杀死进程,此时进程进入D状态。D状态是一种睡眠态,不同于普通的睡眠态,普通的睡眠态可以被资源唤醒,也可以被信号唤醒,而D状态只能被资源唤醒,也就是说只有有内存可以使用的时候进程才会被唤醒。

参考:

使用 cgroup 时踩过的坑

linux 中进程的 D 状态和 Z 状态

1 实验代码

如下代码,每秒申请4KB的内存,内存不释放,这样随着时间的推移,进程所占有的内存就会越来越多。在代码中 p[0]=1;和p[4000]=1;写内存,之所以写内存,是因为使用malloc() 申请的内存是懒加载的,malloc()之后,内存并没有真正分配,只有写内存的时候,操作系统才会真正分配内存。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>


int main() {
  int count = 0;
  while (1) {
    printf("before malloc\n");
    char *p = (char *)malloc(4096);
    if (p) {
      p[0] = 1;
      p[4000] = 1;
    } else {
      printf("p is nullptr\n");
    }
    count++;
    printf("malloced memory %dKB\n", 4 * count);
    sleep(1);
  }
  return 0;
}

2 cgroup操作

cgroup memory 的操作在如下目录进行。

/sys/fs/cgroup/memory

在该目录下使用mkdir创建一个文件夹就相当于创建了一个cgroup,如下图所示,创建了一个 memory的controller,名字为hello。

在cgroup文件系统下创建的文件夹,并不是一个普通的空的文件夹,而是默认会生成如下的文件,这些文件也不是磁盘文件,而是可以用于配置cgroup的参数。linux内核的功能,通过文件的形式提供给用户态来使用,体现了linux“一切皆文件”的设计思想。

 

参数

说明

memory.limit_in_bytes

进程可以使用的内存的最大值

memory.memsw.limit_in_bytes

进程可以使用的内存和swap之和的最大值。

swap的意思是,当内存不够用的时候,将内存交换到磁盘上,使用LRU算法,将需要“淘汰”的内存交换到磁盘上,使用这块内存的时候再将数据从磁盘加载到内存。

memory.memsw.limit_in_bytes不能小于memory.limit_in_bytes。

对于加到cgroup中的进程,进程使用的内存总量超过memory.memsw.limit_in_bytes才算超过限制。默认情况下memory.memsw.limit_in_bytes是很大的,如果只配置了memory.limit_in_bytes,那么内存消耗完之后,便会使用swap,观察不到oom的现象。

memory.oom_control

oom开关,默认情况下当使用内存超限的时候,系统会将进程杀死;通过这个配置文件可以将oom关闭,当进程使用的内存超限的时候,进程不会被杀死,而是会切换为D状态。

memory.oom_control配置文件oom_kill_disable默认是0,也就是oom没有关闭,当使用的内存超限的时候,便会把进程杀死。如果使用如下的命令将配置设置为1,那么当内存超限时,进程不会被杀死,而是会进入D状态。

echo 1 > memory.oom_control

3 测试过程

3.1oom开启

默认情况下oom_kill_disable为0,说明oom没有disable,也就是enable的,即oom是开启的。

 实验代码编译运行,可以看到进程号是3299。

设置memory.limit_in_bytes为1048576,也就是内存限制为1MB,然后将进程加到cgroup中。

可以看到当申请1044KB的时候,进程被kill了。

 

3.2 oom disable

通过echo 1 > memory.oom_control来禁止oom。oom_kill是oom计数,即发生过几次oom,系统将进程kill的次数。

可以看到,当申请1052KB的时候,进程就不在运行了,但是这个时候,进程也没有杀死。

查看memory.oom_controol,其中under_oom显示为1,说明现在处于oom状态。

查看进程当前状态为D状态。

 

进程的内核栈如下。

 

此时如果通过配置将允许的内存配置改大,有了新的内存资源,这个时候进程会从D状态切换出来会继续运行。如果修改配置,比当前已经使用的内存还小,那么设置不成功,返回错误。

  • 19
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "memory cgroup out of memory" 的意思是内存控制组(memory cgroup)已经用尽了内存。这通常是由于系统中运行的进程使用了过多的内存,导致内存不足。需要释放一些内存或增加系统内存才能解决这个问题。 ### 回答2: memory cgroup out of memory的意思是,内存控制组(memory cgroup)已经耗尽了内存。内存控制组是Linux内核提供的一种资源管理机制,可用于对进程或进程组进行资源限制。这些资源包括内存、CPU和IO等。内存控制组指定了一个可用的内存限额,一旦进程或进程组使用的内存超过了这个限额,就出现内存不足的情况。 当出现memory cgroup out of memory错误时,它通常是由以下几个原因造成的: 1. 系统内存资源已经很紧张,没有足够的空闲内存可供使用。 2. 特定进程或进程组尝试使用超出其内存限额的内存。 3. 内存控制组的配置不正确,导致内存限额设置不合理,或者内存控制组的hierarchy(内存层次结构)可能过于复杂,导致某些进程无法正确地使用内存。 为解决这个问题,您可以尝试以下几种方法: 1. 扩大系统内存,增加可用内存资源。 2. 查找和解决内存泄漏问题,或是降低进程的内存消耗。 3. 重新配置内存控制组,调整内存限额等。 总之,内存不足是一个常见的系统问题,需要我们根据具体情况迅速找到并解决问题,以保证系统的正常运行。 ### 回答3: Memory cgroup out of memory是一个操作系统中的错误信息,它表示系统不能满足当前进程运行所需的内存,通常出现在Linux系统中。这个错误的原因是内存限制控制组(memory cgroup)已经超出了其允许的内存资源,导致当前的进程无法获取所需的内存,从而无法正常运行。 内存限制控制组是Linux系统提供的一种机制,用于限制进程的内存使用。每个进程都可以被分配到不同的内存限制控制组中,并且每个控制组都可以定义该组中进程所允许的最大内存使用量。当一个进程尝试超过其控制组允许的最大内存使用量时,就出现Memory cgroup out of memory错误。 这种错误的出现可能是因为系统内存不足,也可能是因为某些进程占用了过多的内存资源。解决这个问题的方法有很多,其中一种方法是通过增加系统内存来缓解问题。另外,也可以尝试通过调整内存限制控制组的配置,来优化系统的内存使用。同时,优化进程运行中的内存使用也是解决这个问题的关键。例如,可以减少进程的内存使用,或者通过实现内存复用等技术来优化内存的使用效率。 总之,Memory cgroup out of memory是系统资源管理中常见的错误,需要针对具体情况进行分析和优化,以保证系统的稳定性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值