cgroup限制cpu使用率

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

#include 
#include 


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

运行起来,通过top命令可以看到cpu使用率大致是100%,如下图所示:
cgroup限制cpu使用率_第1张图片

现在想限制该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。
如下所示,效果显著。
cgroup限制cpu使用率_第2张图片

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

#include 
#include 
#include 

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命令如下:
cgroup限制cpu使用率_第3张图片
可以看到,top信息显示是正常的。

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

于是修改代码如下。

#include 
#include 
#include 

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效果如下:
cgroup限制cpu使用率_第5张图片

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

你可能感兴趣的:(linux,运维,服务器)