自定义了一个通讯协议,在Gateway中使用,但是发生一个问题,请指教:
看上去协议工作正常,而且相关消息处理过程也工作正常
客户端会不停的向服务器发送心跳包,较长一段时间后,出现了“failed to open stream: Too many open files ”的错误警告
此时只有一个连接的
没有数据库或其他缓存操作
不知道,出现这种情况,我应该从什么地方开始找问题
Too many open files , 进程打开的文件句柄数超过系统设置,你的情况应该是进程打开或者接受了很多socket链接。
如果你知道报这个错的进程pid,通过 lsof -nPp 进程pid 查看进程打开了哪些文件句柄
另外linux系统默认系统文件打开数比较低,建议根据workerman手册优化下Linux内核,否则无法承载大并发 http://doc3.workerman.net/appendices/kernel-optimization.html
@walkor
我检查是发现,我自定义的协议中,如果收到的buffer长度跟收到的消息长度一样时,我直接return这个包的长度了,对比websocket协议,发现正常接收数据时,都是处理完decode后,return 0,不知道跟这个有没有关系呢?
return 长度是正确的做法。 websocket协议比较特殊,有个握手过程,握手的包不需要处理,所以return 0了。这个你不用关心
Too many open files ,
进程打开的文件句柄数超过系统设置,你的情况应该是进程打开或者接受了很多socket链接。
如果你知道报这个错的进程pid,通过 lsof -nPp 进程pid 查看进程打开了哪些文件句柄
另外linux系统默认系统文件打开数比较低,建议根据workerman手册优化下Linux内核,否则无法承载大并发
http://doc3.workerman.net/appendices/kernel-optimization.html
@walkor
我检查是发现,我自定义的协议中,如果收到的buffer长度跟收到的消息长度一样时,我直接return这个包的长度了,对比websocket协议,发现正常接收数据时,都是处理完decode后,return 0,不知道跟这个有没有关系呢?
return 长度是正确的做法。
websocket协议比较特殊,有个握手过程,握手的包不需要处理,所以return 0了。这个你不用关心