处理Django低响应性

时间:2015-07-14 18:16:15

标签: python django nginx uwsgi

我的Django应用程序中存在一些响应性差的问题,我不知道如何解释。 我在Cent Os开发环境中使用Nginx,uWSGI Django 1.7和Python3.4。还有一些后台CPU密集计算线程,它们定期运行执行某些任务(计算,Db操作,网络I / O)。由于需要处理大量任务,我注意到CPU利用率在较长时间内会增长到100%。在高CPU利用率期间,任何Django请求都需要花费大量时间来处理,有时甚至会因为Nginx而导致超时。

我发现很难理解为什么处理请求的Django线程获得如此小的CPU切片?几乎当后台任务占用处理器时,其他线程只剩下剩余的东西。

鉴于CPU负载较高,Django可以采用哪些机制/选项来响应?

1 个答案:

答案 0 :(得分:1)

听起来您需要调整后台操作的调度优先级。如果你不熟悉这个术语,这里有一个基本的想法:为了运行许多进程,你的操作系统必须将CPU时间分成几个小片,并将每个正在运行的进程分配给一个片。每次"时间片"操作系统选择一个新进程在下一个时间片中运行。这种选择称为CPU调度,每秒发生多次。

大多数操作系统允许您调整流程的优先级。从本质上讲,它为操作系统提供了一个提示"对于其他正在运行的进程,它应该或多或少地安排进程。 Linux允许您通过设置进程的优先级来调整进程的优先级"值。好的值范围从-20(最高优先级/最常安排)到19或20(最低优先级)。 (这与你期望的一样倒退。)

您可以通过几种方式设置流程的优质价值。当你启动它时,你可以像这样运行它:nice -n [value] [program name]。如果该进程已在运行,您可以运行renice -n [value] [pid],其中pid是进程ID。进程还可以使用nice(3)系统调用调整自己的好值。

所以,考虑到所有这些,你想要做一个这些事情:

  • 提高需要响应的进程的优先级(降低nice值)(即nginx,uwsgi,django)。
  • 降低后台进程的优先级(增加nice值)(即计算,数据库索引等)。

更干净的事情是降低后台进程的优先级,因为这些可能比#34;响应时间更少。流程。如果后台进程是Python,他们可以使用os.nice()函数来调整自己的优先级。否则,程序可能有一个配置选项来指定nice值。如果这些都不起作用,那么您只需要renice它们,并且每次重新启动时都必须这样做。

当然,如果你愿意的话,你也可以通过adjusting the configuration,uWSGI来增加n​​ginx的优先级(我不知道如何配置,否则renice ),以及您的Django应用程序(可能带有os.renice())。

无论你做什么,请记住以下几点:

  • 你需要root来增加优先级(减少不错),但不要做相反的事情。这是支持降低后台进程优先级的另一点。
  • 不要超越好价值观!您可以使用tophtop(" NI"列)查看系统上运行的各种流程值。您只需设置数字,以便您希望更频繁地运行的进程比另一个更低一点。

希望这一切都有帮助。您的手册页中提供了更多信息:nice(1)renice(1)nice(3)sched(7)。或Google for" linux nice"或类似的东西。玩得开心!