2

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

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

4

3 回答 3

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'
于 2009-11-09T16:15:03.180 回答
1

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

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

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

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

于 2009-11-09T19:23:18.353 回答
1

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

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

也就是说,如果您要对paster serve自己进行概要分析,请忽略该--reload参数。使用中间件分析单个请求应该可以正常工作。

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

于 2009-11-10T18:35:08.403 回答