nodejs内存侧漏求助
发布于 8 年前 作者 bangbang93 4085 次浏览 来自 问答

untitled2.png untitled4.png untitled5.png 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处理带宽不足时的缓存即可

回到顶部