进程克隆后CPU亲和性问题:CLONE_THREAD下sched_setaffinity失效排查
问题出在哪?
你用CLONE_THREAD调用clone()的时候,根本没创建独立进程,而是造出了同一个线程组里的轻量级线程——这就是核心问题,导致亲和性设置无效的原因有两个:
普通调度策略下,线程组共享亲和性
默认的分时调度(SCHED_OTHER)里,同一个线程组的所有线程必须共用同一个CPU亲和性掩码。哪怕你调用sched_setaffinity(gettid(), ...)指定单个线程,系统也会直接忽略,因为线程组的全局亲和性优先级更高。亲和性的继承规则
不管是父进程先设亲和性再建线程,还是线程后调用设置,子线程都会继承线程组的亲和性。在普通调度策略下,单个线程根本没法跳出这个继承规则,设置自己独立的亲和性。
怎么解决?
换成实时调度策略
要是非得给单个线程设独立亲和性,得先把线程的调度策略改成实时类型(SCHED_FIFO或SCHED_RR),代码示例如下:struct sched_param param = { .sched_priority = 1 }; // 实时优先级得在1-99之间 // 先切换调度策略 if (sched_setscheduler(gettid(), SCHED_FIFO, ¶m) == -1) { perror("sched_setscheduler failed"); exit(EXIT_FAILURE); } // 再绑定单个线程到指定核心 cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(1, &cpuset); // 这里改成你要绑定的核心编号 if (sched_setaffinity(gettid(), sizeof(cpu_set_t), &cpuset) == -1) { perror("sched_setaffinity failed"); exit(EXIT_FAILURE); }注意:切换实时调度需要程序有
CAP_SYS_NICE权限,要么用sudo跑,要么给程序加对应的权限位。能不用CLONE_THREAD就别用
如果业务允许去掉CLONE_THREAD标志,那创建的就是独立进程,每个进程都能自由设置自己的CPU亲和性,完全不受线程组的限制。
内容的提问来源于stack exchange,提问作者mEm
相关产品推荐
相关产品推荐

