当前位置:首页 > 文章列表 > 文章 > linux > Linux cgroup v2 pids.max 到底限制了谁:pids.current、pids.events 与 TasksMax 联动排查
Linux cgroup v2 pids.max 到底限制了谁:pids.current、pids.events 与 TasksMax 联动排查
线上服务还能正常读写磁盘,内存和 CPU 也没跑满,却突然报“无法创建新线程”。这类故障很容易被误判成应用线程池问题;如果进程所在的 cgroup 触到了任务数上限,新的线程或子进程同样会被内核直接拒绝。先看 pids.current、pids.max 和 pids.events,再确认服务管理器的 TasksMax=,通常几分钟就能判断限制来自哪一层。
pids.current接近或超过pids.max,同时pids.events的max增长,才说明 cgroup PID 限制真正参与了故障;只查到线程池配置异常,并不能证明它就是根因。
要点速览
pids.current统计当前 cgroup 及其所有子层级,不只是看直属进程。pids.peak能补上“现在指标已经降下来”的历史触发证据。pids.events默认可能包含子树触发的事件,pids.events.local只统计本组触发的事件。- 服务管理器托管的 unit 优先检查
TasksMax=与对应 unit 的实际 cgroup 路径。
先把“线程创建失败”与 PID 上限对上
Linux cgroup v2 的 PID controller 管的是内核任务总数,线程也被算在统计范围内。应用日志里常见的现象是线程创建返回失败、短时间重试后服务降级,或者独立的 worker 进程无法正常拉起。此时不要上来就把 ulimit -u 调大:那是用户级限制,和 cgroup 的 pids.max 是两条完全独立的校验链路。
先找到服务对应的 cgroup 路径:
unitctl show order-worker.service -p ControlGroup -p TasksMax
unitctl status order-worker.service --no-pager
假设返回路径是 /service.slice/order-worker.service,再读取对应文件夹下的文件:
CG=/sys/fs/cgroup/service.slice/order-worker.service
cat "$CG/pids.current" "$CG/pids.max" "$CG/pids.peak"
cat "$CG/pids.events" "$CG/pids.events.local"

四个关联文件要一起看,避免误判
pids.max:硬上限,不是参考建议值
非根 cgroup 才有可写的 pids.max,默认值通常是 max。它限制的是该层级能容纳的任务总数;父级如果设置了更小的值,子级写得再大也绕不过父级的更严格限制。临时把值改得比当前任务数更小,还可能出现 pids.current > pids.max 的现象,因为整理进程或迁移进程不会被这个策略拦截,真正被拒绝的只有后续新创建的任务。
pids.current:包含后代任务,别只数主进程
一个主 worker 自己只有几十个进程,不代表整个服务只占用了几十个任务额度。它启动的子 worker、脚本进程以及内部所有线程都会落在这个统计范围内。发现数值异常时,顺手看一眼直属成员和下属子 cgroup:
cat "$CG/cgroup.procs" | wc -l
find "$CG" -mindepth 1 -maxdepth 1 -type d -print
前一条命令只是直属进程的粗略数量,不能替代 pids.current 的统计结果;两者差距很大时,通常说明大量线程或者后代 cgroup 正在消耗额度。
pids.peak:故障已经过去,也能留下有效线索
如果告警到达时服务已经自动回收了多余 worker,pids.current 可能已经恢复到正常水平。这时 pids.peak 可以证明它曾经冲到过更高的水位。把它和应用日志的时间、worker 数量变化放在一起对照,比单看当前值可靠得多。
pids.events 与 pids.events.local:统计层级口径不同
pids.events 的 max 记录触及上限的总次数;在默认语义下,父 cgroup 的统计可能包含子树所有节点发生的限制事件。需要确认“到底是哪一级自己撞的上限”时,再读取 pids.events.local 的内容。如果 max 一直是 0,就不要仅凭“线程创建失败”四个字把问题归给 cgroup。
服务管理器的 TasksMax=是最常见的配置入口
由服务管理器托管的服务,不建议直接修改运行中的 cgroup 文件作为长期修复方案。先查看 unit 的实际生效属性:
unitctl show order-worker.service -p TasksMax -p ControlGroup
unitctl cat order-worker.service
如果 unit 文件或者 drop-in 配置中存在 TasksMax=128,而服务的线程池、子进程数量已经接近这个值,优先在 drop-in 配置中调整数值,同时保留旧的配置记录:
sudo unitctl edit order-worker.service
[Service]
TasksMax=512
保存后重载配置并重启服务,再检查实际生效值和事件计数:
sudo unitctl daemon-reload
sudo unitctl restart order-worker.service
unitctl show order-worker.service -p TasksMax -p ControlGroup
CG=/sys/fs/cgroup/service.slice/order-worker.service
cat "$CG/pids.current" "$CG/pids.max" "$CG/pids.peak" "$CG/pids.events"

修复后怎么判断是真的恢复正常
不要只看服务状态变成 active (running) 就认为问题搞定了。至少留四组校验证据:
- 配置:
unitctl show返回的TasksMax和预期配置一致。 - 路径:
ControlGroup指向正在运行的 unit,而不是旧版本残留或者临时 scope。 - 容量:
pids.current明显低于pids.max,新的 worker 能正常创建出来。 - 事件:观察窗口内
pids.events的max不再增长,业务日志里的线程创建失败也完全停止。
如果只改了 unit 配置,却发现 cgroup 的 pids.max 仍然没有变化,先确认服务管理器是否重新创建了服务对应的 cgroup,以及上级 slice 是否还有更小的 TasksMax=。PID 限制是层级生效的,子级放宽不能覆盖祖先节点更严格的限制。
常见误区和回滚边界
第一,别把 pids.max 当成“进程数报警阈值”。它是硬限制,设置得太贴近日常峰值会把一次正常发布或者流量突增变成线程创建失败。第二,别只看 pids.current 的瞬时值;如果峰值已经回落,pids.peak 和事件计数才是定位根因的关键。第三,别只在 unit 文件里搜配置,drop-in、slice 和模板服务都可能改变最终生效值。
回滚时恢复原来的 TasksMax,再次执行 daemon-reload 和服务重启,然后保留一段观察窗口。如果服务后续仍需更多任务额度,应该先拆分 worker、限制子进程增长或者调整发布并发,再决定是否提高硬上限,而不是无限制地写成 infinity 或者依赖重启临时缓解问题。
相关问题
pids.max 和 ulimit -u 有什么区别?
pids.max 按 cgroup 层级限制任务数,ulimit -u 按用户身份限制可创建的进程/线程数;其中一个放宽后,另一个仍可能拒绝新任务的创建请求。
pids.current 超过 pids.max 一定是配置失效吗?
不一定。手动降低上限或者迁移现有进程可能让当前值暂时超过上限;这个策略主要是阻止后续的新任务创建调用,不会主动清理已经存在的任务。
为什么 pids.events 有 max 计数,但本服务没有撞限制?
父 cgroup 的事件统计可能包含子树节点触发的记录。需要定位本组触发情况时同时读取 pids.events.local,并确认读取的是当前 unit 的实际 cgroup 存储路径。
只重启服务能解决问题吗?
重启会清掉旧任务,可能让 pids.current 暂时下降,但不会改变 TasksMax 或者祖先 cgroup 的硬限制;它只能作为临时恢复动作,不能替代配置调整和容量分析。
遇到“资源看着都够用,却不能创建新任务”时,按 ControlGroup → pids.max → pids.current/pids.peak → pids.events.local → TasksMax 的顺序检查,拿到的证据会比盲目调大线程池更快完成故障闭环。
Linux epoll ET 模式为什么会漏事件:非阻塞读取、EAGAIN 与 EPOLLONESHOT
- 上一篇
- Linux epoll ET 模式为什么会漏事件:非阻塞读取、EAGAIN 与 EPOLLONESHOT
- 下一篇
- Python sqlite3 autocommit 怎么切换:LEGACY_TRANSACTION_CONTROL 与提交回滚边界
-
- 文章 · linux | 11小时前 | Linux · 系统调用 · 故障排查 · 文件安全 · 路径解析 · Linux 路径解析 openat2 RESOLVE_BENEATH RESOLVE_IN_ROOT
- Linux openat2 怎么守住目录边界:RESOLVE_BENEATH、RESOLVE_IN_ROOT 与 EAGAIN 重试
- 356浏览 收藏
-
- 文章 · linux | 11小时前 | Linux · 故障排查 · 文件系统 · inotify · 事件队列 · Linux inotify IN_Q_OVERFLOW max_queued_events 文件变更监听
- Linux inotify 队列溢出怎么定位:IN_Q_OVERFLOW、max_queued_events 与恢复
- 428浏览 收藏
-
- 文章 · linux | 11小时前 |
- Linux epoll ET 模式为什么会漏事件:非阻塞读取、EAGAIN 与 EPOLLONESHOT
- 416浏览 收藏
-
- 文章 · linux | 13小时前 |
- Linux cgroup v2 io.max 设备号怎么核对:NVMe 批处理限速与 io.stat 复测
- 453浏览 收藏
-
- 文章 · linux | 13小时前 |
- Linux cgroup v2 磁盘 I/O 限流怎么配:io.max、io.stat 与回滚验收
- 353浏览 收藏
-
- 文章 · linux | 13小时前 |
- Linux cgroup v2 内存限流怎么判读:memory.high、memory.max 与 memory.events 实战
- 486浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ljg-skills
- ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
- 4950次使用
-
- MELO音乐
- MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
- 4517次使用
-
- UniScribe
- UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
- 4463次使用
-
- 剧云
- 剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
- 4707次使用
-
- 万象有声
- 万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
- 4661次使用
-
- Linux搭建vsftpdFTP服务器教程
- 2026-04-30 501浏览
-
- Shell脚本安装教程:.sh一键安装指南
- 2026-03-16 501浏览
-
- Linux清空文件内容的几种方法
- 2025-12-01 501浏览
-
- Linux命令行下载文件技巧
- 2025-11-23 501浏览
-
- Linuxapt与yum配置技巧全解析
- 2025-09-23 501浏览

