为何调用cpuset_getaffinity查询进程可用CPU会返回全部系统CPU?
关于cpuset_getaffinity返回全CPU集合的原因及进程无法使用全部CPU的场景
你使用cpuset_getaffinity查询进程可用CPU的代码如下:
cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, getpid(), sizeof(*cpuset), cpuset);
查询返回系统所有CPU是默认行为:Linux系统中,新创建的进程默认没有CPU亲和性限制,其可运行的CPU集合就是系统的全部在线CPU,所以查询结果自然包含所有CPU。你的代码调用逻辑是正确的,返回的就是当前进程实际允许运行的CPU范围。
以下是进程无法使用全部CPU的常见场景:
- 显式设置CPU亲和性:通过
sched_setaffinity、cpuset_setaffinity等系统调用,或者taskset、cset等命令行工具,将进程绑定到特定的CPU子集,此时进程只能在指定CPU上运行 - cgroup资源限制:通过cpuset类型的cgroup为进程组分配了有限的CPU集合,进程会被限制在这个集合内运行,常见于容器、虚拟化环境或资源管控场景
- NUMA架构约束:如果进程被绑定到某一NUMA节点(比如通过
numactl工具),而该节点只包含部分CPU,进程无法跨NUMA节点使用其他CPU - CPU隔离或离线:内核启动时通过
isolcpus参数隔离了部分CPU,或者部分CPU被标记为离线状态,普通进程无法使用这些隔离/离线的CPU - 容器环境限制:Docker、Kubernetes等容器平台会通过配置(如
--cpuset-cpus参数)限制容器内进程可使用的CPU,进程只能使用分配的核心 - 实时进程调度限制:部分实时调度策略下,可能会将进程绑定到特定CPU以保证实时性,此时进程无法使用其他CPU
内容的提问来源于stack exchange,提问作者Brave
相关产品推荐
相关产品推荐

