socket.io 当大量客户端同时继开时会存在没有回收客户端信息的问题
发布于 2年前 作者 t42dw 1983 次浏览

还是用socket.io写消息中心的问题…压测的时候如果出现当大量客户端同时继开时socket.io中会存在没有回收客户端信息且一直没法回收,这时如果在不断推消息给socket.io时会造成cpu和内存升高一直到OM…。 消息推送模式: service -> redis -> socket.io ->客户端 集群:用的nginx

这个问题我想是当存在废客户端信息的时候…socket.io在缓存发送不出去的消息且不断循环尝试造成的,所以应该想办法回收这些废客户端来解决…可我一直没搞定…晕了…求帮助…

另求:怎么得到当前进程所在cpu的负载情况…我想做个流量控制当cpu高的情况下不接收redis中的消息

11 回复
  • socket.io应该是有心跳机制检测的,你怎么压测的?
  • 我以前遇到个问题是redis库不能及时处理大量请求导致node进程内存飙升至OM

2 机器 6个核 6进程

3000客户端 每50毫秒向3000客户端推送消息

昨天我进一步测试当使用volatile消息的时候服务会稳定

我计算了一下:

每秒我会推出20次消息也就是每秒 6W消息(20*3000) 客户端统计每秒收到 5W多一点

也就是说我这2机器6进程达不到 每秒6W,这个时socket.io开始排队缓存消息最后越来越多照成服务异常,我是这么理解的

对于这个问题我准备对推入的消息做分类就是区分是否为volatile消息,然后对nodejs 接收消息做流量控制

@t42dw

  • 每秒6W已经比较高了,你是什么类型的应用?消息丢失或推送失败的可容忍性有多大?
  • socket.io没有具体研究过,只改过客户端的代码让它不分浏览器全部使用json-polling,因为nginx1.2还不支持websocket
  • 建议跟踪一下socket.io推送消息的代码,看是不是如你所说的socket.io开始排队缓存消息最后越来越多照成服务异常

@sumory nginx1.2加模块就可以支持websocket拉

@t42dw 嗯,我在网上搜过,说是可以,我没试。再等1.3的稳定版,1.3支持websocket了。

@sumory nginx那模块还是很稳定的…从我压测来看! 我就准备做一个消息中心… 客户端为浏览器,其实本身我目前测试的方向有一定问题现在是客户端少消息量大,真正的场景应该是客户端多消息比较少(大概能支持到每个客户端每秒2消息)。

这里不得不说压力测试的问题了…模拟这么多客户端真是不好办呀我现在是用socket.io的java客户端模拟的在一台2核的机器上最多也就能开1200个,真心没那么多机器呀…不知道还有什么更加好的办法没

@t42dw

用携程模式,比方说python gevent ,一台机器模式几万个不是问题

@jjx 携程模式…没看懂.!! 话说我不会python呢…

@t42dw 是协程 coroutine,高效的并发模型:协程(gevent),轻量级进程(erlang),单线程+事件驱动(node.js,python twisted,ruby event machine)

回到顶部