我正在使用this library。几小时或一天后,websocket.JSON.Recieve将出错,并将获得EOF。我再次连接到网络套接字没有任何问题,但是我只是继续获得EOF,直到我重新启动我的应用程序。
func getMessage(ws *websocket.Conn) (m Message, err error) {
err = websocket.JSON.Receive(ws, &m)
if err != nil {
log.Printf("Get Message - %s - Reconnecting...", err)
ws, _ = connect(token) // This just does a dial
err = websocket.JSON.Receive(ws, &m)
}
return
}
答案 0 :(得分:1)
我最好的猜测是它与“最大打开文件”有某种关联。这是一个很长的镜头,但试一试。
您的服务器/ lib未正确关闭/释放已结束/已结束的连接。
它的操作系统特定,但我猜你使用的是Linux。 因此,下次问题发生时(重新启动应用程序之前),您可以运行
# lsof -p PID | wc -l
# lsof -a -p PID | wc -l
OR
# cd /proc/PID/fd; ls -l | wc -l
其中PID是服务器控制台上的服务器应用程序PID?并将其与lsof -a -p PID
一起发布,通过链接到gist或其他东西(因为我期待很长的名单)。
使用# ps aux | grep APPNAME
或# pidof APPNAME
找到PID。
您可以使用
检查服务器范围的“最大打开文件”sysctl fs.file-max
如果是这种情况,您可以使用sysctl -w fs.file-max= 100000
增加最大打开文件,但它只会延迟不可避免的情况,或者深入研究代码并处理这些未终止的连接。
有用链接list open files,max open files或谷歌自己。