【发布时间】:2013-06-18 20:33:12
【问题描述】:
我写了一个烧瓶应用程序。当我将它部署在远程服务器中时,我发现它非常慢。 所以,我用它做了一些分析实践。 请看下面的图片:
我用来分析的代码是:
#coding: utf-8
from werkzeug.contrib.profiler import ProfilerMiddleware
from app import app
app.config['PROFILE'] = True
app.wsgi_app = ProfilerMiddleware(app.wsgi_app, restrictions = [30])
app.run(debug = True)
图片1
在远程服务器中进行分析。
也许瓶颈是_socket.getaddrinfo
图2
在本地机器中进行分析。 没有发现瓶颈。
图3
有时,即使在远程服务器中,也没有发现瓶颈。未找到 _socket.getaddrinfo。诡异的!
我也在远程服务器 python shell 中使用cProfile 进行了分析。
看看这个:
In [10]: cProfile.run("socket.getaddrinfo('easylib.gdufslib.org', 80, 0, 0, socket.SOL_TCP)")
3 function calls in 8.014 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 8.014 8.014 :1()
1 8.014 8.014 8.014 8.014 {_socket.getaddrinfo}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
In [11]: cProfile.run("socket.getaddrinfo('easylib.gdufslib.org', 80, 0, 0, socket.SOL_TCP)")
3 function calls in 8.009 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 8.009 8.009 :1()
1 8.009 8.009 8.009 8.009 {_socket.getaddrinfo}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
也许有一个事实是,做一些dns resolve 的工作需要很长时间,而我自己无法改变这一点。
谁能告诉我:为什么_socket.getaddrinfo 被调用,为什么有时不被调用?
如何防止_socket.getaddrinfo 被调用?因为它减慢了我的网站速度,这让我很伤心。
【问题讨论】:
-
Werkzeug 似乎不会调用
getaddrinfo,除非你有一个非常旧的版本。也许它是您正在使用的扩展之一。我的建议是在 pdb 下运行应用程序,并在此函数上设置断点。当断点命中时,您可以获得堆栈跟踪以确定谁在进行调用。 -
你是如何在远程服务器上运行你的 webapp 的? gunicorn + nginx、cgi、...?
-
@MarkusUnterwaditzer Gunicorn + Nginx
标签: networking dns flask cprofile