workerman/http-client 报错内存溢出

morris

问题描述

http-client 异步客户端,运行一段时间后、 报错内存溢出

程序代码

截图

报错信息

截图

操作系统及workerman/webman等框架组件具体版本

这里写具体的系统环境相关信息
webman 版本
截图
php 版本
截图
http-client 版本
截图
curl 扩展版本
截图

510 1 1
1个回答

walkor

看报错应该是返回的数据太大了,有很多并发请求的话,会占用很大内存。
还有不要重复创建Client实例,把asyncHttpClient保存到类的静态属性,然后复用它。
new Client时设置下max_conn_per_addr,默认128改成例如32减少并发。

参考手册 https://www.workerman.net/doc/workerman/components/workerman-http-client.html#Optinons%20%E9%80%89%E9%A1%B9

  • morris 2023-08-30

    好的, 感谢大佬

  • morris 2023-08-31

    发现有大量的 Connection closed;
    这个是拨号失败的时候触发, 还是由于闲置链接久了。 三方服务端关闭了, 但是php这边保持的连接池没关闭导致呢

  • morris 2023-08-31

    线上服务 访问的是一个host、 两小时总共请求 2,742,229次。 connction closed 就有 715,058次

  • walkor 2023-08-31

    http-client里连接闲置15秒默认就自动关闭了,基本不会出现连接闲置久了的问题。
    Connection closed 感觉是带宽或网路出现瓶颈,接受数据大量丢包导致连接断开。
    两小时总共请求 2,742,229次,每秒380个请求。
    根据你之前的报错看一个请求有1MB+,假设每个请求响应大小为500KB,粗略估算大概占用带宽1.4Gb/S,你们看下服务器是否支持这么大的带宽。

  • morris 2023-08-31

    应该不是宽带的问题 。 我看了 当时时间段的 阿里云服务器 网络监控数据 ,最高也才 20Mbit/s

  • morris 2023-08-31

    我们的ecs 宽带配置是 无限制 ,阿里云 默认是 1G/s

  • morris 2023-08-31

    我感觉还是 拨号失败的问题, 测试环境是在国内, 访问这个facebook 接口,全是 connectd closed; 我在国内测试服上用 wget 测试 , 的确是 访问不了 。

  • morris 2023-08-31

    另外响应数据 , 应该就几kb。 就是一个 像素上报成功与否 的响应

  • walkor 2023-08-31

    带宽排除的话,那可能是拨号失败导致

  • morris 2023-08-31

    好的, 感谢大佬。 我抓包看下;
    针对最开始的 oom问题。 我理解是
    由于用了异步请求。 当前请求 调用facebook 还未处理完成, 当前php进程就会处理别的客户端链接,
    假设facebook 访问需要10s,
    也就是说 在这10s内。 当前php进程占用内存 等于 每个请求(比如1M) * 并发数 、(因为调用facebook还被挂起,也就是函数生命周期还没完, 不会销毁函数调用栈 临时变量等占用的内存)
    所以会导致当前php进程oom, 是这样吧

  • walkor 2023-08-31

🔝