CNode

NodejS 作为 Socket.IO 服务器,CPU 100%

问答
Ccliang0917发布于10 年前最后回复10 年前7 回复7703 浏览0 收藏

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

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

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

现在CPU一直在100%

现在流程如下:

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

查看回复

回复 (7)

H
HarryHong#1·10 年前

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

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

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

C
cliang0917#2·10 年前

已经解决了

原来是用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);

H
haozxuan#3·10 年前

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

C
cliang0917#4·10 年前

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

其实东西并不多。

Y
yjhjstz#5·10 年前
引用 captainblue2013@yjhjstz 能具体点吗

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

Y
yjhjstz#6·10 年前

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

参与回复
登录后即可参与回复。登录