Redis过多打开文件错误

7
当一定数量的用户超过时(大约为1200个并发用户),我会收到“太多打开的文件错误”的消息。
我使用this增加了限制,但是仍然遇到相同的错误。
然后我按照this所述的步骤进行操作,但没有改变,仍然出现相同的错误。
在我的Django设置中,我使用REDIS来创建连接并在需要时使用它。
REDIS = redis.StrictRedis(host='localhost', port=6379, db=0)

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

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

这种方法适用于连接池吗?或者我如何避免打开文件过多的错误? 在Django响应中,我得到以下内容:

连接错误(由:[Errno 24] Too many open files)",),)'

谢谢。


哪个组件给你带来了“太多打开的文件”错误?是Redis实例还是Django进程? - Jeff Tratner
@JeffTratner编辑了这篇文章。 - arnold
你检查了 Django 进程的 ulimits 是否足够高吗? - Jeff Tratner
是的,我检查过了。这已经足够了。 - arnold
1个回答

5
您正在为每个连接创建ConnectionPool;取决于您在何处创建REDIS连接,可能会每次都创建新的连接池(例如,在视图函数中)。
您应该确保创建重用长期存在的连接池;如果您在模块级别定义连接池实例并在初始化连接时重用它,那么您将确保只创建1个池(至少每个python进程一个)。
如果您在Redis上看到“打开文件太多错误”,而ulimit设置远高于用户数量(例如,ulimit 10k和来自django的1k连接),那么您可能会做一些导致Redis连接泄漏的事情(因此不关闭一段时间)。
我建议您开始添加连接池并在其中设置最大连接限制(这是init签名的一部分);确保池仅在实际连接用户数量>限制时引发异常。
如果可以的话,请增加ulimit;Redis可以轻松地使用超过1k的连接。
如果您真的想限制Python脚本与Redis之间的连接数量,您应该考虑使用BlockingConnectionPool,这将让客户端在所有连接都在使用时等待(而不是抛出异常),或者使用twemproxy之类的东西。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接