讲师中心 微信公众号
AI工具推荐 视频效率加速

Workerman 4.0.20 CPU 占用过高排查

风萱大大_8780

风萱大大_8780

发布时间:2026-08-09 21:28:35

|

623人浏览过

|

来源于php中文网

原创

Workerman 4.0.20 进程 CPU 持续飙高是用户态过载所致,需通过 top、pidstat 确认 %usr >75%,再用 perf record/report 和火焰图定位高频 PHP 函数,结合 strace 检查事件循环空转、Timer::count() 监控定时器泄漏、lsof 分析阻塞 I/O,并通过内存峰值日志验证 GC 压力。

workerman 4.0.20 cpu 占用过高排查

Workerman 4.0.20 进程 CPU 持续飙高至 90% 以上,top 中可见某 Worker 子进程 %CPU 长期稳定在 85–100%,响应延迟同步上升,但连接数和请求量未明显增加,说明不是正常负载所致,必须立即定位热点代码或配置缺陷。

确认是否为用户态 CPU 过高

执行 top -p $(pgrep -f "php.*start.php" | head -1),按 Shift+H 切换线程视图,观察单个线程的 CPU 占用。若主线程(TID 与 PID 相同)持续 >80%,说明是 PHP 业务逻辑或扩展调用导致;若多个线程均匀占用且 sys% 较高,则可能是内核态问题。

运行 pidstat -u 1 -p $(pgrep -f "php.*start.php" | head -1) 5,重点看 %usr 列。若该值长期 >75%,确认为用户态过载,进入下一步;若 %sys >30%,需检查系统调用频次(如 epoll_wait 轮询、sendfile 大量小包)。

定位热点函数与调用栈

对目标 Worker 进程 PID 执行:
perf record -g -p PID -a -- sleep 10,随后运行 perf report -n --sort comm,dso,symbol

重点关注符号列中出现频率最高的 PHP 函数名(如 MyService::handleMessagejson_encodepreg_match),特别是嵌套深度 ≥4 的调用链。若看到大量 gc_collect_cycleszend_mm_alloc_small,说明 GC 压力过大,大概率由频繁对象创建或未释放引用触发。

【不要跳过 perf script 导出环节】:执行 perf script > perf.out 后用 FlameGraph/stackcollapse-perf.pl perf.out | FlameGraph/flamegraph.pl > flame.svg 生成火焰图——视觉上最宽的顶部区块即为真实瓶颈,比文本报告更直观。

检查定时器与事件循环异常

方法一:strace 实时观测事件循环
执行 strace -tt -e trace=epoll_pwait,epoll_ctl,timerfd_settime -p PID 2>&1 | grep -E "(epoll_pwait|timerfd)"。若每秒输出 ≥50 行 epoll_pwait(..., 1000) = 0,说明事件循环空转——Worker 无实际任务却高频轮询,常见于 onMessage 回调中误写死循环、或 Timer::add() 创建后未 del() 导致定时器堆积。

方法二:检查定时器注册总量
在 Worker 启动脚本中插入临时监控:
Worker::$onWorkerStart = function() { \Swoole\Timer::tick(3000, function() { echo "Active timers: " . \Workerman\Timer::count() . "\n"; }); };
若该数值在 10 分钟内从 5 涨到 200+,说明存在高频创建未销毁的定时器。

【Timer::count() 返回值包含已到期但回调尚未执行的定时器】,这类“僵尸定时器”仍占事件循环资源,必须结合 onMessage/onClose 清理逻辑排查。

验证是否存在同步阻塞调用

第一步:检查代码中是否直接使用了 file_get_contentscurl_execmysqli_query 等同步阻塞函数。
第二步:用 lsof -p PID | grep -E "(REG|sock)" 查看进程打开的文件描述符类型。若出现大量 REG 类型(普通文件)且路径含日志文件、配置文件,说明可能在 onMessage 中反复读取大文件;若出现 sock 但状态为 canread 长期不变化,说明 socket I/O 卡住。

第三步:强制触发一次堆栈 dump:
kill -SIGUSR2 PID(需 Workerman 启动时启用 Worker::$daemonize = false 或调试模式),查看 workerman.log 中最后几行是否有 in /path/to/your/code.php on line X 的阻塞位置记录。

快速验证 GC 与内存压力关联

在 onMessage 回调入口处添加两行:

$before = memory_get_peak_usage(true);
gc_collect_cycles();

在回调出口处添加:

$after = memory_get_peak_usage(true);
if ($after - $before > 2 * 1024 * 1024) { file_put_contents('/tmp/big-alloc.log', date('Y-m-d H:i:s') . " +".($after-$before)."B\n", FILE_APPEND); }

运行 5 分钟后检查 /tmp/big-alloc.log。若每秒均有记录,说明单次消息处理分配了超 2MB 内存,极可能触发频繁 GC,进而拉升 CPU。此时应审查是否在循环中 new 大对象、是否用 json_decode($json, true) 解析超大 JSON 导致数组复制膨胀。

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
Workerman安装配置教程
Workerman安装配置教程

Workerman安装配置教程专题提供Workerman安装配置、WebSocket开发、TCP通信、异步编程、高并发服务搭建与PHP实时通信开发教程。

146

2026.05.20

Workerman实时通信与长连接开发教程
Workerman实时通信与长连接开发教程

WWorkerman实时通信与长连接开发教程聚合实时通信、聊天室、长连接、消息推送、AI流式输出等Workerman高并发开发内容。

182

2026.05.20

Workerman异步通信与TCP服务器开发
Workerman异步通信与TCP服务器开发

Workerman异步通信与TCP服务器开发专题整理Workerman异步通信、TCP服务、HTTP服务、WebSocket开发与高并发PHP服务器教程。

147

2026.05.20

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

0

2026.09.23

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

0

2026.09.23

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

0

2026.09.23

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

0

2026.09.22

Conan二进制包配置指南
Conan二进制包配置指南

本专题介绍Conan根据操作系统、编译器、架构和构建类型生成二进制包的方法,讲解Profile、Settings、Options及Package ID的作用,帮助管理不同平台和编译环境下的包版本。

0

2026.09.22

Conan私有仓库搭建教程
Conan私有仓库搭建教程

本专题系统的讲解Conan私有仓库的搭建流程,涵盖仓库服务部署、存储目录配置、用户认证、权限划分和远程地址添加,并介绍内部C++依赖包的上传、下载及版本维护方法。

0

2026.09.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webman中文手册
Webman中文手册

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

ThinkPHP5.1完全开发手册
ThinkPHP5.1完全开发手册

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn