当前位置:首页 > 文章列表 > 文章 > linux > Linux cgroup v2 pids.max 到底限制了谁:pids.current、pids.events 与 TasksMax 联动排查

Linux cgroup v2 pids.max 到底限制了谁:pids.current、pids.events 与 TasksMax 联动排查

来源:17golang原创 2026-08-18 14:40:32 0浏览 收藏

线上服务还能正常读写磁盘,内存和 CPU 也没跑满,却突然报“无法创建新线程”。这类故障很容易被误判成应用线程池问题;如果进程所在的 cgroup 触到了任务数上限,新的线程或子进程同样会被内核直接拒绝。先看 pids.currentpids.maxpids.events,再确认服务管理器的 TasksMax=,通常几分钟就能判断限制来自哪一层。

pids.current 接近或超过 pids.max,同时 pids.eventsmax 增长,才说明 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"
Linux cgroup v2 pids.current pids.max pids.peak 和 pids.events 的限制证据链
从当前任务数、历史峰值到 max 事件,先确认限制是否真的触发过。

四个关联文件要一起看,避免误判

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.eventsmax 记录触及上限的总次数;在默认语义下,父 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"
服务管理器 TasksMax 调整后核对 cgroup 路径、当前任务数和事件计数
修改 unit 后从实际属性、cgroup 文件和业务恢复三处分别做验收。

修复后怎么判断是真的恢复正常

不要只看服务状态变成 active (running) 就认为问题搞定了。至少留四组校验证据:

  • 配置:unitctl show 返回的 TasksMax 和预期配置一致。
  • 路径:ControlGroup 指向正在运行的 unit,而不是旧版本残留或者临时 scope。
  • 容量:pids.current 明显低于 pids.max,新的 worker 能正常创建出来。
  • 事件:观察窗口内 pids.eventsmax 不再增长,业务日志里的线程创建失败也完全停止。

如果只改了 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 的顺序检查,拿到的证据会比盲目调大线程池更快完成故障闭环。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Linux epoll ET 模式为什么会漏事件:非阻塞读取、EAGAIN 与 EPOLLONESHOTLinux epoll ET 模式为什么会漏事件:非阻塞读取、EAGAIN 与 EPOLLONESHOT
上一篇
Linux epoll ET 模式为什么会漏事件:非阻塞读取、EAGAIN 与 EPOLLONESHOT
Python sqlite3 autocommit 怎么切换:LEGACY_TRANSACTION_CONTROL 与提交回滚边界
下一篇
Python sqlite3 autocommit 怎么切换:LEGACY_TRANSACTION_CONTROL 与提交回滚边界
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ljg-skills -
    ljg-skills
    ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
    4950次使用
  • MELO音乐 - AI 音乐生成平台,支持多模态创作能力
    MELO音乐
    MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
    4517次使用
  • UniScribe - AI 免费在线音视频转文字平台
    UniScribe
    UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
    4463次使用
  • 剧云 - 免费 AI 智能中文剧本创作平台
    剧云
    剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
    4707次使用
  • 万象有声 - AI 一站式有声内容创作平台
    万象有声
    万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
    4661次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码