【问题标题】:Django instances building up until crashes site (UPDATE: Redis deadlock HIGHLY suspected)Django 实例建立直到崩溃站点(更新:高度怀疑 Redis 死锁)
【发布时间】:2012-08-15 23:45:16
【问题描述】:

请参阅下面的 EDIT#2 了解可能的根本原因

我的 Django 线程/进程(同时使用 'method=threaded' 和 'method=prefork' 时会发生同样的事情),每 10 分钟左右,随机构建如下: http://i.imgur.com/VyUAv.png 例如很多这样的过程:

python ./manage.py runfcgi method=threaded host=localhost port=8888

然后在一分钟左右的时间里,线程/进程建立起来足以取出我的网站。

网站负载非常小,但流量相当高,所以我认为这是某种阻塞问题。

关于如何解决甚至有效调试此问题的任何想法? 谢谢。

编辑:在我的许多 Django 视图中,我也经常使用 Redis。我现在开始研究 Redis 死锁问题是否是问题的根源......

EDIT#2:我看到问题开始时 Redis 被固定在 100% CPU,这让我相信 Redis 死锁是核心问题。

我也遇到了这个错误:

"(error) LOADING Redis 正在将数据集加载到内存中"

当尝试通过此命令完全重启 Redis 时:

./src/redis-cli flushall

重要提示:我在一个单独的 EC2 微型实例上使用 Redis 2.2.7,而不是我的 Django Web 应用程序。

【问题讨论】:

  • 您是否在任何地方使用线程或进程?
  • 服务器上的任何地方?是的,线程和进程,用于不同的事物。也许我不明白你的问题?
  • 对不起,我的意思是在 django 内部,有一次,我看到一个死锁导致很多额外进程启动的情况。
  • 您是如何调试或设法绕过该死锁的?谢谢!
  • Redis 是单线程的。 Redis 中不可能出现死锁,因为没有锁。

标签: python django nginx redis deadlock


【解决方案1】:

线程和进程是两个不同的东西。如果整个站点出现故障,原因很可能是线程。

【讨论】:

  • 我知道线程和进程是不同的东西:/ 我只是指出来表明我已经尝试了几种不同的配置。
  • 看到您的编辑:当子线程和进程在父进程重新启动和/或启动时尝试连接到其父进程时,可能会发生响应错误。如果您有一个多子单亲环境,它肯定会导致网络故障。如果您收到这些“Redis 正在将数据集加载到内存中”的负载。这可能是由于当客户端没有被阻塞时孩子正在加载数据,这可能会导致死锁,因为它试图在从内存中读取数据的同时向客户端显示数据。
【解决方案2】:

原来是 Redis 中的一个不起眼的错误。

Redis 更新,Redis 2.2.7 -> Redis 2.4.16 修复了该问题。

【讨论】:

    猜你喜欢
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 2018-06-06
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多