最近用node+socket.io做手游服务端,在小范围的线上测试的时候发现有内存泄漏,一开始是以为是socket.io的问题
最后这几天通过heapdump分析,基本定位了是node-scheduled这个库导致的(不知道是不是我使用问题)
heapdump分析
程序刚启动打一个snapshot,运行3个小时左右再打一个snapshot,对比这个2个snapshot发现有大量的closure(新增100W+),都是node-scheduled这个库产生的
node-scheduled主要用在游戏内道具的倒计时,一局游戏3分钟时长,6个玩家为一个房间,一个房间内有20个左右的道具 游戏一开始每个道具我都用node-scheduled启动一个task来通知客户端这个道具在什么时候出现 当玩家在游戏过程中吃掉一个道具后,客户端告诉我,我就重新给这个道具一个task用来倒计时多长时间后这个道具恢复(一个道具被吃掉后一般10多秒就恢复了)
每个房间有一个object对象room,我将这个房间内的所有道具的task都绑定在这个room对象上,当这局游戏结束的时候,我首先把房间内所有的道具task都cancel掉,然后再销毁这个room对象 但不知道为什么通过snapshot查看到还是有100W+的新增
服务器用的是双核4G,这个服务器上只允许了这个一个node进程,在运行4小时左右loop delay已经达到20ms+了,当前进程CPU快超过80%了,运行时间越长loop delay能达到上百,进程CPU超过100%
1.上述定时器我改用settimeout和setinterval会不会好一些? 2.对于只跑一个node进程来说 买多核有用吗?
node:8.4,node-scheduled:1.2.4