首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
疑似 swoole http parser 内存泄露
### 问题描述 同一个应用,部署在 docker 内,在直接服务 HTTP 流量的情况下,内存占用稳定增长,每天涨几百 M,如果在前面挂一层反向代理,比如 nginx,内存就停止泄露了。 ### Swoole版本,PHP版本,以及操作系统版本信息 Swoole: v4.5.2 PHP: v7.4 ### 相关代码 ```php #!/usr/bin/env php <?php declare(strict_types=1); date_default_timezone_set('UTC'); define('BASE_DIR', __DIR__); //autoload require __DIR__ . '/vendor/autoload.php'; \Co::set([ 'hook_flags' => SWOOLE_HOOK_ALL | SWOOLE_HOOK_CURL, 'log_level' => SWOOLE_LOG_WARNING, 'log_file' => BASE_DIR . '/logs/error-' . date('Y-m-d') . '.log', ]); class HttpServer { private $http = null; public function __construct() { $this->http = new \Co\Http\Server('0.0.0.0', 8080); $this->http->handle('/', function ($request, $response) { $response->end('1'); }); } public function start() { $this->http->start(); } } \Co\run(function () { $server = new HttpServer(); $server->start(); }); ``` Dockerfile ```Dockerfile version: "3" services: swoole: image: phpswoole/swoole:4.5.2-php7.4 ports: - "8080:8080" volumes: - .:/var/www/ ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 期待:内存稳定不增长 实际看到:在生产环境 qps < 100 的情况下,内存每天增长几百 M 到 1G 多。 错误日志每天出现几条 ``` [2021-01-13 00:24:34 @17.0] WARNING swoole_http_parse_cookie: cookie[%22%2C%2...] name length 142 is exceed the max name len 128 [2021-01-13 00:42:11 @17.0] WARNING swoole_http_parse_cookie: cookie[2ip_addr...] name length 315 is exceed the max name len 128 [2021-01-13 01:07:31 @17.0] WARNING swoole_http_parse_cookie: cookie[5AE%259E...] name length 740 is exceed the max name len 128 ``` ### 分析 因为业务代码非常简单,怀疑是 Swoole http parser 处理某些不正常的 HTTP 请求时泄露了内存,于是我在前面加了一层反向代理,然后问题解决。观察了一整天内存都不在增加。 我不知道可以怎么帮忙分析这个问题,如果有需要用什么工具提供更详细的信息,请告诉我。
发布于3年前 · 19 次浏览 · 来自
提问
c1
### 问题描述 同一个应用,部署在 docker 内,在直接服务 HTTP 流量的情况下,内存占用稳定增长,每天涨几百 M,如果在前面挂一层反向代理,比如 nginx,内存就停止泄露了。 ### Swoole版本,PHP版本,以及操作系统版本信息 Swoole: v4.5.2 PHP: v7.4 ### 相关代码 ```php #!/usr/bin/env php <?php declare(strict_types=1); date_default_timezone_set('UTC'); define('BASE_DIR', __DIR__); //autoload require __DIR__ . '/vendor/autoload.php'; \Co::set([ 'hook_flags' => SWOOLE_HOOK_ALL | SWOOLE_HOOK_CURL, 'log_level' => SWOOLE_LOG_WARNING, 'log_file' => BASE_DIR . '/logs/error-' . date('Y-m-d') . '.log', ]); class HttpServer { private $http = null; public function __construct() { $this->http = new \Co\Http\Server('0.0.0.0', 8080); $this->http->handle('/', function ($request, $response) { $response->end('1'); }); } public function start() { $this->http->start(); } } \Co\run(function () { $server = new HttpServer(); $server->start(); }); ``` Dockerfile ```Dockerfile version: "3" services: swoole: image: phpswoole/swoole:4.5.2-php7.4 ports: - "8080:8080" volumes: - .:/var/www/ ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 期待:内存稳定不增长 实际看到:在生产环境 qps < 100 的情况下,内存每天增长几百 M 到 1G 多。 错误日志每天出现几条 ``` [2021-01-13 00:24:34 @17.0] WARNING swoole_http_parse_cookie: cookie[%22%2C%2...] name length 142 is exceed the max name len 128 [2021-01-13 00:42:11 @17.0] WARNING swoole_http_parse_cookie: cookie[2ip_addr...] name length 315 is exceed the max name len 128 [2021-01-13 01:07:31 @17.0] WARNING swoole_http_parse_cookie: cookie[5AE%259E...] name length 740 is exceed the max name len 128 ``` ### 分析 因为业务代码非常简单,怀疑是 Swoole http parser 处理某些不正常的 HTTP 请求时泄露了内存,于是我在前面加了一层反向代理,然后问题解决。观察了一整天内存都不在增加。 我不知道可以怎么帮忙分析这个问题,如果有需要用什么工具提供更详细的信息,请告诉我。
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2021-01-14
c1
有一点漏说了,我们这个业务的请求,只有 HTTP GET,并且没有 Cookie,所以不清楚上面的错误日志为什么会产生。反向代理的访问日志,也没有出现异常请求,只有 GET,没有 Cookie。
赞
0
回复
2021-01-14
鲁飞
先升级下版本后再试,如果复现 然后使用 ```bash USE_ZEND_ALLOC=0 valgrind --log-file=/tmp/valgrind.log php xxx.php ``` 将valgrind.log提交swoole-src的issue https://github.com/swoole/swoole-src
赞
0
回复
2021-01-19
Rango
需要提供一个稳定可重现的 bad case 给我们
赞
0
回复
微信公众号
热门内容
暂无回复的问答
- CodeGalaxy K3s 轻量集群节点之间如何实现负载均衡
- 关于openssl CURL WARNING swSSL_connect: SSL_connect(fd=69) failed. Error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small[1|394]
- 多个模型如何进行事务异常回退?
- websocket开启wss报错
- 协程tcp服务器如何使用多进程?recv()方法接收信息,打印出来的pid一直是同一个。没用使用到多进程啊。