原文:Windows服务器【由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作】问题调查 - 奋斗的大橙子 - 博客园 (cnblogs.com)
因为我的服务器上也遇到了这个问题,经查是百度网盘耗尽了socket。
今天测试反应了一个问题,说接口返回的速度变慢了,并且返回的数据也不对。然后就找到了我o(╥﹏╥)o。
第一个反应就是查日志,不查不要紧,一查吓一跳,整个服务器上所有的站点都报错了。异常信息如下:
System.AggregateException: One or more errors occurred. ---> System.Net.Sockets.SocketException: 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。
看着信息的提示应该是socket资源被耗尽了。第一反应就是重启系统,但是这只是应急的做法,后面一定还会出现,一定是程序哪里不对了。
首先,通过命令查看一下端口的占用情况
1 |
netstat -ano
|
果然有大量的Tcp连接处在了 FIN_WAIT_2 的状态,并且都是访问同一个地址,这个6379端口是Redis服务常用的端口(先怀疑是redis服务),
现在的问题就是定位是哪个进程了,根据提示 Pid=13220,使用命令(或者打开【任务管理器】)
1 |
tasklist
|
我遇到的问题是 这个PID根本就不存在,这可怎么整,这个进程可能早就被回收了。突然间我想到是不是事件查看器能有些线索?
我打开的【事件查看器】,找到了【系统】,右键进行查询,果然找到了问题症结所在。
我打开这个站点的配置文件,看到了那个redis的配置,是个域名! ping一下这个域名
果然各种连不上,IP也对上了! 我们公司的策略连不上是正常的,这个配置不应该使用正式版的配置。
自己补充:
首先是用 netstat -ano 查看所有的端口占用,看到很多。
查看端口5287: netstat -ano | findstr "5287"
查看PID对应的进程:tasklist | findstr "7432" (注 7432是进程的id即PID)
终止进程:taskkill /PID "12392" /F (注 12392是进程的id即PID)
也可以通过 TCPView查看port/pid