django性能分析工具(django silk)

作者: admin 分类: 开发那些事 发布时间: 2018-07-11 20:21

django silk

在开发过程中,有很多时候需要了解程序性能瓶颈,比如程序执行时间、网络耗时、数据库连接时间等;
那接下来,django silk就派上用场了!

安装

https://github.com/jazzband/django-silk

pip install django-silk
# or 
pip install https://github.com/jazzband/silk/archive/3.0.1.tar.gz

settings.py

MIDDLEWARE = [
    ...
    'silk.middleware.SilkyMiddleware',
    ...
]

INSTALLED_APPS = (
    ...
    'silk'
)

urls.py

urlpatterns += [url(r'^silk/', include('silk.urls', namespace='silk'))]

迁移

python manage.py makemigrations

python manage.py migrate

python manage.py collectstatic

性能报告

启动项目后,访问:项目网址/silk/,可查看性能报告,访问项目页面后,查看报告;
摘要报告:

请求列表:

请求详细:

请求的sql部分:

查看某一条sql执行情况:

需要程序详细的跟踪记录和执行情况,需要添加装饰器,以联系上下文来参考:
settings设置:

# 使用Python的内置cProfile分析器
SILKY_PYTHON_PROFILER = True

# 生成.prof文件,silk产生的程序跟踪记录,详细记录来执行来哪个文件,哪一行,用了多少时间等信息
SILKY_PYTHON_PROFILER_BINARY = True

# .prof文件保存路径
SILKY_PYTHON_PROFILER_RESULT_PATH = '/data/profiles/'

函数加上装饰器

from silk.profiling.profiler import silk_profile

@silk_profile(name='user login') # name在Profiling页面区分不同请求名称
def test(request):
    pass

访问程序后,查看
分析情况:

使用标准库pstats查看.prof文件

profiles文件也可以用python标准库中的pstats查看,大致就是长这样:

In [1]: import pstats

In [2]: p = pstats.Stats('2ea9c9b7-df1f-47eb-9590-6fdaa8521a16.prof')

In [3]: p.strip_dirs().sort_stats('cumtime').print_stats(30)
Wed Jul 11 10:10:33 2018    2ea9c9b7-df1f-47eb-9590-6fdaa8521a16.prof

         17709 function calls (17222 primitive calls) in 0.410 seconds

   Ordered by: cumulative time
   List reduced from 645 to 30 due to restriction <30>

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.409    0.409 exception.py:38(inner)
        1    0.000    0.000    0.409    0.409 base.py:157(_get_response)
        1    0.000    0.000    0.409    0.409 login_v.py:48(auth_api_new)
        1    0.000    0.000    0.409    0.409 loginVersion.py:105(auth_api_new_v2)
        5    0.000    0.000    0.378    0.076 query.py:1116(_fetch_all)
        6    0.001    0.000    0.378    0.063 query.py:47(__iter__)
        3    0.000    0.000    0.371    0.124 sql.py:20(execute_sql)
        1    0.000    0.000    0.344    0.344 token.py:51(checkToken)
        2    0.000    0.000    0.325    0.163 query.py:560(first)
        2    0.000    0.000    0.324    0.162 query.py:235(__iter__)
        3    0.000    0.000    0.261    0.087 traceback.py:189(format_stack)
        3    0.000    0.000    0.253    0.084 traceback.py:196(extract_stack)
        3    0.006    0.002    0.253    0.084 traceback.py:313(extract)
      396    0.003    0.000    0.240    0.001 traceback.py:279(line)
      132    0.001    0.000    0.238    0.002 linecache.py:15(getline)
      132    0.002    0.000    0.236    0.002 linecache.py:37(getlines)
       23    0.002    0.000    0.235    0.010 linecache.py:82(updatecache)
       23    0.001    0.000    0.221    0.010 tokenize.py:448(open)
       23    0.002    0.000    0.219    0.010 tokenize.py:355(detect_encoding)
       30    0.001    0.000    0.216    0.007 tokenize.py:379(read_or_stop)
       30    0.215    0.007    0.215    0.007 {method 'readline' of '_io.BufferedReader' objects}
        3    0.000    0.000    0.082    0.027 compiler.py:860(execute_sql)
        3    0.000    0.000    0.077    0.026 manager.py:84(manager_method)
        3    0.000    0.000    0.066    0.022 utils.py:76(execute)
        1    0.000    0.000    0.061    0.061 base.py:59(__setitem__)
        1    0.000    0.000    0.061    0.061 base.py:195(_get_session)
        1    0.000    0.000    0.061    0.061 db.py:31(load)
        1    0.000    0.000    0.059    0.059 query.py:366(get)
 1081/866    0.000    0.000    0.054    0.000 {built-in method builtins.len}
        3    0.000    0.000    0.054    0.018 query.py:231(__len__)


Out[3]: <pstats.Stats at 0x10ebda710>
(完)

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注