我们在生产环境发现一个现象,已经连续几天无法定位到原因。 我们在用curl去请求一个http接口,当这个接口有瞬时大量的ConnectionTimeoutError(后端错误) ,且qps达到一定的量,等到后端修复了这个功能后,我们并没有自动恢复,且发现几个现象: 1.发生错误时内存不断升高,直至溢出,都没有恢复; 2.除非手动重启,否则一直维持ConnectionTimeoutError的错误; 3.关闭流量后,内存仍然居高不下; 4.关闭流量且经过一个小时后测试,好像有恢复。 5.开了3个workers,关闭流量后手动测,发现固定的其中2个worker是不行的,1个是可以的。(根据socket status判断)
相关环境信息 容器环境: Ubuntu镜像 node: v10.14.1 Egg 版本: ^2.21.1Q
[eggjs/egg]httpclient是否有内存溢出的可能性?
5
A
回答
4
看到urllib里面,对req用once绑定具体事件,所以没有具体removeListener的操作,不知道是否存在这种内存溢出的可能性。
5
主要看到了这篇文章里面写到的socket的内存泄露的问题,https://cnodejs.org/topic/58eb5d378cda07442731569f
1
有没有内存泄露,挂下 AliNode 一看就知道了,很好查的。
9
@wadeDra req 在请求完成后会自动 destroy 掉的,这个是在 node 中自己做的,还有就是 urllib 在整个 egg 生态大量使用,如果有这么明显的内存泄露问题,早就有人提了,与其这样瞎猜,不如用 alinode 查一下是不是你们的业务代码写的有问题。
3
好的 正在挂alinode,如果我指定了logger不生成文件,会不会影响alinode的日志?
9
@wadeDra 不会
1
@wadeDra cnode 这篇文章是我写的,其实那个问题是在 client 重连时才会触发,并且只要重新连接上 connect 侦听器就会被正确移除,urllib 并不会存在这个问题。