处理redis 报错:由于系统缓冲区空间不足或队列已满, 不能执行套接字上的操作【windowns server服务器测试成功】

艺帆风顺 发布于 2025-04-03 20 次阅读


一、故障现象:

如图,redis服务处于运行状态,使用redis-cli工具无法正常连接。业务系统中断、用户无法正常登陆。

    Could not connect to Redis at 127.0.0.1:6379: 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。

    二、故障定位:

        可能的原因:

        1、Redis 服务器的系统缓冲区(如文件描述符、网络缓冲区等)已满,无法接受新的连接请求或处理已有连接的数据。

        2、Redis 服务器的客户端连接队列已满,无法接受新的客户端连接。

        故障解决:

    1. 检查并调整 Redis 服务器的系统缓冲区大小。可以通过修改操作系统配置文件或者在启动 Redis 服务器时指定相关参数来实现。例如,在 Linux 系统中,可以修改 /proc/sys/net/core/somaxconn 文件来调整最大连接数。

    2. 检查并调整 Redis 服务器的客户端连接队列大小。可以通过修改 Redis 配置文件中的 maxclients 参数来实现。例如,将 maxclients 设置为一个更大的值,以允许更多的客户端连接。

    3. 分析 Redis 服务器的日志,查找导致缓冲区空间不足或队列已满的具体原因,并根据日志信息进行相应的优化和调整。

      # Set the max number of connected clients at the same time. By default# this limit is set to 10000 clients, however if the Redis server is not# able to configure the process file limit to allow for the specified limit# the max number of allowed clients is set to the current file limit# minus 32 (as Redis reserves a few file descriptors for internal uses).## Once the limit is reached Redis will close all the new connections sending# an error 'max number of clients reached'.#maxclients 65535 

      三、其他方法:

      原文:Windows服务器【由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作】问题调查 - 奋斗的大橙子 - 博客园 (cnblogs.com)

      https://www.cnblogs.com/dcz2015/p/10214791.html

      因为我的服务器上也遇到了这个问题,经查是百度网盘耗尽了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

        版权声明:本文内容始发于博客园>作者:奋斗的大橙子,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。始发链接:https://www.cnblogs.com/dcz2015/p/10214791.html在此特别鸣谢原作者的创作。此篇文章的所有版权归原作者所有,商业转载建议请联系原作者,非商业转载请注明出处。