Jia*_*aro 14 python django profiling
我有兴趣测试我的django应用程序的性能,获得逐行性能数据的最佳方法是什么?
注意:谷歌搜索返回许多人对django本身进行基准测试.我不是在寻找django的基准测试,我正在尝试测试我正在编写的django应用程序的性能:)
谢谢!
编辑:通过"逐行"我只是意味着计时单个函数,数据库调用等,以找出瓶颈在非常精细的水平上
这有两层.对于我们的测试,我们拥有大部分#1.我们即将开始#2.
Django孤立无援.普通的Django单元测试在这里运行良好.创建一些循环通过一些(少于6个)"典型"用例的测试.得到这个,发布,等等.收集时间数据.这不是真正的Web性能,但它是一个易于使用的测试场景,可用于调优.
你的整个网络堆栈.在这种情况下,您需要一个运行Squid,Apache,Django,MySQL等的常规服务器.您需要第二台计算机作为客户端通过urllib2运行您的网站,做一些(少于6个)"典型"用例.得到这个,发布,等等.收集时间数据.这仍然不是"真正的"网络性能,因为它不是通过互联网,而是在没有真正精心设置的情况下尽可能接近.
请注意,#2(端到端)包括大量的性能缓存.如果您的客户端脚本正在执行类似的工作,缓存将非常有用.如果您的客户端脚本每次都执行独特的操作,则缓存将不太有用.
最难的部分是确定"典型"工作量是什么.这不是功能测试,因此工作负载不必包含所有内容.此外,客户端运行的并发会话越多,它就越慢.当测试客户端是处理过程中最慢的部分时,不要努力优化服务器.
编辑
如果"逐行"意味着"分析",那么,你必须运行一个Python分析器.
https://docs.python.org/library/profile.html
请注意,Django ORM层中有大量缓存.因此,运行视图功能六次以获得一组有意义的测量值是不明智的.您必须运行"典型"操作集,然后在配置文件中找到热点.
通常,您的应用程序很容易优化 - 您不应该做太多.您的视图功能应该简短,无需处理.类似地,您的表单和模型方法功能应该非常短.
获取Django应用程序的逐行性能数据(分析)的一种方法是使用像repoze.profile这样的WSGI中间件组件.
假设您在Apache中使用mod_wsgi,可以将repoze.profile插入到您的应用中,如下所示:
...
application = django.core.handlers.wsgi.WSGIHandler()
...
from repoze.profile.profiler import AccumulatingProfileMiddleware
application = AccumulatingProfileMiddleware(
application,
log_filename='/path/to/logs/profile.log',
discard_first_request=True,
flush_at_shutdown=True,
path='/_profile'
)
Run Code Online (Sandbox Code Playgroud)
现在,您可以将浏览器指向/ _profile以查看您的个人资料数据.当然这不适用于mod_python或内部Django服务器.