记一次 .NET 某娱乐聊天流平台 CPU 爆高分析( 四 )

说明此时有大概 1.5w 的异步请求待回头,请求量还是蛮大的,但还是没找到异常的用户代码,只能找下到底是谁发起了什么请求 。
0:080> !mdsoThread 80:Location          Object            Type------------------------------------------------------------...000000000d24e488  0000000358c57918  System.Net.HttpWebRequest000000000d24e2e8  00000001407b5b40  System.String  "net_io_readfailure"...0:080> !mdt -r:2 0000000358c579180000000358c57918 (System.Net.HttpWebRequest)    _Uri:0000000358c57210 (System.Uri)        m_String:00000002407ee430 (System.String) Length=98, String="https://api.xxxx/peer_messages"        ....可以看到请求的连接是 https://api.xxxx/peer_messages,是一个第三方的API接口,由于底层的连接关闭,导致了最后 net_io_readfailure 。
把所有的信息整合一下就是:
当请求量大了之后,访问 https://api.xxxx/peer_messages 会出问题,对方关闭了底层连接,导致客户端这边请求出现了大量 IO 回调异常:IOException: Unable to read data from the transport connection: The connection was closed.,2min之间多达合计 4w 的异常抛出,进而引发 CPU 爆高,将信息告诉了朋友,让朋友重点关注下 https://api.xxxx/peer_messages 这个连接 。
三: 总结这次生产事故主要是由于高峰期请求量过大,由于某种原因 Socket 连接关闭,导致了大量的异步回调异常 。
解决方法在调用端做好限流,据朋友说减少了不必要的 https://api.xxxx/peer_messages 调用,目前没有出现 CPU 爆高现象 。

经验总结扩展阅读