webman高并发需调优linux内核:启用event扩展(epoll)、扩大tcp_max_syn_backlog与somaxconn至65535、开启tcp_timestamps和tcp_tw_reuse加速time_wait回收、提升fs.file-max及用户级nofile限制、调大tcp收发缓冲区。

如果您在对 Webman 应用进行高并发压测时观察到 QPS 波动大、连接异常中断、CPU 利用率失衡或受压端无法承载预期并发量,则很可能是 Linux 内核默认参数未能匹配 Webman 的事件驱动模型与高连接密度场景。以下是针对该问题的多维度调优操作步骤:
一、启用 event 扩展并验证其有效性
Webman 基于 Swoole 或 Workerman 运行时,启用 event 扩展可将 I/O 多路复用从 select/poll 切换至 epoll(Linux)或 kqueue(BSD),显著降低高并发下的事件通知开销。该扩展对连接数超 5000 的压测场景具有决定性作用。
1、确认 PHP 编译时已启用 --with-event 参数,或通过包管理器安装 event 扩展:sudo apt install php-event(Debian/Ubuntu)。
2、在 php.ini 中启用扩展:extension=event.so。
3、重启 Webman 服务后执行 php --ri event,检查输出中显示 event support => enabled 且 backend 为 epoll。
4、使用 ab 工具对比压测:ab -n 2000000 -c 5000 -k http://172.18.155.51:8787/index/json,若未启用 event 时出现 apr_pollset_poll: The timeout specified has expired 错误而启用后压测正常,则验证成功。
二、扩大 TCP 连接队列容量
Webman 在高并发短连接场景下易因内核连接队列溢出导致 SYN 包被丢弃,表现为客户端连接超时或重传。需同步调大半连接队列(SYN Queue)与全连接队列(Accept Queue),并与应用层 listen backlog 值对齐。
1、编辑 /etc/sysctl.conf,添加以下参数:
net.ipv4.tcp_max_syn_backlog = 65535
net.core.somaxconn = 65535
2、执行 sudo sysctl -p 立即生效。
3、检查当前值是否更新:sysctl net.core.somaxconn,输出应为 net.core.somaxconn = 65535。
4、确保 Webman 启动时 worker 配置中 listen 的 backlog 值不低于 65535,例如在 start.php 中设置:Worker::$defaultListenBacklog = 65535。
三、优化 TIME_WAIT 连接回收机制
大量短连接会快速堆积 TIME_WAIT 状态套接字,占用端口与内存资源,进而限制新连接建立速率。通过启用时间戳支持与安全复用策略,可在不破坏连接可靠性前提下加速回收。
1、在 /etc/sysctl.conf 中添加:
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
2、注意:tcp_tw_reuse 仅在 tcp_timestamps=1 时生效,否则配置静默失效。
3、执行 sudo sysctl -p 加载配置。
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
4、验证生效:ss -s 输出中查看 tw 数量变化趋势,压测后应明显低于未调优状态。
四、提升系统文件描述符上限
Webman 每个 Worker 进程需为每个客户端连接分配一个文件描述符(fd),当并发连接数超过默认 1024 限制时,将触发 Too many open files 错误,直接终止新连接接纳。
1、设置系统级最大 fd 数:echo 'fs.file-max = 2097152' | sudo tee -a /etc/sysctl.conf。
2、执行 sudo sysctl -p 应用变更。
3、为运行 Webman 的用户配置用户级限制,在 /etc/security/limits.conf 中追加:
* soft nofile 1048576
* hard nofile 2000000
4、确保 Webman 启动方式为 systemd 或 shell 登录会话(非 cron 或 nohup 直接启动),否则 limits 不生效;重启服务后执行 ulimit -n 验证输出为 1048576。
五、调整网络缓冲区与脏页写回参数
高吞吐 Webman 服务在持续响应 JSON 数据时,易因 TCP 接收/发送缓冲区不足引发丢包或延迟抖动;同时,后台脏页刷盘节奏不当会导致 I/O 突发阻塞,影响请求处理连续性。
1、在 /etc/sysctl.conf 中添加缓冲区配置:
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
2、添加脏页控制参数(适用于 SSD 存储):
vm.dirty_background_ratio = 15
vm.dirty_ratio = 40
3、执行 sudo sysctl -p 生效。
4、验证缓冲区值:getconf PAGESIZE 输出页大小后,cat /proc/sys/net/core/rmem_max 应返回 134217728。










