【问题标题】:How do I profile `paster serve`'s startup time?如何配置“paster serve”的启动时间?
【发布时间】:2009-11-09 16:11:39
【问题描述】:

Python 的paster serve app.ini 花费的时间比我准备好接受第一个请求的时间要长。

我知道如何使用中间件分析请求,但是如何分析初始化时间?我希望它不要分叉线程池并在它准备好服务后立即退出,以便它准备好后的时间不会显示在配置文件中。

【问题讨论】:

    标签: python performance profiling paster


    【解决方案1】:

    一般而言,您的方法可能是围绕代码段执行计时块,然后发出日志记录语句。至于初始化后的关闭,我不熟悉您使用的具体内容。

    编辑:我使用这个中间件来帮助我找到性能漏洞。它目前是一个 werkzeug 中间件,您可以根据自己的使用情况对其进行调整。希望对你有帮助

    import re
    re_profile = re.compile(ur'(^|&|\?)prof($|=|&)')
    class ProfilerMiddleware(BaseProcessor):
        def process_runner(self, runner, environ):
            self.profiler = None
            if (environ['REMOTE_ADDR'] in settings_static.internal_ips or settings_static.local_server) and re_profile.match(environ['QUERY_STRING']):
                self.profiler = cProfile.Profile()
                def wrap(*args, **kwargs):
                    return self.profiler.runcall(runner, *args, **kwargs)
                return wrap
    
        def process_response(self, request, response):
            if self.profiler:
                self.profiler.create_stats()
                out = StringIO.StringIO()
                old_stdout, sys.stdout = sys.stdout, out
                #from dozer.profile import buildtree, write_dot_graph
                #write_dot_graph(self.profiler.getstats(), buildtree(self.profiler.getstats()), "/tmp/output.gv")
                self.profiler.print_stats(1)
                sys.stdout = old_stdout
                response.response = [u'<pre>%s</pre>' % to_unicode(out.getvalue())]
                response.content_type = 'text/html'
    

    【讨论】:

    • 我已经在使用分析器运行paster,它告诉我哪些方法花费的时间最多,但输出还不是很有帮助。我猜这是因为它产生了工作进程,而分析器没有以相同的方式分析它们。
    • 我上面发布的代码似乎在类似的分叉环境中运行良好,希望对您有所帮助。
    【解决方案2】:

    即使你会对其进行概要分析 - 我怀疑你会得到很多优化提示。

    我们在 mod_wsgi 设置中使用 Paster,并减少启动时间,以便用户不会受到影响,并确保例如toscawidgets 设置正确,我们这样做:

    app = paste.fixture.TestApp(application)
    # TODO-dir: FIXME, must go away!
    try:
        app.get("/")
    except:
        pass
    

    这里的应用程序当然是初始化/加载的贴图应用程序。

    【讨论】:

      【解决方案3】:

      我在开发过程中几乎总是使用paster serve --reload ...。该命令将自己作为子进程执行(它使用subprocess 模块执行自己的脚本,而不是fork())。

      子进程轮询源代码更改,在检测到更改时退出,并由父进程paster serve --reload 重新启动。

      也就是说,如果您要分析 paster serve 本身,请省略 --reload 参数。使用中间件分析单个请求应该可以正常工作。

      我的特殊问题是pkg_resources 在首次调用时所花费的时间与所有已安装的软件包成正比。我通过在没有不必要的包的情况下重建我的 virtualenv 来解决它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-11
        • 2018-12-10
        • 2018-01-18
        • 2014-06-26
        • 1970-01-01
        • 2018-05-29
        • 2020-03-24
        相关资源
        最近更新 更多