Ubuntu下限制进程使用内存资源的方法(cgroup)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ubuntu下限制进程使用内存资源的方法(cgroup)相关的知识,希望对你有一定的参考价值。

参考技术A 最近由于项目的需要,跑某个程序的时候需要限制其内存资源的使用,例如限制某个进程只能使用1G的内存资源。

这时候有几种可选的方法,一种就是使用限制内存条件的物理机器,比如你限制4G内存那我就用只有4G内存的机子。但是这种情况不方便,也不灵活,如果限制1G,甚至更小的内存资源呢,上哪去找符合这样条件的物理机器呢?因而从硬件上进行限制就非常笨拙,自然而然就想到用软件的方法进行灵活的限制。

之前搜索发现,linux下的ulimit命令可以对shell进程所用资源进行限制,但是发现其中对于内存资源使用的命令"-m"只对linux内核版本2.x的才有效,之后版本的都已经无效的。(怪不得我说跑的时候咋一点作用都没有,也算是替大家踩坑了...)

后来发现还有一种方法就是使用cgroup来对资源进行限制,推荐!!

下面讲一下Ubuntu上使用cgroup限制进程内存的方法:

1、安装命令

2、进入相应的目录,一般会下如下所示的位置中:

3、在该目录下创建自己的组目录

会看到在该目录下面会有很多文件,而我们只需要用到其中memory.limit_in_bytes文件

4、限制内存大小,写入memory.limit_in_bytes文件

这里1G默认单位是B,也就是你写成1*1024*1024也是一样的

5、具体使用

这里test就是上面第3步,我们在/sys/fs/cgroup/memory/目录下自己创建的组目录,然后之后跟上要执行的命令,就可以对执行的命令进行内存资源限制啦!

docker资源限制

默认情况下一个docker容器是没有任何资源限制的,因此它可以耗尽内核分配给docker容器的所有资源

在这种情况下,docker给我们提供了可以控制容器可以使用多少内存,cpu,cpu属于可压缩资源,而内存属于非可压缩资源,这也就意味着,如果内存耗尽将会OOME(Out Of Memory Exception),一旦发生OOME,任何进程都有可能被杀死,包括docker daemon在内,为此Docker特地调整了docker daemon的OOM优先级,以免它被内核“正法”,但容器的优先级并未被调整

-m or --memory=:限制内存资源大小单位可以是k,M,G

--memory-swap *:限制交换分区大小,前提是必须先要设置-m才可以在设置--memory-swap

--memory-swap --memory 功能
正数S 正数M 容器可用总空间为S,其中内存为M,swap为(S-M),若S=M,则无可用swap资源
0 正数M 相当于未设置swap(unset)
unset 正数M 若主机(Docker Host)启用了swap,则容器的可用swap为2*M
-1 正数M 若主机(Docker Host)启用了swap,则容器可使用最大主机上所有swap空间的swap资源
注意   在容器内使用free命令可以看到的swap空间并不具有其所展现出的空间的意义

以上是关于Ubuntu下限制进程使用内存资源的方法(cgroup)的主要内容,如果未能解决你的问题,请参考以下文章

windows限制进程可以使用的资源cpu 内存

重学容器31: 容器资源限制之限制容器的内存

Ubuntu使用top command监测CPU、内存使用情况

ubuntu查看系统资源占用(内存,cpu和进程)

docker资源限制

Linux 查看占用资源cpu内存最大的进程命令