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

我很难理解的是,为什么处理请求的Django线程得到这么小的CPU片?几乎是后台任务占用了处理器,而其他线程只剩下了剩余的线程。

给定高CPU负载,可以使用哪些机制/选项来使Django快速响应?

最佳答案

听起来您需要调整后台操作的调度优先级。如果您不熟悉此术语,请遵循以下基本思想:为了运行多个进程,您的操作系统必须将CPU时间划分为几个小片,并将每个正在运行的进程分配给一个片。每次“时间片”结束时,操作系统都会选择一个新的进程在下一个时间片中运行。此选择称为CPU调度,并且每秒发生多次。

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

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

因此,考虑到所有这些,您想要执行以下操作之一:


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


较干净的方法是降低后台进程的优先级,因为与“响应”进程相比,这些进程可能更少。如果后台进程在Python中,则可以使用os.nice()函数调整自己的优先级。否则,程序可能具有配置选项来指定nice值。如果这些都不起作用,则只需renice,并且每次重新启动时也必须这样做。

当然,如果愿意,还可以通过adjusting the configuration,uWSGI(我不知道如何配置-否则配置renice)和Django应用(可能是)。

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


您需要root来增加优先级(降低优先级),但是不需要相反。这是另一个有利于降低后台进程优先级的观点。
别太看重价值观!您可以使用os.renice()top(这是“ NI”列)查看系统上运行的进程的各种精确值。您只需要设置数字,即可使您希望更频繁运行的进程的值比另一个进程的值低一点。


希望这对您有所帮助。您可以在手册页中找到更多信息:htopnice(1)renice(1)nice(3)。或Google对于“ Linux不错”或类似的东西。玩得开心!

关于python - 处理Django低响应性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31414275/

10-08 23:04