我得到了太多的打开文件错误"当一定数量的用户超过(大约1200个并发用户)时。
我使用this增加了限制,但我得到了同样的错误。
然后我跟着this并没有改变同样的错误。
创建连接我在django设置中使用,并在需要时使用REDIS
。
REDIS = redis.StrictRedis(host='localhost', port=6379, db=0)
为什么我这样做,因为它在redis邮件列表中是suggested,如下所示:
一个。创建一个全局redis客户端实例并让您的代码使用它。
这种方法适合连接池吗?或者我如何避免太多打开文件的错误? 在Django回复中我得到了
连接错误(由[Errno 24]引起) 许多打开的文件)",),)'
感谢。
答案 0 :(得分:2)
您正在为每个连接创建一个ConnectionPool;根据您创建REDIS连接的位置,您可能最终每次都创建一个新的连接池(例如,如果它在视图功能中)。
您应确保重新使用长期连接池创建连接;如果你在模块级别定义连接池实例并在初始化连接时重用它,你将确保只创建了一个池(至少每个python进程一个)。
如果您看到"太多打开文件错误"在Redis上,ulimit设置的方式高于用户数量(例如,来自django的ulkit 10k和1k连接),而不是你可能做的事情导致Redis连接泄漏(因此在一段时间内没有关闭)。
我建议您开始添加连接池并在那里设置最大连接限制(它是init签名的一部分);确保池仅在实际连接用户数量时引发异常>超过限制。
如果可以的话,增加ulimit; Redis可以轻松地连接超过1k。
如果你真的想限制你的python脚本和Redis之间的连接数量,你应该考虑使用BlockingConnectionPool,这将允许客户端在所有连接都在使用时等待(而不是抛出异常)或者可能使用像twemproxy这样的东西之间。