压测Workerman时发现单进程性能很高,多进程反而下降了为什么?

阿辰大大_3825

阿辰大大_3825

2026-05-25

676人浏览

原创

$worker->count合理值为物理核心数的1.2~1.8倍;io密集型可升至2.0倍,启用reuseport后回调至1.2~1.5倍,需同步调高net.core.somaxconn并优化路由策略防单点瓶颈。

压测workerman时发现单进程性能很高,多进程反而下降了为什么?

进程数设太多导致调度开销和锁竞争上升

Workerman 多进程不是线性叠加性能的。当 $worker->count 设得远超物理核心数(比如 32 核服务器设成 64),Linux 调度器会频繁切换进程上下文,cache line 失效变多,反而拖慢整体吞吐。更关键的是,多个 Worker 进程共享某些资源时会触发锁争抢——比如共用一个 Redis 连接池、写同一个日志文件、或访问未加锁的全局静态数组。

常见表现:
– top 看到 CPU %sy(系统态)占比异常高
– strace -c -p PID 显示大量 futex 调用
– 同一时刻多个 Worker 的 onMessage 回调里都在等同一个 file_put_contents(..., FILE_APPEND)

建议值:
– 物理核心数 × 1.2 ~ 1.8(例如 16 核 → 设 18~24)
– I/O 密集型业务(如频繁调外部 HTTP)可上浮至 ×2.0
– 若启用了 $worker->reusePort = true,可回调至 ×1.2~1.5,减少端口争抢干扰

reusePort 开了但 net.core.somaxconn 没调高

开了 $worker->reusePort = true 只是让多个 Worker 都能 bind() 同一端口,但真正决定“新连接能否被内核排队接收”的,是 net.core.somaxconn 参数。默认值通常只有 128,压测时大量 SYN 包进来,超出队列长度的直接被丢弃,现象就是客户端偶发 Connection refused 或超时,看起来像“多进程没生效”。

飞桨PaddlePaddle
飞桨PaddlePaddle

飞桨PaddlePaddle是百度推出的开源深度学习平台。

下载

必须同步操作:
– 运行 sudo sysctl -w net.core.somaxconn=65535
– 写入 /etc/sysctl.conf 永久生效
– 在 Workerman listen 地址中显式加 backlog 参数:tcp://0.0.0.0:8080?backlog=65535

没做连接层负载均衡,流量全打到一个 BusinessWorker

如果你用的是 GatewayWorker 架构,压测发现只有一个 BusinessWorker 在干活,大概率是 Gateway 的路由策略没配对。默认 routerBind 是按 client_id 绑定固定 Worker,如果压测工具只建了一个 client(比如单个 WebSocket 连接反复发消息),所有请求就永远只进同一个进程。

解决方法:
– 改用 routerRand:在 Gateway.php 构造函数里设 $this->router = ['\GatewayWorker\Gateway', 'routerRand']
– 或改用 routerConsistentHash(需客户端 ID 有足够离散度)
– 压测时确保并发连接数 ≥ Worker 数,避免单连接复用掩盖问题

日志、配置、初始化逻辑塞在 onWorkerStart 里

onWorkerStart 是每个 Worker 进程启动时只执行一次,但很多人把日志初始化、大配置加载、同步 SDK 实例化全堆进去。结果是:进程数越多,重复加载越严重,内存暴涨 + 启动延迟拉长,压测刚开始就卡在初始化阶段。

典型错误:
– file_get_contents('huge_config.yaml') 在 onWorkerStart 里解析
– new AliyunOssClient(...)(同步 SDK)
– error_log('start') 或 file_put_contents('log.txt', ...) 写同步日志

正确做法:
– 配置提前解析好,存为常量或静态属性
– SDK 改用协程版(如 hyperf/oss)或延迟到 onMessage 中按需创建
– 日志走 SwooleCoroutineWriteFile 或异步队列

实际压测中,多进程性能下降往往不是某一个点的问题,而是初始化、路由、系统参数、资源争抢四层叠加的结果。最容易被忽略的是 net.core.somaxconn 和 routerBind 这两个看似“配置完就没事”的项——它们不报错,但会让压测数据彻底失真。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

workerman

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2026.05.20

186

15

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

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

2026.05.20

202

12

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

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

2026.05.20

207

13

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

2026.10.21

20

15

Playwright 页面操作指南
Playwright 页面操作指南

Playwright页面操作专题汇集元素定位、点击与输入、等待响应、多页面切换、Iframe、事件监听及文件处理的已审核文章,便于按操作场景查阅示例与常见问题。

2026.10.21

0

16

Playwright 入门教程
Playwright 入门教程

Playwright入门专题汇集测试框架安装、VS Code配置、录制脚本、编写首个用例、运行调试及查看报告的已审核文章,帮助初学者搭建端到端测试流程。

2026.10.21

0

16

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

2026.10.16

120

10

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

2026.10.16

80

10

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

2026.10.16

60

10

热门下载

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

精品课程

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

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

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

共0课时 | 0人学习