nodejs内存侧漏求助
dump了一下内存,发现大量这种对象……有些甚至能有上万的distance,中间全是next::WriteReq
这是一个WebSocket服务,几乎都是长连接保持状态,会有几百个活跃连接,用的是ws库
"dependencies": {
"bluebird": "^3.4.3",
"bufferutil": "^1.2.1",
"bunyan": "^1.8.1",
"co": "^4.6.0",
"co-redis": "^2.1.1",
"co-request": "^1.0.0",
"hiredis": "^0.5.0",
"json-stream": "^1.0.0",
"knex": "^0.11.10",
"moment": "^2.14.1",
"mysql": "^2.11.1",
"mysql2": "^1.0.0-rc.12",
"redis": "^2.6.2",
"superagent": "^2.2.0",
"ursa": "^0.9.4",
"utf-8-validate": "^1.2.1",
"uuid": "^2.0.2",
"ws": "^1.1.1"
}
6 回复
你这是用的什么调试工具
应该是代码逻辑有地方写错了吧 在一个事件里循环调用了之类 如果越久的链接对应的对象distance越长应该就是这个问题 没具体代码很难找问题的 要不你把代码发我一份
@linruilin webstorm的v8堆栈分析
@jiangzhuo 我看看怎么拆出来……有点难度
问题解决了 原因是流量太大,socket的write方法调用非常频繁而且带宽不足的情况下,nodejs会把请求缓存起来,然后组成一个CorkedRequest链。 阅读_stream_writeable.js源码后发现,请求被发送之后,CorkedRequest链并不会被释放,而是会等到整条链都被发送后,Socket对象回到uncorked状态后才会将corkedRequest设为null。 如果带宽一直不足,CorkedRequest链将会持续堆积,最终就会造成这种成千上万的引用链
解决方法很简单,前面套一层Nginx,让nginx处理带宽不足时的缓存即可