Windows服务器【由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作】

原文: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

posted @ 2022-12-25 17:55  百年俊少  阅读(4234)  评论(0编辑  收藏  举报