必须通过max_request控制worker生命周期,设错值会掩盖泄漏、拖慢qps、中断上传;需验证其是否生效,并依内存增长量科学计算合理值,不同框架需绕过硬编码,base模式/udp/异步tcp禁用,task_worker须单独配置。

线上Swoole服务运行几天后RSS内存持续上涨,最终触发OOM Killer杀掉worker进程,必须通过max_request参数控制单个worker生命周期,但设错值反而掩盖真实泄漏点、拖慢QPS、甚至导致文件上传中断。
确认当前max_request是否生效
第一步:执行ps aux | grep your_swoole_app.php,记录两个worker进程PID;
第二步:用curl或ab连续发起超过你配置的max_request数值的请求(例如设为100就发105次);
第三步:再次执行ps aux | grep your_swoole_app.php,观察原worker PID是否消失、是否有新PID出现——【若PID不变,说明max_request未生效】;
常见失效原因:Laravel-Swoole或think-swoole框架在底层硬编码了'max_request' => 0,直接改config/swoole.php无效;Hyperf则需检查server.php中是否被中间件或启动脚本覆盖。
根据内存增长量反推合理max_request值
方法一:打点采样法(推荐)
在 onRequest 回调开头插入:if ($request->fd % 100 === 0) { file_put_contents('/tmp/mem.log', date('H:i:s') . "\t" . memory_get_peak_usage(true) . "\n", FILE_APPEND); };
跑满24小时后,用awk提取每100次请求的峰值内存差值,算出平均单请求增长量(单位:字节);
假设结果为+18.3KB/请求,服务器单worker内存上限为256MB,则最大安全值 = (256 × 1024 × 1024 − 当前常驻内存) ÷ 18300 ≈ 12000 → 实际取整设为【8000】,留20%缓冲防突增;
方法二:压测观察法
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
启动服务后,用watch -n 1 'ps -o pid,rss,vsz -C php | grep -v PID'盯住worker RSS;
每处理1000请求记一次RSS增量,当发现连续3次增量>15MB时,立即停止并把max_request设为上一个稳定值的80%;
这一步不能拍脑袋定——设成1000却涨了30MB,等于每轮重启都带着20MB脏内存重来,泄漏仍在恶化。
不同框架下的绕过硬编码写法
Laravel-Swoole场景下,必须在app/Providers/SwooleServiceProvider.php的boot()中注入:
$this->app['swoole']->on('start', function () { $server = app('swoole.server'); $server->set(['max_request' => 5000]); });
think-swoole需监听swoole.init事件,在event/swoole.php里写:Event::listen('swoole.init', function ($server) { $server->set(['max_request' => 3000]); });;
Hyperf用户注意:【不要在config/autoload/server.php里直接写max_request】,而应放在config/autoload/listen.php中,用SwooleEvent::ON_START钩子动态set,否则会被core组件覆盖。
避开致命陷阱的三项禁令
① Base模式下设置max_request完全无效——该模式无master/worker分离,所有逻辑在单进程跑,重启机制不触发;
② UDP Server或纯异步TCP Server禁止启用max_request,因为连接无状态且短平快,重启worker反而破坏会话连续性;
③ task_worker进程必须单独配task_max_request,且值要低于worker的max_request,否则task进程长期不退出,静态变量缓存越积越多,最终比worker先爆内存。










