登录
首页 >  文章 >  php教程

Workerman高并发优化技巧

时间:2026-05-31 22:55:00 328浏览 收藏

要让Workerman真正稳定支撑百万级并发,关键不在盲目增加Worker进程数,而在于深度协同优化Linux内核与PHP运行时环境:必须将net.core.somaxconn和tcp_max_syn_backlog同步调至65535以避免连接被内核丢弃,配置fs.file-max和ulimit -n达209万以上句柄容量防止“Too many open files”崩溃,启用tcp_tw_reuse并禁用已淘汰的tcp_tw_recycle以安全应对TIME_WAIT风暴,同时强制安装并验证event扩展使epoll真正生效——任何一环遗漏或验证不到位(如sysctl值正确但ulimit未生效、event backend显示select而非epoll),都会让百万并发沦为纸上谈兵。

Workerman百万级并发怎么优化?Linux内核参数调优指南

Workerman 要跑稳百万级并发,光靠堆 Worker 进程没用——90% 的瓶颈卡在 Linux 内核默认参数上。

net.core.somaxconn 和 tcp_max_syn_backlog 必须同步调到 65535

这两个值不一致,高并发下新连接会直接被内核丢弃,现象是客户端偶发 Connection refused 或超时。Webman/Workerman 的 listen 配置里即使写了 ?backlog=65535,也得先让内核允许挂起这么多连接。

  • 临时生效:sudo sysctl -w net.core.somaxconn=65535sudo sysctl -w net.ipv4.tcp_max_syn_backlog=65535
  • 永久生效:写入 /etc/sysctl.d/99-tuning.conf(比 /etc/sysctl.conf 更推荐),再执行 sudo sysctl -p /etc/sysctl.d/99-tuning.conf
  • 验证是否生效:sysctl net.core.somaxconn 输出必须是 65535,不是 1284096
  • 别漏掉应用层:在 Webman 的 start.php 中显式设 Worker::$defaultListenBacklog = 65535

fs.file-max 和 ulimit -n 必须匹配且足够大

一个 TCP 连接 ≈ 1 个文件描述符。百万连接至少要预留 120 万以上句柄空间,否则压测中途就会报 Too many open files,Worker 进程直接退出。

  • 系统级上限:fs.file-max = 2097152(写进 /etc/sysctl.d/99-tuning.conf
  • 用户级限制:/etc/security/limits.conf 加两行:
    * soft nofile 1048576
    * hard nofile 1048576
  • 注意:改完 limits.conf 后,必须用新 shell 登录或重启服务才能生效,ulimit -n 当前会话里看到的才是真实值
  • 如果用 systemd 启动 Webman,还要在 service 文件里加 LimitNOFILE=1048576

tcp_tw_reuse 和 tcp_max_tw_buckets 要开但别乱开 tcp_tw_recycle

短连接压测时,TIME_WAIT 堆积会导致端口耗尽、新建连接失败。启用 tcp_tw_reuse 是安全的加速手段;而 tcp_tw_recycle 在 NAT 环境下会引发连接异常,2026 年已明确弃用。

  • 必须开启:net.ipv4.tcp_tw_reuse = 1
  • 必须扩大桶容量:net.ipv4.tcp_max_tw_buckets = 262144(避免内核强制回收导致 RST)
  • 必须关闭:net.ipv4.tcp_tw_recycle = 0(很多教程还写 1,这是错的)
  • 补充一招:net.ipv4.ip_local_port_range = 1024 65535,单 IP 可用端口从默认约 28K 扩到 64K

event 扩展不启用,epoll 就不会真正生效

Workerman 默认 fallback 到 select,连接数过 5000 就开始掉性能。不装 event 扩展,所有内核调优都白搭。

  • Debian/Ubuntu:sudo apt install php-event;CentOS:sudo yum install php-pecl-event
  • 确认 php.iniextension=event.so,然后重启 PHP 进程
  • 验证:php --ri event 输出中必须含 backend => epoll,不是 select 或空
  • 压测对比:用 ab -c 5000 测,未启用时大概率报 apr_pollset_poll: The timeout specified has expired,启用后消失

真正难的不是改哪几行参数,而是改完之后必须逐项验证——比如 sysctl 显示值对了,ulimit -n 却还是 1024,或者 event 扩展加载了但 backend 显示 kqueue(说明跑在 macOS 上)。这些细节不卡住,百万并发永远只是理论数字。

终于介绍完啦!小伙伴们,这篇关于《Workerman高并发优化技巧》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布文章相关知识,快来关注吧!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>