写一段代码,如下所示,可以看到是单核拉满情况
#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之前设置好,进程运行后,再设置,单线程进程有效,多线程进程无效,具体原因未知。