记一次Django reload导致 CPU飙升+大量stat系统调用的解决方案

本文分析了appserver在测试机上CPU使用率接近100%的问题,通过strace发现大量stat系统调用,确认为Django的模块重载机制导致。通过禁用模块重载(--noreload),成功解决了CPU飙高问题,使CPU使用率稳定在1%。
摘要由CSDN通过智能技术生成

背景:

发现app server在测试机经常CPU飙升到接近100%

strace发现大量的stat系统调用:

[root@app02 ~]#  strace -p 2205 -C
...
stat("/home/ouyang/storyapi/xb_handlers/support/system/get_pop_ups_handler.py", {st_mode=S_IFREG|0644, st_size=4094, ...}) = 0
stat("/home/ouyang/storyapi/xb_dao/support/share/base/user_share_newpull_dao.py", {st_mode=S_IFREG|0644, st_size=3695, ...}) = 0
stat("/usr/lib/python2.7/site-packages/urllib3/exceptions.py", {st_mode=S_IFREG|0644, st_size=6603, ...}) = 0
stat("/home/ouyang/storyapi/xb_dao/pay/comic/record/__init__.py", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
stat("/usr/lib/python2.7/site-packages/urllib3/packages/__init__.py", ^Cstrace: Process 6134 detached
 <detached ...>
% time     seconds  usecs/call     calls    errors syscall
  ---- ----------- ----------- --------- --------- ----------------
▽96.53   20.122361       17332      1161       252 futex
  2.95    0.614242           2    328764       477 stat
  0.35    0.073086         163       448           read
  0.06    0.013246         166        80           select
  0.04    0.008513           5      1721      1388 open
  0.02    0.004120           2      1780           getdents
  0.01    0.002841           5       531           fstat
  0.01    0.002252           3       890           openat
  0.01    0.001959           2      1226           close
  0.01    0.001300           1       883           lstat
  0.01    0.001283           7       174           munmap
  0.00    0.000485           3       191           mmap
  0.00    0.000161           3        51           lseek
  0.00    0.000080           2        34           brk
  0.00    0.000039          39         1           clone
  0.00    0.000014           3         5           mprotect
  0.00    0.000005           1         5         5 ioctl
  0.00    0.000000           0         6         6 access
  0.00    0.000000           0        12           fcntl
------ ----------- ----------- --------- --------- ----------------
100.00   20.845987                337963      2128 total
[root@app02 ~]#  

分析:

1、业务代码并没有很多针对文件相关的操作。
2、看stat系统调用各个代码文件都有涉及到,怀疑是django的reload模块导致。

尝试:启动服务器时增加--noreload选项

[root@app02 ~]#    cat /etc/supervisord.d/app.ini 
[program:app]
user=root
environment= PATH="/usr/bin"
directory=/home/ouyang/storyapi
command=python manage.py runserver 0.0.0.0:8002 --nothreading --noreload
redirect_stderr=true
stdout_logfile=/home/ouyang/storyapi/log/super.log
stderr_logfile=/home/ouyang/storyapi/log/super.err
startsecs=1
stopwaitsecs=1
stopasgroup=true

结果:

1、问题解决,没有大量的stat系统调用了;
2、CPU稳定在1%。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值