V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
imherer
V2EX  ›  Node.js

socket.io 内存泄漏问题

  •  1
     
  •   imherer · 2017-12-04 11:04:33 +08:00 · 4501 次点击
    这是一个创建于 2565 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 最近用 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 这个变量(逻辑上应该没问题)

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

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

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

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

    但是说实话, 只要把生命周期独立管理起来, 想内存泄漏还是很难的.
    maninnet
        9
    maninnet  
       2017-12-04 14:31:39 +08:00
    maninnet
        10
    maninnet  
       2017-12-04 14:32:30 +08:00   ❤️ 1
    https://www.v2ex.com/t/395867
    看看这个有没有帮助?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1470 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:57 · PVG 00:57 · LAX 08:57 · JFK 11:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.