我写了一个烧瓶应用程序。当我将它部署在远程服务器中时,我发现它非常慢。所以,我用它做了一些分析实践。请看下面的图片:
我用来分析的代码是:
#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
图二
在本地机器中进行分析。没有发现瓶颈。
图三
有时,即使在远程服务器中,也没有发现瓶颈。没有_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
被调用?因为它减慢了我的网站速度,这让我很伤心。