socket.io 内存泄漏问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
imherer

socket.io 内存泄漏问题

  •  1
     
  •   imherer 2017 年 12 月 4 日 4931 次点击
    这是一个创建于 3064 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 最近用 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 月 4 日   1
    socket.io 这种很流行的库内存泄漏的机率很小。极有可能是你自己代码的问题,哪里忘了回收了。请用常用排查 memory leak 的 lib 慢慢排查。虽然 debug 是大胆假设,但是最重要的是小心求证,先找出问题出在哪段代码。
    moka20477
        2
    moka20477  
       2017 年 12 月 4 日
    TCP 半开连接很正常,感觉很大几率是 TCP 未释放,通常长连接都要在应用层做心跳,你可以写个监控,实时看一下内存中的用户信息数量
    imherer
        3
    imherer  
    OP
       2017 年 12 月 4 日
    @moka20477 netstat -nat|grep -i "port"|wc -l 我用这个命令查看了对应端口 TCP 是实时释放的, 应该是代码问题,debug 难度大啊
    momocraft
        4
    momocraft  
       2017 年 12 月 4 日
    单纯泄漏未必会导致慢,而你验到了慢,这是一个线索。有没有什么 eventemitter 忘记释放的?
    imherer
        5
    imherer  
    OP
       2017 年 12 月 4 日
    @momocraft 就是怀疑是不是用的 node-schedule 这个库哪里用法不对,还在排查中
    tvallday
        6
    tvallday  
       2017 年 12 月 4 日   1
    @imherer debug 难度虽然大但是你经历过之后将会是宝贵的经验,没有什么神秘的,很有可能就是缺一行代码。我上次游戏内存泄漏整整两个月都不知道原因在哪里,差点想换另一种语言重写。后来解决以后游戏连续运行两个月都没有问题。当然,也有可能你这个问题更隐蔽。
    bramblex
        7
    bramblex  
       2017 年 12 月 4 日
    大概率是你代码的问题

    闭包这个东西用不好内存泄露不要太正常
    bramblex
        8
    bramblex  
       2017 年 12 月 4 日
    @tvallday

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

    但是说实话, 只要把生命周期独立管理起来, 想内存泄漏还是很难的.
    maninnet
        9
    maninnet  
       2017 年 12 月 4 日
    maninnet
        10
    maninnet  
       2017 年 12 月 4 日   1
    t/395867
    看看这个有没有帮助?
    关于   &nsp; 帮助文档     自助推广系统     博客     API     FAQ     Solana     859 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 41ms UTC 22:13 PVG 06:13 LAX 15:13 JFK 18:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86