【问题标题】:too many open files in RedisRedis 中打开的文件太多
【发布时间】:2022-07-08 08:06:36
【问题描述】:

在我们的项目中,我们使用了一个总内存为 4 GB 的 Redis 实例(托管在 GCP 上),其中目前仅使用了 2 GB。总连接数限制为 1000。几天前,我们在从 Redis 缓存读取时发现了一个意外错误(持续了几分钟)-“dial tcp xx.xx.xx.xx:6379: socket: too many open files”

现在,我检查了 Redis 的 CPU 使用率和内存使用率都没有激增,redis 实例也没有出现故障。几分钟后,该错误自动消失。虽然看起来这个错误是指同时打开的大量连接。我检查了默认连接池大小(如果有的话),我在 go-redis 库(我们正在使用)的官方文档中观察到:

为了提高性能,go-redis 会自动管理一个网络连接池(套接字)。默认情况下,每个可用 CPU 的池大小为 10 个连接,由 runtime.GOMAXPROCS 报告。在大多数情况下,这已经绰绰有余,但对其进行调整几乎没有帮助。

所以,我无法理解是什么导致了这个问题以及如何解决它(如果它将来再次出现)?有人可以帮忙吗?

【问题讨论】:

    标签: go redis database-connection connection-pooling go-redis


    【解决方案1】:

    这不是 Redis 的问题,可能是您的代码中的问题。

    Linux 中的进程对它们施加了限制,一个限制是一个进程一次可以拥有的“打开文件描述符”的数量。

    文件描述符由进程创建,以使进程能够访问资源并对其执行操作,例如对其进行读取/写入。文件描述符不仅仅代表您认为的磁盘上的传统“文件”,它还用于代表程序可以读取/写入的网络套接字。

    在您的情况下,您会看到: "dial tcp xx.xx.xx.xx:6379: socket: too many open files"

    您的程序试图打开一个到 redis 的新网络连接,在这样做时,它必须创建一个套接字,这需要使用文件描述符。您返回“打开的文件过多”的错误是由于达到此限制。

    你可以做两件事

    1. 提高这个限制,去阅读ulimit https://ss64.com/bash/ulimit.html 或者搜索你的错误,很多结果。
    2. 调查为什么打开的文件太多。

    第二部分可能表明您正在打开文件/套接字,而不是关闭它们,从而导致您“泄漏”描述符。例如,如果每次查询 Redis 时都打开一个永远不会关闭的新连接,最终会用完文件描述符。

    【讨论】:

      猜你喜欢
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 2012-05-09
      相关资源
      最近更新 更多