socket.io 内存泄漏问题

2017-12-04 11:04:33 +08:00
 imherer

1.怀疑是不是 TCP 连接未释放的问题,但是在测试中发现新上来一个连接和断开之后,在 Linux 服务器上看到对应端口的连接数是有相应的变化的

2.因为游戏中有很多和时间相关的东西,所以用到了node-schedule这个库,怀疑是不是这个库造成的 但是我在代码里每次创建一个 task 的时候我都赋值给一个变量,当 task 执行后我都是先 cancel 然后在 delete 这个变量(逻辑上应该没问题)

对这块比较小白,还请给为老司机给点建议,如何下手

4390 次点击
所在节点    Node.js
10 条回复
tvallday
2017-12-04 11:24:10 +08:00
socket.io 这种很流行的库内存泄漏的机率很小。极有可能是你自己代码的问题,哪里忘了回收了。请用常用排查 memory leak 的 lib 慢慢排查。虽然 debug 是大胆假设,但是最重要的是小心求证,先找出问题出在哪段代码。
moka20477
2017-12-04 11:29:42 +08:00
TCP 半开连接很正常,感觉很大几率是 TCP 未释放,通常长连接都要在应用层做心跳,你可以写个监控,实时看一下内存中的用户信息数量
imherer
2017-12-04 11:32:50 +08:00
@moka20477 netstat -nat|grep -i "port"|wc -l 我用这个命令查看了对应端口 TCP 是实时释放的, 应该是代码问题,debug 难度大啊
momocraft
2017-12-04 11:38:02 +08:00
单纯泄漏未必会导致慢,而你体验到了慢,这是一个线索。有没有什么 eventemitter 忘记释放的?
imherer
2017-12-04 11:41:23 +08:00
@momocraft 就是怀疑是不是用的 node-schedule 这个库哪里用法不对,还在排查中
tvallday
2017-12-04 11:48:30 +08:00
@imherer debug 难度虽然大但是你经历过之后将会是宝贵的经验,没有什么神秘的,很有可能就是缺一行代码。我上次游戏内存泄漏整整两个月都不知道原因在哪里,差点想换另一种语言重写。后来解决以后游戏连续运行两个月都没有问题。当然,也有可能你这个问题更隐蔽。
bramblex
2017-12-04 11:50:02 +08:00
大概率是你代码的问题

闭包这个东西用不好内存泄露不要太正常
bramblex
2017-12-04 11:54:59 +08:00
@tvallday

主要是 js 这东西你很难管理内存. 虽然 c 艹 整天被黑内存泄漏.

但是说实话, 只要把生命周期独立管理起来, 想内存泄漏还是很难的.
maninnet
2017-12-04 14:31:39 +08:00
maninnet
2017-12-04 14:32:30 +08:00
https://www.v2ex.com/t/395867
看看这个有没有帮助?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/411750

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX