cgroup限制cpu使用率

写一段代码,如下所示,可以看到是单核拉满情况

#include <stdio.h>
#include <pthread.h>


int main()
{
int i = 0;
for(;;)i++;
return 0;
}

运行起来,通过top命令可以看到cpu使用率大致是100%,如下图所示:
在这里插入图片描述

现在想限制该cpu使用率为20%,可以通过cgroup来限制,进入/sys/fs/cgroup/cpu,通过mkdir创建cputest目录,然后进入到该目录,这里面有两个文件需要说下:cpu.cfs_period_us和cpu.cfs_quota_us,
其中cpu.cfs_period_us为一个调度周期的时间,通过最后的us可以知道,单位为微秒,系统默认该值是100000,咱们不需要修改。
cpu.cfs_quota_us表示一个调度周期内,可以使用的cpu时间,故cpu.cfs_quota_us/cpu.cfs_period_us就是cpu使用率。
现在需要设置cpu使用率为20%,故cpu.cfs_quota_us设置为20000即可,然后执行
echo 20000 > cpu.cfs_quota_us
最后将cputest的进程号12472设置到tasks文件中,echo 12472 > tasks。
如下所示,效果显著。
在这里插入图片描述

现在将程序进行修改,创建一个线程,如下所示:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

void *th_fun(void *arg)
{
    while(1);
}


int main()
{
//sleep(100);
pthread_t pid;//线程ID
    void *tret;
    int n=10;

    pthread_create(&pid,NULL,th_fun,(void*)&n);//pid 线程ID,传出参数
    while(1);

return 0;
}

可以看到,该程序是两核拉满,top命令如下:
在这里插入图片描述
可以看到,top信息显示是正常的。

现在用cgroup将此进程的cpu利用率变为20%。
执行echo 12886 > tasks
再看top信息如下:
在这里插入图片描述
这里是120%,跟想象中的不一样,之前有研究过cgroup限制内存
,发现cgroup限制内存需要在内存涨起来之前就进行限制,cpu限制是否也有这个约束呢。

于是修改代码如下。

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

void *th_fun(void *arg)
{
    while(1);
}


int main()
{
sleep(100);
pthread_t pid;//线程ID
    void *tret;
    int n=10;

    pthread_create(&pid,NULL,th_fun,(void*)&n);//pid 线程ID,传出参数
    while(1);

return 0;
}

注意,这里面最开始有个100秒的睡眠,需要在100秒内将进程号设置到tasks中,100秒后,top效果如下:
在这里插入图片描述

原来cpu限制也需要在进程真正利用cpu之前设置好,进程运行后,再设置,单线程进程有效,多线程进程无效,具体原因未知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值