7

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

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

然后我跟着这个,没有改变得到同样的错误。

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

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

为什么我这样做是因为它在 redis 邮件列表中被建议如下:

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

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

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

谢谢。

4

1 回答 1

5

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

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

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

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

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

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

于 2014-08-13T09:52:51.483 回答