最近用 nodejs+socket.io(socket 版本 1.7.2)做了一个手游的服务端,最近这几天做小规模的线上测试的时候发现有内测泄露的问题(内存有减少,但减少的速度远远小于增长的速度),同时 CPU 也在不断的增长
具体表现就是大概 100 多人同时在在线的时候大概 5 个小时左右内存就到了 1G 了(服务器是双核 4G 的配置,只跑了这一个进程),这个是用 PM2 看 loop delay 到了 20ms 的样子, 大概内存涨到 1.5G 的时候,已经明显感觉到游戏里面各种卡、延迟。所以现在临时解决方案是内存到了 1G 的时候重启一下 node 进程
服务端这边没有任何密集型的运算,就只用 socket 做了一些数据的转发(即一个客户端发上来数据,我再把这个数据广播给其他人),广播的数量也不是很大,一般也最多 6 个人
socket 这边用户连上来的时候我把用户的一些数据保存在内存里,同时把当前用户的 socket 的对象也保存在内存里,当用户断开连接的时候删除前面保存的数据 用户从连上到断开一般在 3 分钟左右的时间(因为一局游戏时长是 3 分钟)
1.怀疑是不是 TCP 连接未释放的问题,但是在测试中发现新上来一个连接和断开之后,在 Linux 服务器上看到对应端口的连接数是有相应的变化的
2.因为游戏中有很多和时间相关的东西,所以用到了node-schedule这个库,怀疑是不是这个库造成的 但是我在代码里每次创建一个 task 的时候我都赋值给一个变量,当 task 执行后我都是先 cancel 然后在 delete 这个变量(逻辑上应该没问题)
对这块比较小白,还请给为老司机给点建议,如何下手
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.