我正在尝试将两个实时进程分配给两个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>