自定义协议长链接的问题

jbking

自定义了一个通讯协议,在Gateway中使用,但是发生一个问题,请指教:

看上去协议工作正常,而且相关消息处理过程也工作正常

客户端会不停的向服务器发送心跳包,较长一段时间后,出现了“failed to open stream: Too many open files ”的错误警告

此时只有一个连接的

没有数据库或其他缓存操作

不知道,出现这种情况,我应该从什么地方开始找问题

2367 3 0
3个回答

walkor

Too many open files ,
进程打开的文件句柄数超过系统设置,你的情况应该是进程打开或者接受了很多socket链接。

如果你知道报这个错的进程pid,通过 lsof -nPp 进程pid 查看进程打开了哪些文件句柄

另外linux系统默认系统文件打开数比较低,建议根据workerman手册优化下Linux内核,否则无法承载大并发
http://doc3.workerman.net/appendices/kernel-optimization.html

  • 暂无评论
jbking

@walkor

我检查是发现,我自定义的协议中,如果收到的buffer长度跟收到的消息长度一样时,我直接return这个包的长度了,对比websocket协议,发现正常接收数据时,都是处理完decode后,return 0,不知道跟这个有没有关系呢?

  • 暂无评论
walkor

return 长度是正确的做法。
websocket协议比较特殊,有个握手过程,握手的包不需要处理,所以return 0了。这个你不用关心

  • 暂无评论
年代过于久远,无法发表回答
🔝