Python 分析和查找flask应用程序的瓶颈--当前响应时间为30秒

Python 分析和查找flask应用程序的瓶颈--当前响应时间为30秒,python,flask,profiling,mongoengine,Python,Flask,Profiling,Mongoengine,在过去的一个月里,我的Flask应用程序突然变得非常缓慢,我不知道是什么变化将响应时间从1秒提高到了30s 我一直在MongoEngine中使用Flask,Redis也用于缓存。MongoDB与Flask应用程序放在同一台服务器上 我试着分析烧瓶,下面是报告: 127.0.0.1 - - [17/Feb/2014 19:51:47] "GET / HTTP/1.0" 200 - -----------------------------------------------------------

在过去的一个月里,我的Flask应用程序突然变得非常缓慢,我不知道是什么变化将响应时间从1秒提高到了30s

我一直在MongoEngine中使用Flask,Redis也用于缓存。MongoDB与Flask应用程序放在同一台服务器上

我试着分析烧瓶,下面是报告:

127.0.0.1 - - [17/Feb/2014 19:51:47] "GET / HTTP/1.0" 200 -
--------------------------------------------------------------------------------
PATH: '/items'
         637497 function calls (618866 primitive calls) in 30.961 seconds

   Ordered by: internal time, call count
   List reduced from 702 to 30 due to restriction <30>

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
      153   30.127    0.197   30.127    0.197 {method 'recv' of '_socket.socket' objects}
   319965    0.150    0.000    0.150    0.000 {isinstance}
 1322/740    0.079    0.000    0.178    0.000 /home/deploy/shopping/env/lib/python2.7/site-packages/mongoengine/dereference.py:147(_attach_objects)
       77    0.079    0.001    0.079    0.001 {method 'sendall' of '_socket.socket' objects}
 1322/740    0.077    0.000    0.159    0.000 /home/deploy/shopping/env/lib/python2.7/site-packages/mongoengine/dereference.py:68(_find_references)
    54670    0.046    0.000    0.046    0.000 {hasattr}
   774/80    0.032    0.000    0.207    0.003 /home/deploy/shopping/env/lib/python2.7/site-packages/mongoengine/base/document.py:539(_from_son)
      774    0.031    0.000    0.119    0.000 /home/deploy/shopping/env/lib/python2.7/site-packages/mongoengine/base/document.py:35(__init__)
12932/12792    0.028    0.000    0.057    0.000 /home/deploy/shopping/env/lib/python2.7/site-packages/mongoengine/base/document.py:113(__setattr__)
    15557    0.016    0.000    0.020    0.000 /home/deploy/shopping/env/lib/python2.7/site-packages/mongoengine/common.py:4(_import_class)
    46648    0.016    0.000    0.016    0.000 {method 'get' of 'dict' objects}
     8228    0.015    0.000    0.029    0.000 /home/deploy/shopping/env/lib/python2.7/site-packages/mongoengine/base/fields.py:94(__set__)
 1532/287    0.012    0.000    0.161    0.001 /home/deploy/shopping/env/lib/python2.7/site-packages/mongoengine/base/fields.py:233(to_python)
    11901    0.012    0.000    0.061    0.000 {setattr}
     8960    0.010    0.000    0.010    0.000 /home/deploy/shopping/env/lib/python2.7/site-packages/mongoengine/base/document.py:547(<genexpr>)
15629/5700    0.010    0.000    0.022    0.000 /usr/lib/python2.7/json/encoder.py:335(_iterencode_dict)
3328/3207    0.009    0.000    0.019    0.000 /usr/lib/python2.7/copy.py:145(deepcopy)
   685/61    0.008    0.000    0.032    0.001 /home/deploy/shopping/env/local/lib/python2.7/site-packages/pymongo/cursor.py:843(__deepcopy)
     3660    0.008    0.000    0.024    0.000 /usr/lib/python2.7/copy.py:66(copy)
10295/5668    0.008    0.000    0.019    0.000 /usr/lib/python2.7/json/encoder.py:282(_iterencode_list)
      424    0.007    0.000    0.361    0.001 /home/deploy/shopping/env/lib/python2.7/site-packages/mongoengine/base/fields.py:189(__get__)
      740    0.007    0.000    0.348    0.000 /home/deploy/shopping/env/lib/python2.7/site-packages/mongoengine/dereference.py:12(__call__)
      660    0.006    0.000    0.008    0.000 /home/deploy/shopping/env/lib/python2.7/site-packages/mongoengine/base/datastructures.py:15(__init__)
       72    0.005    0.000    0.007    0.000 {bson._cbson.decode_all}
      183    0.005    0.000    0.034    0.000 /home/deploy/shopping/env/lib/python2.7/site-packages/mongoengine/queryset/base.py:533(clone_into)
      241    0.005    0.000    0.023    0.000 /home/deploy/shopping/env/lib/python2.7/site-packages/mongoengine/queryset/transform.py:31(query)
      694    0.005    0.000    0.114    0.000 /home/deploy/shopping/env/lib/python2.7/site-packages/mongoengine/document.py:64(__init__)
      900    0.004    0.000    0.004    0.000 {sorted}
5388/5387    0.004    0.000    0.007    0.000 {getattr}
     5940    0.004    0.000    0.004    0.000 /home/deploy/shopping/env/lib/python2.7/site-packages/mongoengine/fields.py:241(to_python)
127.0.0.1---[17/Feb/2014 19:51:47]“GET/HTTP/1.0”200-
--------------------------------------------------------------------------------
路径:'/items'
在30.961秒内完成637497次函数调用(618866次基本调用)
排序人:内部时间、呼叫计数
由于限制,名单从702人减少到30人
ncalls tottime percall cumtime percall文件名:lineno(函数)
153 30.127 0.197 30.127 0.197{_socket.socket'objects}的方法'recv'
319965 0.150 0.000 0.150 0.000{isinstance}
1322/7400.079 0.000 0.178 0.000/home/deploy/shopping/env/lib/python2.7/site packages/mongoengine/dereference.py:147(_attach_objects)
77 0.079 0.001 0.079 0.001{_socket.socket'objects}的方法'sendall'
1322/7400.077 0.000 0.159 0.000/home/deploy/shopping/env/lib/python2.7/site packages/mongoengine/dereference.py:68(查找参考)
54670.046 0.000 0.046 0.000{hasattr}
774/80 0.032 0.000 0.207 0.003/home/deploy/shopping/env/lib/python2.7/site packages/mongoengine/base/document.py:539(_from_son)
774 0.031 0.000 0.119 0.000/home/deploy/shopping/env/lib/python2.7/site packages/mongoengine/base/document.py:35
12932/12792 0.028 0.000 0.057 0.000/home/deploy/shopping/env/lib/python2.7/site packages/mongoengine/base/document.py:113
15557 0.016 0.000 0.020 0.000/home/deploy/shopping/env/lib/python2.7/site packages/mongoengine/common.py:4(导入类)
46648 0.016 0.000 0.016 0.000{“dict”对象的“get”方法}
8228 0.015 0.000 0.029 0.000/home/deploy/shopping/env/lib/python2.7/site packages/mongoengine/base/fields.py:94
1532/287 0.012 0.000 0.161 0.001/home/deploy/shopping/env/lib/python2.7/site packages/mongoengine/base/fields.py:233(to_python)
11901 0.012 0.000 0.061 0.000{setattr}
8960 0.010 0.000 0.010 0.000/home/deploy/shopping/env/lib/python2.7/site packages/mongoengine/base/document.py:547()
15629/5700.010 0.000 0.022 0.000/usr/lib/python2.7/json/encoder.py:335(_iterencode_dict)
3328/3207 0.009 0.000 0.019 0.000/usr/lib/python2.7/copy.py:145(deepcopy)
685/61 0.008 0.000 0.032 0.001/home/deploy/shopping/env/local/lib/python2.7/site packages/pymongo/cursor.py:843
3660 0.008 0.000 0.024 0.000/usr/lib/python2.7/copy.py:66(副本)
10295/5668 0.008 0.000 0.019 0.000/usr/lib/python2.7/json/encoder.py:282(_iterencode_list)
424 0.007 0.000 0.361 0.001/home/deploy/shopping/env/lib/python2.7/site packages/mongoengine/base/fields.py:189(获取)
740 0.007 0.000 0.348 0.000/home/deploy/shopping/env/lib/python2.7/site packages/mongoengine/dereference.py:12(调用)
660 0.006 0.000 0.008 0.000/home/deploy/shopping/env/lib/python2.7/site packages/mongoengine/base/datastructures.py:15
72 0.005 0.000 0.007 0.000{bson.\U cbson.解码\U all}
183 0.005 0.000 0.034 0.000/home/deploy/shopping/env/lib/python2.7/site packages/mongoengine/queryset/base.py:533(克隆到)
241 0.005 0.000 0.023 0.000/home/deploy/shopping/env/lib/python2.7/site packages/mongoengine/queryset/transform.py:31(查询)
694 0.005 0.000 0.114 0.000/home/deploy/shopping/env/lib/python2.7/site packages/mongoengine/document.py:64
900 0.004 0.000 0.004 0.000{已排序}
5388/5387 0.004 0.000 0.007 0.000{getattr}
5940 0.004 0.000 0.004 0.000/home/deploy/shopping/env/lib/python2.7/site packages/mongoengine/fields.py:241(to_python)
有人能给我指出一个找到瓶颈的方向,或者一个更有用的分析方法吗?


下面是一个使用两个分析工具的教程,这两个工具在类似的情况下对我有所帮助。

您的30秒用于153个调用
sock.recv
,每个调用大约花费0.2秒

您现在需要知道是谁在调用此函数,为此,您需要来自探查器的调用图报告。不幸的是,调用图未包含在Werkzeug profiler中间件的摘要输出中,但是如果使用
profile\u dir
参数,则可以将概要文件数据保存到文件中

一旦有了数据文件,您就可以使用一个简短的Python脚本获得调用图,如下所示:

import pstats
stats = pstats.Stats('tmp/GET.root.000255ms.1392663371.prof')
stats.sort_stats('time', 'calls')
stats.print_stats()
stats.print_callers()
print\u stats()
调用将打印从Werkzeug获得的相同报告。
print\u callers()
调用打印相应的调用图。输出将很长,因此您应该将其重定向到一个文件

如果您不喜欢查看文本报告,那么可以使用从相同数据生成GraphViz图


希望这对您有所帮助。

对于mongodb查询评测。您也可以使用它,它将告诉您有关花费时间的所有信息(29/30=97%概率)。此问题已结束,因此我无法添加新答案,但是任何人在这上面登陆-现在有一个比使用标准line_profiler更好的工具。@roganjosh不幸的是,这个工具似乎不适用于flask restful(flask仅用于API)@roganjosh不幸的是,这个工具似乎不适用于flask restful(flask仅用于API)这个问题是封闭的,所以我不能添加新的答案,但无论如何