http-client 异步客户端,运行一段时间后、 报错内存溢出
这里写具体的系统环境相关信息 webman 版本 php 版本 http-client 版本 curl 扩展版本
看报错应该是返回的数据太大了,有很多并发请求的话,会占用很大内存。 还有不要重复创建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
好的, 感谢大佬
发现有大量的 Connection closed; 这个是拨号失败的时候触发, 还是由于闲置链接久了。 三方服务端关闭了, 但是php这边保持的连接池没关闭导致呢
线上服务 访问的是一个host、 两小时总共请求 2,742,229次。 connction closed 就有 715,058次
http-client里连接闲置15秒默认就自动关闭了,基本不会出现连接闲置久了的问题。 Connection closed 感觉是带宽或网路出现瓶颈,接受数据大量丢包导致连接断开。 两小时总共请求 2,742,229次,每秒380个请求。 根据你之前的报错看一个请求有1MB+,假设每个请求响应大小为500KB,粗略估算大概占用带宽1.4Gb/S,你们看下服务器是否支持这么大的带宽。
应该不是宽带的问题 。 我看了 当时时间段的 阿里云服务器 网络监控数据 ,最高也才 20Mbit/s
我们的ecs 宽带配置是 无限制 ,阿里云 默认是 1G/s
我感觉还是 拨号失败的问题, 测试环境是在国内, 访问这个facebook 接口,全是 connectd closed; 我在国内测试服上用 wget 测试 , 的确是 访问不了 。
另外响应数据 , 应该就几kb。 就是一个 像素上报成功与否 的响应
带宽排除的话,那可能是拨号失败导致
好的, 感谢大佬。 我抓包看下; 针对最开始的 oom问题。 我理解是 由于用了异步请求。 当前请求 调用facebook 还未处理完成, 当前php进程就会处理别的客户端链接, 假设facebook 访问需要10s, 也就是说 在这10s内。 当前php进程占用内存 等于 每个请求(比如1M) * 并发数 、(因为调用facebook还被挂起,也就是函数生命周期还没完, 不会销毁函数调用栈 临时变量等占用的内存) 所以会导致当前php进程oom, 是这样吧
对
看报错应该是返回的数据太大了,有很多并发请求的话,会占用很大内存。
还有不要重复创建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
好的, 感谢大佬
发现有大量的 Connection closed;
这个是拨号失败的时候触发, 还是由于闲置链接久了。 三方服务端关闭了, 但是php这边保持的连接池没关闭导致呢
线上服务 访问的是一个host、 两小时总共请求 2,742,229次。 connction closed 就有 715,058次
http-client里连接闲置15秒默认就自动关闭了,基本不会出现连接闲置久了的问题。
Connection closed 感觉是带宽或网路出现瓶颈,接受数据大量丢包导致连接断开。
两小时总共请求 2,742,229次,每秒380个请求。
根据你之前的报错看一个请求有1MB+,假设每个请求响应大小为500KB,粗略估算大概占用带宽1.4Gb/S,你们看下服务器是否支持这么大的带宽。
应该不是宽带的问题 。 我看了 当时时间段的 阿里云服务器 网络监控数据 ,最高也才 20Mbit/s
我们的ecs 宽带配置是 无限制 ,阿里云 默认是 1G/s
我感觉还是 拨号失败的问题, 测试环境是在国内, 访问这个facebook 接口,全是 connectd closed; 我在国内测试服上用 wget 测试 , 的确是 访问不了 。
另外响应数据 , 应该就几kb。 就是一个 像素上报成功与否 的响应
带宽排除的话,那可能是拨号失败导致
好的, 感谢大佬。 我抓包看下;
针对最开始的 oom问题。 我理解是
由于用了异步请求。 当前请求 调用facebook 还未处理完成, 当前php进程就会处理别的客户端链接,
假设facebook 访问需要10s,
也就是说 在这10s内。 当前php进程占用内存 等于 每个请求(比如1M) * 并发数 、(因为调用facebook还被挂起,也就是函数生命周期还没完, 不会销毁函数调用栈 临时变量等占用的内存)
所以会导致当前php进程oom, 是这样吧
对