如何分析 Perl Web 应用程序?

Posted

技术标签:

【中文标题】如何分析 Perl Web 应用程序?【英文标题】:How do I profile a Perl web app? 【发布时间】:2008-09-25 20:59:29 【问题描述】:

我正在开发一个使用 Perl 的网络应用程序,我需要研究加速应用程序的某些部分。

我想我会开始分析我希望调查的部分的特定调用。我对分析 Perl 代码进行了一些搜索,但不幸的是,我发现的大部分内容都表明我应该从命令行使用 -d:DProf myapp 运行我的 perl 代码。这对我来说不太适用,因为我的代码位于 Web 应用程序中。我确实找到了一种让分析与 apache 一起工作的方法,但不幸的是,从分析器返回的“最常用”模块都是 CPAN 模块——Class::xyz 等等等等。没有太大帮助。

除了我将“计时器”代码注入我希望分析的方法以仅针对这些方法之外,还有没有人知道一种好方法?我曾想过编写一个测试脚本并对其进行分析,但由于我正在处理的代码的性质,这需要比我希望做的更多的工作。

【问题讨论】:

【参考方案1】:

你试过Devel::NYTProf(比Devel::DProf好多了),它可以在Apache下工作吗?您使用的是哪个网络服务器?这是一个普通的 CGI 脚本,一个 mod_perl 的东西,还是别的什么?

如果您在做数据库方面的工作,DBI::Profile 可以对您的查询进行基准测试,这是在另一个程序中进行的工作。

然而,真正的诀窍是组织代码,这样您就可以进行全方位的测试和分析,而不必在最后将它们放在一起发现某些东西很慢。这在短期内对灭火没有多大帮助,但从长远来看,它确实可以防止事情变成火灾。还有各种方法可以伪造网络服务器环境等等,但这是一个不同的问题。 :)

【讨论】:

是的,这就是我尝试过的,结果发现的只是所有 cpan 模块。我想真正针对这些特定方法,看看它们自己大部分时间都花在了哪里。 它列出了哪些 CPAN 模块?如果您正在执行大量数据库调用,那么 DBI 和 DBD 模块很可能会出现在您的列表顶部。这不是因为 Perl 做了太多的工作,而是因为您的数据库查询很慢。改为开始分析它们。 如果你不向他们解释如何做到这一点,或者甚至只是如何找出如何做到这一点,我看不出建议他们“组织代码”的意义。 @jwg:我喜欢认为人们知道如何使用 Google 或阅读书籍以了解我在回答问题后添加的额外建议的更多信息。 :) 读哪些书?谷歌什么? '组织代码'?【参考方案2】:

如果您使用的是 CGI.pm,您可以在命令行上将参数传递给您的 perl 脚本,CGI.pm 会将它们解释为就像它们是通过 HTTP 传递的参数一样。因此,如果您正在调试,例如

@987654321@

然后你可以从命令行调用,例如

perl -d:NYTProf documentroot/scripts/example.pl 'action=browse&search=grommet&restrict=blah'

【讨论】:

【参考方案3】:

如果您真的想在内部计时,可以使用带有 :hireswallclock 选项的 Benchmark 核心模块。但实际上,您应该能够从命令行进行分析。您可能必须编写测试脚本来模拟 CGI 请求的某些部分,但 DProf 在寻找性能瓶颈时可能非常有用。

特别是,查找您的代码调用 CPAN 模块代码的位置。您可能会在远远超出必要的循环中执行此操作,因此虽然将时间花在 CPAN 模块中,但重构您的代码可以解决问题。

【讨论】:

【参考方案4】:

我意识到此时它有点晚了,但这就是为什么最好使用CGI::Application 或其他架构的原因之一,在这种架构中,Web 应用程序只是一小段面向 Web 的代码,利用您编写的一堆模块来实现实际功能。使用这样的设计可以非常简单地从命令行单独或集体地分析(或简单地测试)任何模块,而不必担心 Web 方面。

【讨论】:

以上是关于如何分析 Perl Web 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Perl/CGI 中为 Web 应用程序创建持久的 shell 命令会话?

Perl语言概览

一款功能丰富的Perl后门程序分析

分析超时的 Perl CGI 脚本

如何分析 Perl 正则表达式?

Perl高级应用教程