scheduler05

测试程序

$ cat multithread.c 
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <sys/types.h>

void* thread_fun(void* param)
{
    printf("thread pid:%d, tid:%lu\n",getpid(), pthread_self());
    while(1);
}

int main(int argc, char *argv[])
{
    int n = atoi(argv[1]);
    pthread_t tid[n];
    int i;

    printf("main pid:%d, tid:%lu\n",getpid(), pthread_self());

    for (i = 0; i < n; i++)
        pthread_create(&tid[i],NULL,thread_fun,NULL);

    for (i = 0; i < n; i++)
        pthread_join(tid[i],NULL);

    return 0;
}

autogroup disabled

通过如下命令,关闭autogroup功能

然后执行如下命令,一个进程有4个线程,另一个进程有8个线程,4线程的CPU% : 8线程的CPU% = 1 : 2

将两个进程分别放入A与B群,因为默认A群与B群的权重都是1024,CFS调度算法平分CPU%给两个群,如下:

将A群权重设置为512,即 A群的权重 : B群的权重 = A群的CPU% : B群的CPU% = 1 : 2

将A群的最大CPU%设置为110% ,B群的最大CPU%设置为10%

autogroup enabled

通过如下命令,开启autogroup功能,每一个session就会自动创建一个cgroups,像ubntun的session就是bash。

开启autogroup功能后

Android和cgroup

Docker和cgroup

Docker使用cgroup调配容器的CPU资源

systemd和cgroup

默认时,不创建新cgroups,位于/cgroups下,如下:

如下,此时会创建新cgroups,设置新cgroups的最大CPU%为25%

修改新cgroups的权重为600,最大内存为500M,如下:

以上设置都是通过命令行操作,实际操作中都是在/lib/systemd/system/*.service文件配置,系统开机后自动加载服务。

cpuset和cgroup

cpusets提供了一种Linux内核机制来约束一个进程或一组进程使用哪些cpu和内存节点。

The root cpuset contains all the systems CPUs and Menmory Nodes

cpuset.cpus : list of CPUs in that cpuset

cpuset.mems : list of Memory Nodes in that cpuset

此方法一般用在NUMA服务器中,设置某进程只能在某CPU和某内存中工作,如下:

Last updated

Was this helpful?