我在debian 9上以mono的形式运行服务器应用程序。大约1000-2000个客户端已连接,并且应用程序经常冻结100%的CPU使用率。我做"杀死-QUIT pid"获取线程堆栈转储并始终坚持这一点:
"<unnamed thread>" at <unknown> <0xffffffff>
at (wrapper managed-to-native) System.Net.Sockets.Socket.Send_internal (intptr,byte[],int,int,System.Net.Sockets.SocketFlags,int&,bool) [0x00000] in <2b0d86369d72459baed0cee98a8e578a>:0
at System.Net.Sockets.Socket.Send_internal (System.Net.Sockets.SafeSocketHandle,byte[],int,int,System.Net.Sockets.SocketFlags,int&,bool) [0x0000c] in <2b0d86369d72459baed0cee98a8e578a>:0
at System.Net.Sockets.Socket.Send (byte[],int,int,System.Net.Sockets.SocketFlags,System.Net.Sockets.SocketError&) [0x00021] in <2b0d86369d72459baed0cee98a8e578a>:0
大约10-20分钟后,冻结结束,应用程序恢复。任何想法为什么会发生这种情况以及我能做些什么?
这是一个非阻塞套接字,并且不是常规阻塞调用,因为在此期间CPU使用率始终为100%。
编辑:解决了它。在Socket.Send的单声道实现中有一个无限循环,删除它完全解决了这个问题。