首页 > 其他分享 >cgroup memory使用超过限制会怎样?

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

时间:2024-07-07 10:56:53浏览次数:21  
标签:oom 使用 内存 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状态切换出来会继续运行。如果修改配置,比当前已经使用的内存还小,那么设置不成功,返回错误。

标签:oom,使用,内存,cgroup,memory,进程,怎样
From: https://blog.csdn.net/weixin_38184628/article/details/140224576

相关文章

  • 在注册表路径 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager
    在注册表路径HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\SessionManager\MemoryManagement下的LargeSystemCache键控制着操作系统如何管理系统缓存和内存分配,不同的数值对应不同的行为和设置。LargeSystemCache参数详解0(默认值):效果:系统将系统缓存减少到最......
  • 在注册表路径 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Man
    在注册表路径HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\MemoryManagement下的DisablePagingExecutive键控制着操作系统内核数据是否允许分页到页面文件中。这个设置对系统性能和稳定性有重要影响,特别是在高负载和内存紧张的情况下。DisablePagi......
  • 本地Windows10怎样配置免安装版本MySQL?
    下载MySQL免安装压缩包下载地址:https://downloads.mysql.com/archives/community/解压安装1、接下来我们解压文件夹,这时我们解压的文件夹是没有my.ini文件和data目录,这时我们需要自己创建my.ini文件,data文件后期回自动生成2、新建配置my.ini文件,并添加配置信息,如下:[mysqld]#......
  • 泛娱乐出海新风口,视频云技术需要怎样的融合创新?
      泛娱乐的音视频技术随着出海在演进,交互和内容的技术是内核,也在融合。 面向出海,虽然娱乐社交这个行业由来已久,但近几年的商业模式发生了巨大变化,比如行业刚兴起时,大家要先把DAU做大之后再找商业盈利的模式,但是现在要考虑如何在目标客群下找到用户痛点,从而快速实现变现......
  • allocator、polymorphic allocator 与 memory_resource
    allocator、polymorphicallocator与memory_resourcecppallocatorCreated:2024-07-04T10:59+08:00Published:2024-07-05T11:27+08:00Categories:C-CPPcustomallocatorstd::allocator是无状态的,实测最简单的allocator只需要:value_typeallocatedeallocaterebi......
  • 内存管理-14-内核文档翻译-1-reserved-memory.txt
    本文翻译自:msm-5.4/arch/arm64/boot/dts/vendor/bindings/reserved-memory/reserved-memory.txt***Reserved内存区域***保留内存被指定为/reserved-memory节点下的一个节点。操作系统应将保留内存排除在正常使用之外,可以创建子节点来描述特定的保留(从正常使用中排除)内存区域......
  • 你想活出怎样的人生?
    hi~好久不见,距离上次发文隔了有段时间了,这段时间,我是裸辞去感受了一下前端市场的水深火热,那么这次咱们不聊技术,就说一说最近这段时间的经历和一些感触吧。先说一下自己的个人情况,目前做前端四年,双非本,非科班,技术栈Vue和小程序,读过源码,刷过算法,写过开源,工作地点在武汉。我......
  • 03 | 大规模数据处理初体验:怎样实现大型电商热销榜?
    今天要与你分享的主题是“怎样实现大型电商热销榜”。在Google面试过很多优秀的候选人,应对普通的编程问题coding能力很强,算法数据结构也应用得不错。可是当我追问数据规模变大时该怎么设计系统,他们却说不出所以然来。这说明他们缺乏必备的规模增长的技术思维(mindsetofs......
  • 面试官:JVM调优,主要针对是哪一个区域?JVM内存结构是怎样的?
    作为一个Java程序员,在日常的开发中,不必像C/C++程序员那样,为每一个内存的分配而操心,JVM会替我们进行自动的内存分配和回收,方便我们开发。但是一旦发生内存泄漏或者内存溢出,如果对Java内存结构不清楚,那将会是一件非常麻烦的事情!本文笔者将为大家详解Java内存结构。面试tips聊聊......
  • No native JavaCPP library in memory. (Has Loader.load() been called?)
    Exceptioninthread"main"java.lang.RuntimeException:NonativeJavaCPPlibraryinmemory.(HasLoader.load()beencalled?) atorg.bytedeco.javacpp.BytePointer.<init>(BytePointer.java:103) atorg.bytedeco.javacv.Frame.<init>(Frame......