concn
concn
不知道是什么原因造成的这个问题,很多客户端会自动检测断线重连,但我gnet服务器并未进行关闭处理,;gnet会自动关闭以前无效的连接,还是需要我手动关闭处理呢?谢谢
 之前表达的问题不是很精确,我想表达的是,因为流程是走这个,所以才导致了客户端已经断开连接的但gnet没有关闭,从而导致连接数一直增加,无论这个linux设置多少连接限制,最后都会被占满;根本原因是gnet走这个流程的时候,没有把客户端关闭。 上图可以看到上午10点多的时候这个使用gnet库的程序连接数三百多,下午二点的时候,连接数已经是460,一直在增加,目前是1024可以使用2天,如果按上面链接设置成8000的话,大概估计可以使用半个月后仍然会出现这个问题,实际上我们只有几十个终端在连接,他们会有重连上来;我在windows上跑的这个程序不会有这个问题,说明是linux库和windows库的处理方式不一样.
实际上客户端不会主动断开连接,他如果判断没有连接了会不关闭之前的连接直接发起重连,重而导致了连接数一直在增加。
我明白了,问题主要不是出在这里,主要是出在没有close客户端上,这里只是问题的表现,表现出来的问题是没有close已经空闲的连接上,才导致了连接数一直增加。我找找代码看看如果客户端没有主动关闭服务器怎么能把它关闭掉。
应该是acceptor_unix.go的56行和57行是关闭socket的吧?如果是这样的话,那问题就出在没有走到这一步,在上面就直接返回了,所以socket没有被关闭掉,然后一直增加? 请问linux的是这个走到56和和57行gnetServer才会主动关闭socket的吗?
请问大神三个小白问题,1、gnet.Serve(echo, fmt.Sprintf("tcp://:%d", port), gnet.WithMulticore(multicore), gnet.WithReusePort(reuseport), gnet.WithTCPKeepAlive(330)) 如果启动的时候加上gnet.WithTCPKeepAlive这个参数,会起作用330秒没有数据自动关闭连接吗?2、是不是需要自己保存socket,因为目前没有保存,不知道在哪调用 c.Close() 3、gnet的OnClosed方法,是自己手动调用c.Close()后才会执行到吧?
 目前把server的OnClosed方法上来,然后在里面关闭,跑了二天看大概连接数一直稳定在130,解决问题。 所以可以这样理解,不管是客户端关闭还是服务端关闭连接,OnClose 都会被回调。但是必须还得自己手动调用一下c.Cloese()才可以?
windows不需要,实测linux是需要的,需要在OnClosed里调用 c.Close();否则打开的文件数一直在增长,即socket没有关闭,1024个三天就占满了,导致服务不再接受新消息,实际上我只有70个终端。自从在OnClosed里手动调用c.Close()方法后,打开的fd稳定在130个左右,解决问题。
应该是因为windows是设置deadlinetime,系统自动清理关闭的socket,linux的不明白原理