【问题标题】:Profiling a Perl CGI script that times-out分析超时的 Perl CGI 脚本
【发布时间】:2013-12-23 07:54:24
【问题描述】:

我有一个 Perl CGI 应用程序有时会超时,导致它被 Apache 杀死,并且504 Gateway Time-out 错误被发送到浏览器。我正在尝试使用 NYTProf 分析此应用程序,但是我无法读取配置文件数据:

 $ nytprofhtml -f www/cgi-local/nytprof.out
Reading www/cgi-local/nytprof.out
Profile data incomplete, inflate error -5 ((null)) at end of input file, perhaps the process didn't exit cleanly or the file has been truncated  (refer to TROUBLESHOOTING in the documentation)

我正在使用sigexit=1NYTProf 选项。这是重现问题的最小 CGI 脚本:

#!/usr/bin/perl -d:NYTProf

sleep 1 while 1;

【问题讨论】:

    标签: perl cgi http-status-code-504 devel-nytprof


    【解决方案1】:

    设置 sigexit=1 告诉 NYTProf 捕捉以下信号:

    INT HUP PIPE BUS SEGV
    

    但是,当您的 CGI 脚本超时时,Apache 会发送 SIGTERM。你需要抓住SIGTERM

    sigexit=term
    

    要在默认信号之外捕获SIGTERM,请使用:

    sigexit=int,hup,pipe,bus,segv,term
    

    【讨论】:

    • 请更新答案,告诉我如何设置这些sigexit=int,hup,pipe,bus,segv,term 以及在哪里?例如:export NYTPROF=sigexit=1:file=nytprof.out 然后运行脚本。
    【解决方案2】:

    CGI.pm 有一个debug mode,您可以使用它从命令行运行您的程序,并将您的 CGI 参数作为键/值对传递。

    它还有另一个功能,您可以使用save your params to a file,然后稍后再读回该文件。

    我所做的是添加代码以将参数保存到文件中,并通过浏览器运行我的程序。这也有助于我确保浏览器发送正确的数据。

    然后我更改代码以从文件中读取参数,并根据需要经常运行它,直到我调试完所有其他内容。

    一旦您在命令行中让程序运行到您满意的程度,您就可以通过 nytprof 运行它来找出一直占用的时间。

    【讨论】:

      猜你喜欢
      • 2012-03-10
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      • 2015-05-27
      • 2012-10-15
      • 2012-10-03
      • 1970-01-01
      相关资源
      最近更新 更多