您现在的位置是:首页 >技术交流 >如何在Linux上通过cgroup限制一个进程使用CPU和内存网站首页技术交流

如何在Linux上通过cgroup限制一个进程使用CPU和内存

XZY028 2023-06-17 04:00:02
简介如何在Linux上通过cgroup限制一个进程使用CPU和内存

Cgroup(Control Group)是 Linux 内核的一个功能,可以通过它来限制进程的 CPU 和内存占用。Cgroup 实现了对系统资源的细粒度控制和管理,可以将一组进程放入同一个 Cgroup 中,并对该 Control Group 中的所有进程共享相应的资源配额。

下面举个实际的例子,演示如何使用 Cgroup 限制一个进程的 CPU 占用率和内存使用量:

1. 首先需要安装 cgroup 工具包,在 Ubuntu 系统上可以执行以下命令进行安装: 

sudo apt-get install cgroup-bin cgmanager libcgroup-dev

2. 创建一个名为 mycg 的控制组,以限制该组中的进程的 CPU 占用率和内存使用量。在 shell 终端输入下列命令:

sudo mkdir /sys/fs/cgroup/cpu_mytainer
sudo mkdir /sys/fs/cgroup/memory_mytainer

3. 设置 cpu 资源限制:

echo "10000" > /sys/fs/cgroup/cpu_mytainer/cpu.cfs_quota_us #设置每10ms分配给cgroup桶的最大时间片值 
echo "200000" > /sys/fs/cgroup/cpu_mytainer/cpu.cfs_period_us #设置每次时间轮转过多少微秒 


    这两行代码告诉内核同时运行的程序切换超时参数,即当前可占用 10ms 内核时间,然后必须让出时间,并等待 200ms 内核时间过后再占用,以达到限制CPU使用的目地。
    
4. 设置memory资源限制:

echo "50M" > /sys/fs/cgroup/memory_mytainer/memory.limit_in_bytes #设置cgroup总共最多能够使用内存大小

这条命令表示限制 mycg 这个 Cgroup 的进程总占用内存不得超过 50MB。 

5. 创建一个新进程并将它加入 mycg 中,然后观察该进程利用率是否受到限制。例如我们创建一个死循环```c++

#include <stdio.h>

int main()
{
    while(1){
        int a=100000000,b;
        b=a/b;
    }
    return 0;
}


编译成可执行文件 test.out 并运行如下代码:

sudo cgcreate -a root:root -g cpu_mytainer,memory_mytainer:/mycg  
sudo echo $PID >>/sys/fs/cgroup/cpu_mytainer/tasks 
sudo echo $PID >>/sys/fs/cgroup/memory_mytainer/tasks  

其中 PID 是指上面循环程序 test.out 的进程 ID。

6. 使用 `ps` 命令检查进程的CPU和内存使用情况:
 

ps aux | grep test.out

你可以看到产生了类似以下的输出:
 

USER      PID    %CPU     %MEM            VSZ         RSS       TTY     STAT      START         TIME        COMMAND
root     3833    10.0     0.1           62820        2580   pts/9    R     11:56         00:00:30     ./test.out

说明测试程序的CPU使用率已经被成功限制在10%以内,而内存占用不会超过50MB。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。