NodejS 作为 Socket.IO 服务器,CPU 100%
发布于 8 年前 作者 cliang0917 6761 次浏览 来自 问答

使用了 setInterval 定时推送一些消息。连接数在1000左右。

原来 15 秒左右推送一次,经常出现自动断开连接的情况。

改成了20秒以后还是会有问题,而且有时有延迟。

现在CPU一直在100%

现在流程如下:

启动定时(20秒每次) - > 从 Couchbase 读取数据 -> 遍历当前登录人数 -> 针对不同人推送不同消息

7 回复

试试 alinode cpu-profile 功能,找出热点。相信对你有帮助。

情况具体些,比如服务器什么配置,nodejs是默认配置么, socket >1000后报什么错,你的case预计要处理多少个链接

你把各种log打出来看 我猜socket有很多ECONNRESET或者TIMEOUT

这是个比较复杂的SOCKET优化问题

已经解决了

原来是用IO对象直接 emit var io = require(“socket.io”)(http); io.emit(“cmd”+userid , _Str);

现在把每个连接的socket保存下来 onlineUsers[obj.userid] = {‘c_id’:obj.userid,‘socket’:socket}; 推送时 onlineUsers[userid].socket.emit(“cmd” +user id, _Str);

没有cpu密集型运算,怎么可能100%,单从socketio做IO发送操作只会增加内存消耗,不会飙升CPU的,从你提供的信息推测应该在第二和第三个环节有问题

setInterval(function(){ bucket.getMulti([ “Document1” , “Document2” ], function(err, result) { if(err){ console.log(new Date() + " : ERROR : " + err); } else { Emit(result); } }); } , 10 * 1000);

有个这个 。。。。

多次测试,就是 io.emit(“cmd”+userid , _Str); 这个的问题,这里注释掉以后就没啥问题。

完整的代码在这里:http://www.cnblogs.com/chenliang-zibo/p/5389939.html

其实东西并不多。

@captainblue2013 思路就是通过 CPU 采样找到热点函数,优化热点解决问题,欢迎试用。

回到顶部