我的Django应用程序中存在一些响应性差的问题,我不知道如何解释。 我在Cent Os开发环境中使用Nginx,uWSGI Django 1.7和Python3.4。还有一些后台CPU密集计算线程,它们定期运行执行某些任务(计算,Db操作,网络I / O)。由于需要处理大量任务,我注意到CPU利用率在较长时间内会增长到100%。在高CPU利用率期间,任何Django请求都需要花费大量时间来处理,有时甚至会因为Nginx而导致超时。
我发现很难理解为什么处理请求的Django线程获得如此小的CPU切片?几乎当后台任务占用处理器时,其他线程只剩下剩余的东西。
鉴于CPU负载较高,Django可以采用哪些机制/选项来响应?
答案 0 :(得分:1)
听起来您需要调整后台操作的调度优先级。如果你不熟悉这个术语,这里有一个基本的想法:为了运行许多进程,你的操作系统必须将CPU时间分成几个小片,并将每个正在运行的进程分配给一个片。每次"时间片"操作系统选择一个新进程在下一个时间片中运行。这种选择称为CPU调度,每秒发生多次。
大多数操作系统允许您调整流程的优先级。从本质上讲,它为操作系统提供了一个提示"对于其他正在运行的进程,它应该或多或少地安排进程。 Linux允许您通过设置进程的优先级来调整进程的优先级"值。好的值范围从-20(最高优先级/最常安排)到19或20(最低优先级)。 (这与你期望的一样倒退。)
您可以通过几种方式设置流程的优质价值。当你启动它时,你可以像这样运行它:nice -n [value] [program name]
。如果该进程已在运行,您可以运行renice -n [value] [pid]
,其中pid
是进程ID。进程还可以使用nice(3)
系统调用调整自己的好值。
所以,考虑到所有这些,你想要做一个这些事情:
更干净的事情是降低后台进程的优先级,因为这些可能比#34;响应时间更少。流程。如果后台进程是Python,他们可以使用os.nice()
函数来调整自己的优先级。否则,程序可能有一个配置选项来指定nice值。如果这些都不起作用,那么您只需要renice
它们,并且每次重新启动时都必须这样做。
当然,如果你愿意的话,你也可以通过adjusting the configuration,uWSGI来增加nginx的优先级(我不知道如何配置,否则renice
),以及您的Django应用程序(可能带有os.renice()
)。
无论你做什么,请记住以下几点:
top
或htop
(" NI"列)查看系统上运行的各种流程值。您只需设置数字,以便您希望更频繁地运行的进程比另一个更低一点。希望这一切都有帮助。您的手册页中提供了更多信息:nice(1)
,renice(1)
,nice(3)
,sched(7)
。或Google for" linux nice"或类似的东西。玩得开心!