Redis太多打开文件错误

时间:2014-08-10 17:12:56

标签: python redis redis-py

我得到了太多的打开文件错误"当一定数量的用户超过(大约1200个并发用户)时。

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

然后我跟着this并没有改变同样的错误。

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

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

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

  

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

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

  

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

感谢。

1 个答案:

答案 0 :(得分:2)

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

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

如果您看到"太多打开文件错误"在Redis上,ulimit设置的方式高于用户数量(例如,来自django的ulkit 10k和1k连接),而不是你可能做的事情导致Redis连接泄漏(因此在一段时间内没有关闭)。

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

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

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