Redis打开文件过多错误

arn*_*old 5 python redis redis-py

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

我使用这个增加了限制,但是却遇到了同样的错误。

然后,我遵循了这一步骤,没有任何变化得到相同的错误。

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

REDIS = redis.StrictRedis(host='localhost', port=6379, db=0)
Run Code Online (Sandbox Code Playgroud)

我之所以这样做,是因为它在redis邮件列表中建议如下:

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

这种方法适合连接池吗?或者如何避免打开文件过多的错误?在Django响应中

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

谢谢。

Tom*_*gli 5

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

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

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

我建议你开始添加一个连接池并在那里设置最大连接限制(它的初始化签名的一部分);确保只有当实际连接用户数大于限制时,池才会引发异常。

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

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