在Google的appengine上剖析/优化网站的最佳方法 [英] Best way to profile/optimize a website on google's appengine

查看:103
本文介绍了在Google的appengine上剖析/优化网站的最佳方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正试图优化我的网站,该网站运行在Google的appengine上。这不是一件容易的事,因为我没有使用任何强大的工具。



有没有人为此目的优化Python代码?
您是否找到一个好的python profiler?

解决方案

我找到 Gprof2Dot 非常有用。



Gprof2Dot将cProfile输出变成了一个漂亮的图形,其中最慢的链(?)突出显示,以及关于每个函数的一些信息(函数名称,花费在这个函数上的时间百分比,以及调用的次数)。

示例图(1429x1896px)



我已经在App Engine上做的并不多,但是在分析非webapp脚本时,我倾向于描述运行所有单元测试的脚本,这对于现实世界的情况可能不太准确。

一个(更好的?)方法应该是有一个脚本来做一个假的WSGI请求,然后进行配置。



WSGI是非常简单的协议,它基本上一个带有两个参数的函数,一个带请求信息,另一个带回调函数(用于设置heade rs等等)。也许像下面这样(这是可能工作的伪代码)...

$ p $ class IndexHandler(webapp.RequestHandler):
Your site
def get(self):
self.response.out.write(hi)

if __name__ ==' __main__':
application = webapp.WSGIApplication([
('。*',IndexHandler),
],debug = True)

#开始虚假请求/ profiling bit
urls = [
/,
/ blog / view / hello,
/ admin / post / edit / hello,
/ makeanerror404,
/ makeanerror500
]
$ b $ def defke_wsgi_callback(response,headers):
打印标题到标准输出
print(\\\
.join([%s:%s%(n,v)for n,v in header]))
print(\\\


for request_url in url:
html = application({
'REQUEST_METHOD':'GET',
'PATH_INFO':request_url},
fake_wsgi_callback

print html

实际上,App Engine文档解释了更好的分析您的应用程序的方式: $ b

http://code.google.com/appengine/kb/commontasks.html#profiling


要分析应用程序的性能,首先将应用程序的 main()函数重命名为 real_main()。然后,在您的应用程序中添加一个新的主函数,名为 profile_main(),如下所示:

<$ p $我们已经将上面我们原来的main()重命名为real_main()
import cProfile(){code> def profile_main():
#这是用于分析
# ,pstats
prof = cProfile.Profile()
prof = prof.runctx(real_main(),globals(),locals())
print< pre>
stats = pstats.Stats(prof)
stats.sort_stats(time)#或者累计
stats.print_stats(80)#80 =打印多少
#休息是可选的。
#stats.print_callees()
#stats.print_callers()
print< / pre>

[...]

启用应用程序分析,设置 main = profile_main 。要正常运行应用程序,只需设置 main = real_main



I'm currently trying to optimize my website, which run on the google's appengine. It's not an easy task, because I'm not using any powerful tool.

Does anyone have experience in optimizing python code for this purpose? Have you find a good python profiler?

解决方案

I have found Gprof2Dot extremely useful. The output of the profiling modules I've tried as pretty unintuitive to interpret.

Gprof2Dot turns the cProfile output into a pretty looking graph, with the slowest chain(?) highlighted, and a bit of information on each function (function name, percentage of time spend on this function, and number of calls).

An example graph (1429x1896px)

I've not done much with the App Engine, but when profiling non-webapp scripts, I tend to profile the script that runs all the unittests, which may not be very accurate to real-world situations

One (better?) method would be to have a script that does a fake WSGI request, then profile that.

WSGI is really simple protocol, it's basically a function that takes two arguments, one with request info and the second with a callback function (which is used for setting headers, among other things). Perhaps something like the following (which is possible-working pseudo code)...

class IndexHandler(webapp.RequestHandler):
    """Your site"""
    def get(self):
        self.response.out.write("hi")

if __name__ == '__main__':
    application = webapp.WSGIApplication([
        ('.*', IndexHandler),
    ], debug=True)

    # Start fake-request/profiling bit
    urls = [
        "/",
        "/blog/view/hello",
        "/admin/post/edit/hello",
        "/makeanerror404",
        "/makeanerror500"
    ]

    def fake_wsgi_callback(response, headers):
        """Prints heads to stdout"""
        print("\n".join(["%s: %s" % (n, v) for n, v in headers]))
        print("\n")

    for request_url in urls:
        html = application({
        'REQUEST_METHOD': 'GET',
        'PATH_INFO': request_url},
        fake_wsgi_callback
        )
        print html

Actually, the App Engine documentation explains a better way of profiling your application:

From http://code.google.com/appengine/kb/commontasks.html#profiling:

To profile your application's performance, first rename your application's main() function to real_main(). Then, add a new main function to your application, named profile_main() such as the one below:

def profile_main():
    # This is the main function for profiling 
    # We've renamed our original main() above to real_main()
    import cProfile, pstats
    prof = cProfile.Profile()
    prof = prof.runctx("real_main()", globals(), locals())
    print "<pre>"
    stats = pstats.Stats(prof)
    stats.sort_stats("time")  # Or cumulative
    stats.print_stats(80)  # 80 = how many to print
    # The rest is optional.
    # stats.print_callees()
    # stats.print_callers()
    print "</pre>"

[...]

To enable the profiling with your application, set main = profile_main. To run your application as normal, simply set main = real_main.

这篇关于在Google的appengine上剖析/优化网站的最佳方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆