【问题标题】:Redis too many open files errorRedis打开文件太多错误
【发布时间】:2014-10-03 13:28:46
【问题描述】:

当一定数量的用户超过(大约 1200 个并发用户)时,我收到“打开文件过多错误”。

我使用 this 增加了限制,但我遇到了同样的错误。

然后我关注this 并没有得到相同的错误。

为了创建连接,我在 django 设置中使用并在需要时使用 REDIS

REDIS = redis.StrictRedis(host='localhost', port=6379, db=0)

为什么我这样做是因为它在 redis 邮件列表中是 suggested,如下所示:

一个。创建一个全局 redis 客户端实例并让您的代码使用它。

这种方法适合连接池吗?或者我如何避免打开的文件太多这个错误? 在 Django 响应中,我得到了

连接错误(由:[Errno 24]太 许多打开的文件)",),)'

谢谢。

【问题讨论】:

  • 哪个组件给你"too many open files" 错误?是redis实例吗? django 进程?
  • @JeffTratner 编辑了帖子。
  • 您是否检查过 django 进程的 ulimit 是否足够高?
  • 是的,我查过了。够了。

标签: python redis redis-py


【解决方案1】:

您正在为每个连接创建一个 ConnectionPool;根据您创建 REDIS 连接的位置,您可能最终每次都会创建一个新的连接池(例如,如果它在视图中的功能)。

您应该确保创建连接时重用了一个长期存在的连接池;如果您在模块级别定义连接池实例并在初始化连接时重用它,您将确保只创建 1 个池(每个 python 进程至少一个)。

如果您在 Redis 上看到“打开文件过多错误”且 ulimit 设置远高于用户数量(例如,来自 django 的 ulimit 10k 和 1k 连接),那么您可能正在做一些导致 Redis 连接泄漏的事情(因此在一段时间内不会关闭)。

我建议你开始添加一个连接池并在那里设置一个最大连接限制(它是初始化签名的一部分);确保池仅在实际连接用户数 > 超过限制时引发异常。

如果可以的话,增加ulimit; Redis 可以轻松地处理超过 1k 的连接。

如果你真的想限制你的 python 脚本和 Redis 之间的连接数量,你应该考虑使用 BlockingConnectionPool,它会让客户端在所有连接都在使用时等待(而不是抛出异常),或者可能使用类似 twemproxy 的东西之间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-08
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多