0

0

Linux taskset / cpuset 的进程 CPU 绑定与 cgroup cpuset 冲突解决

冰川箭仙

冰川箭仙

发布时间:2026-02-25 10:04:40

|

408人浏览过

|

来源于php中文网

原创

taskset 和 cgroup cpuset 同时生效时,进程最终只能运行在两者 cpu 集合的交集上;/proc//status 中的 cpus_allowed_list 即为该交集结果,是调度器实际遵循的唯一依据。

linux taskset / cpuset 的进程 cpu 绑定与 cgroup cpuset 冲突解决

taskset 和 cgroup cpuset 同时生效时,谁起作用?

taskset 和 cgroup v1/v2 的 cpuset 同时配置,进程最终能跑在哪些 CPU 上,取决于两者的交集——不是“覆盖”,也不是“优先级高低”,而是硬性取交集。内核调度器会在两者共同允许的 CPU 集合里选核,超出任一限制都会被拒绝。

常见错误现象:taskset -c 0-3 ./app 启动后,top -H 显示线程仍在 CPU 4 上运行;或者 cat /proc/<pid>/status | grep Cpus_allowed</pid> 返回的掩码比预期窄得多——这往往是因为父进程所属的 cgroup cpuset.cpus 已经锁死了可用范围(比如只允许 CPU 2,3),此时 taskset 再怎么指定 0-3 也无效。

  • 使用场景:容器环境(Docker/K8s)中手动调试进程时,容易忽略宿主机或 Pod 级别的 cpuset 限制
  • taskset 是 per-process 的运行时设置,不持久;cgroup cpuset 是 per-cgroup 的资源边界,对所有子进程继承生效
  • 验证顺序建议:先查 cat /proc/<pid>/cgroup</pid> 确认所属 cgroup 路径,再读该 cgroup 下的 cpuset.cpuscpuset.effective_cpus

如何判断当前进程是否被 cgroup cpuset 实际限制?

别只看 taskset -p <pid></pid>,它只反映进程自身的 CPU 掩码,不体现 cgroup 层面的裁剪。真正决定调度权的是 /proc/<pid>/status</pid> 中的 Cpus_allowed_list 字段——这个值已经是 taskset 和 cgroup 取交集后的结果。

常见错误现象:执行 taskset -p <pid></pid> 显示 “0-7”,但 cat /proc/<pid>/status | grep Cpus_allowed_list</pid> 返回 “2-3”,说明 cgroup 已生效且更严格。

PatentPal专利申请写作
PatentPal专利申请写作

AI软件来为专利申请自动生成内容

下载
  • Cpus_allowed_list 是最终生效值,必须以它为准
  • cgroup v1 路径通常为 /sys/fs/cgroup/cpuset/<path>/</path>;cgroup v2 统一挂载在 /sys/fs/cgroup/ 下,需通过 cat /proc/<pid>/cgroup</pid> 找到对应子目录
  • 如果 cpuset.effective_cpus 为空(或为 0),进程会被冻结——这是容易被忽略的静默故障点

想绕过 cgroup cpuset 限制,只有这三种可行路径

没有“禁用”接口,只有规避方式。强行改 cpuset.cpus 可能导致容器崩溃或 K8s 驱逐,慎用。

  • 把进程移到根 cgroup:echo <pid> > /sys/fs/cgroup/cpuset/cpuset.procs</pid>(v1)或 echo <pid> > /sys/fs/cgroup/cgroup.procs</pid>(v2),前提是进程有权限写入目标 cgroup
  • 启动前清空父 cgroup 限制:若你控制启动环境(如 systemd service),可在 [Service] 段加 CPUSchedulingPolicy=other 并显式设置 CPUSchedulingPriority=0,同时确保未启用 AllowedCPUs= 类配置
  • unshare --user --pid --fork --mount-proc /bin/bash 创建新 user+pid namespace,再在其中运行 taskset——cgroup 权限随 namespace 重置,但仅适用于调试,不可用于生产服务

cpuset 和 taskset 混用时的性能陷阱

看似“更细粒度控制”,实则容易引发 NUMA 不匹配、缓存抖动和调度延迟升高。尤其当 taskset 把线程绑在某个 CPU,而该 CPU 所属 NUMA node 的内存带宽已被 cgroup 其他进程占满时,延迟可能翻倍。

常见错误现象:绑定后吞吐没升反降,perf stat -e cycles,instructions,cache-misses 显示 cache-misses 暴涨;numastat -p <pid></pid> 显示跨 NUMA 内存访问占比异常高。

  • cgroup cpuset 默认不感知 NUMA topology,cpuset.mems 必须显式设置才能绑定内存节点
  • taskset 不处理内存亲和,纯 CPU 绑定 + 缺失 cpuset.mems = 高概率跨 NUMA 访存
  • 多线程程序慎用 per-thread taskset:glibc 的 malloc、信号处理等后台线程仍受 cgroup 限制,可能卡在非预期 CPU 上
实际调优时,要么全用 cgroup cpuset 做统一资源划分,要么彻底脱离 cgroup 环境再用 taskset——混合模式下最麻烦的从来不是配置写法,而是排查时得同时盯住三个地方:/proc/pid/status、对应 cgroup 的 cpuset.cpuscpuset.effective_cpus、以及 NUMA 拓扑对齐情况。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

智谱清言 - 免费全能的AI助手
智谱清言 - 免费全能的AI助手

智谱清言 - 免费全能的AI助手

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1651

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

505

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2308

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

40

2026.01.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

720

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

371

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

25

2026.01.21

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

0

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 9.6万人学习

Git 教程
Git 教程

共21课时 | 3.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号