实时、SCHED_FIFO、CPU_SET()

实时、SCHED_FIFO、CPU_SET()

我正在尝试将两个实时进程分配给两个CPU(每个CPU)。我正在使用 SCHED_FIFO 调度策略。我正在做以下事情:

  • 在 /etc/default/grub 中的 GRUB_CMDLINE_LINUX_DEFAULT 添加“quiet Splash isolcpus = 6,7”以隔离 cpu。我重新启动了系统,除了在 6 和 7 个 cpu 上运行的一些内核线程之外,它似乎可以工作(我使用 top 命令执行此操作)。
  • 然后这个:

    retval = sched_getattr(0, &attr, sizeof(struct sched_attr), 0);

    if(retval < 0){perror("Error in get attr:");return0;}
    

    attr.sched_policy = SCHED_FIFO;

    attr.sched_priority = 1;

    retval = sched_setattr(0,&attr,0);

    if(retval<0) { perror("设置调度参数时出错:");返回0; }

    CPU_ZERO(&set);
    
    CPU_SET(7,&set);
    
    retval = sched_setaffinity(0,sizeof(cpu_set_t),&set);
        if(retval<0){perror("Affinity Error ");return 0;}
    

    我打算在cpu7上运行这个过程。但我不能这样做。为什么会失败?如果这种方法行不通,你能建议其他方法吗?

编辑:我没有创建任何额外的CPU组。 /sys/fs/cgroup中只有一个cpuset目录

答案1

尝试找出返回了哪个错误。看

man 2 sched_setaffinity 

除此之外,您(二进制文件)需要“CAP_SYS_NICE”功能来更改关联性。所以你必须

  • 以 root 身份运行该程序,或者
  • 在二进制文件上设置此功能(注意:不适用于 NFS 安装的文件系统)

在二进制文件上设置所需的功能是通过以下命令完成的

sudo setcap CAP_SYS_NICE+e <file>

相关内容