webman的$worker->count需按业务类型设定:io密集型建议cpu核数×3–5,cpu密集型设为核数或+1;必须依据实测rss内存估算上限(公式:总内存gb×1024÷单进程rss×0.8),并同步调优net.core.somaxconn等内核参数。

Webman 的多进程模型不是“开越多 worker 越快”,而是要让每个 Worker 真正吃饱、不抢食、不饿死——关键在 count 值、内存占用和内核资源三者对齐。
怎么设 $worker->count 才不翻车
直接写 $worker->count = cpu_count() * 2 是新手最常踩的坑。这个值只在纯 CPU 密集型、无阻塞 IO 的场景下安全;现实中多数业务混用数据库查询、Redis、HTTP 调用,属于 IO 密集型,需要更多并发能力,但也更吃内存。
- IO 密集型(比如频繁查 MySQL、调第三方 API):从
cpu_count() * 3起步,压测中可试到* 5,但必须同步监控 RSS 内存 - CPU 密集型(比如图像处理、大量计算):设为
cpu_count()或+1更稳,再高只会加剧上下文切换 - 混用场景:先设
cpu_count() * 2,然后用ps aux --sort=-%mem | grep php抓 3–5 个稳定运行的 Worker 进程,算出平均 RSS(单位 MB) - 硬上限公式:
(总内存 GB × 1024) ÷ 单 Worker RSS(MB) × 0.8,结果向下取整就是最大安全count
为什么 count 设高了反而 QPS 下跌
不是 CPU 不够,是内核和 PHP 自身扛不住。每个 Worker 进程独占一份内存、一个事件循环、一组文件描述符,设高后会触发三类连锁反应:
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
-
vmstat 1 5中cs(context switch)值跳升明显 → 进程调度抖动,CPU 时间花在切换上而非干活 -
ss -s显示inuse高但orphans同步上升 → Worker 处理不过来,内核收包队列堆积,开始丢包 -
netstat -s | grep "packet receive errors"计数上涨 →net.core.netdev_max_backlog不足,网卡软中断队列溢出 - 日志里反复出现
Too many open files→ 没配ulimit -n或fs.file-max,系统级句柄耗尽
Linux 内核参数必须和 count 一起调
Webman 的 Worker 数量不是孤立配置,它驱动着内核网络栈的实际负载。三个参数不联动调优,count 再合理也白搭:
-
net.core.somaxconn:必须 ≥Worker::$defaultListenBacklog(默认 65535),否则多余连接被内核静默丢弃,现象是客户端偶发Connection refused -
net.ipv4.tcp_max_syn_backlog:必须 ≥net.core.somaxconn,尤其秒杀类突发流量,否则 SYN 包在三次握手阶段就被扔掉 -
net.core.netdev_max_backlog:建议设为 30000,低于 1000 时 Webman Worker 处理延迟一高,立刻丢包 - 调完记得执行
sudo sysctl -p,并用sysctl net.core.somaxconn验证是否生效
Windows 下别硬套 Linux 的 count 算法
Windows 没有 fork(),Workerman 在 Windows 下靠 proc_open() 模拟多进程,稳定性差、句柄管理弱、无法绑定 CPU。盲目设高 count 容易触发句柄耗尽或进程僵死:
- 禁用守护模式:
Worker::$daemonize = false,否则 Windows 下子进程无法正常回收 -
count建议 ≤ CPU 核心数 × 1.5(例如双核设 3,四核设 6),超过后性能不升反降 - 必须指定有效日志路径:
Worker::$logFile = 'storage/logs/workerman.log',否则启动失败无提示 - 优先走 IIS 反向代理,关闭 HTTP Keep-Alive,避免 Windows TCP 栈在长连接保活超时后异常断连
真正卡住 Webman 性能上限的,从来不是 PHP 代码写得够不够优雅,而是 count 值背后那一整套资源链:单进程 RSS、内核连接队列、文件描述符限制、CPU 缓存局部性——漏掉任意一环,压测数据就不可信。










