【问题标题】:Compiling Perl for Faster FastCGI Operation为更快的 FastCGI 操作编译 Perl
【发布时间】:2021-09-20 15:49:32
【问题描述】:

我一直在探索通过编译 Perl 程序来改善复杂 Perl CGI 程序的初始启动时间。 @Rurban's detailed overview 对我很有帮助。使用perlcc -o launcher launcher.fpl 编译我的主进程脚本会产生更快的启动时间。由此产生的过程至少快 20% - 不是压倒性的,但仍然有意义。

我为什么要尝试编译而不是简单地进一步优化?我已经花了几个月的时间使用Devel::NYTProf 来捕获低效的代码,所以我相信我已经攻击了大部分低挂优化水果。代码很快,一旦加载,它通过mod_fcgiFastCGI 运行,所以它保持持久加载。但是,如果它发生崩溃或者如果 FastCGI 需要生成一个新进程(或者因为前一个进程已达到其最大请求级别,或者有足够的需求需要另一个工作人员),那么缓慢的加载时间就会引起它的丑陋。新进程的第一个请求可能需要 1-1.5 秒,而后续请求的时间不到 200 毫秒。

问题:很多程序都是 Perl 模块的形式,核心“加载器”根据它正在做的事情动态加载。例如,为我的网站首页加载的模块是最慢的模块之一。因此,按理说,一些最重要的优化将来自编译这些模块。然而,同时使用perlcc -B Front.pm -o Front.pmcperl -c Front.pm,当我尝试运行程序时,我得到一个无用的段错误:

[root@server code]# ./launcher.fpl
Segmentation fault (core dumped)

编译过程不提供提示问题的调试消息。 (要清楚:为了简单起见,在本例中,launcher.fpl 编译,只是简单的 Perl。)如果我删除 pmc 文件,以便 launcher.fpl 可以加载一次未编译的模块再次,它加载没有错误。

我也试过了:

perl -MO=Bytecode,-m,-oFront.pmc Front.pm

这似乎工作得稍微好一些,但是当我尝试运行程序时会产生这个错误:

[root@server cgi-bin]# ./launcher.fpl
Number found where operator expected at /home/user/www/cgi-bin/Front.pm line 1, near "multi0.12"
Local: Sat Jul 10 14:58:18 2021: Dying from error.; At file: /home/user/www/cgi-bin/Front.pm; line: 1; id: 
Error: Unrecognized character \x08; marked by <-- HERE after ulti<-- HERE near column 36 at /home/user/www/cgi-bin/Front.pm line 1.
Compilation failed in require at /home/user/www/cgi-bin/Loader.pm line 117.

Loader.pm 第 117 行是需要 Front.pm(c) 模块的地方:

state $moduleFront = require Front;

这导致了两个主要问题:(1)我是否以正确的方式开始以及(2)如果我没有完全走错路,有没有办法调试为什么我的模块会出现段错误编译了吗?

【问题讨论】:

  • 我宁愿修复脚本,这样当另一个脚本启动时它就不会崩溃。
  • @choroba,哦,当另一个脚本启动时它不会崩溃。我的意思是有时,可能会出现问题并且会崩溃。或者,FastCGI 在指定的使用次数后有意地重新启动进程。我只是澄清了这一点。对不起!

标签: perl optimization compilation fastcgi perlcc


【解决方案1】:

如果它发生崩溃或者如果 FastCGI 需要生成一个新进程,那么缓慢的加载时间就会引起它的丑陋。

这不是真的;它应该只是一个分叉,它是瞬时的。 (即使确实需要时间,它也会在请求之间,而不是在客户端等待时。)这里没有要解决的问题。

如果您没有分叉,那么您应该将精力集中在这方面。通过分叉,您可以预加载脚本使用的模块。 CGI 的最终效果不仅是避免了加载 perl 所需的时间,而且还避免了执行模块所需的时间。

【讨论】:

  • 这很好奇——如果我有两个请求同时发送到服务器,一个响应很快,但第二个响应慢得多,就像 FastCGI 从头开始​​启动进程一样。那是不是还有什么不妥呢?我发现 FastCGI 文档非常稀少,我认为我已经确定了这一点,但可能是错误的。我在 Apache 上使用 mod_fcgi...
  • Re "就像 FastCGI 从头开始​​启动进程一样。",FastCGI 不会启动任何东西。这就是 FastCGI 的全部意义所在。 FastCGI 是一种允许现有 进程监听来自套接字的请求的协议。您肯定需要多个侦听器,您可以通过 接受请求(即使用 prefork 服务器模型)分叉来实现。
  • 我应该澄清一下:我的意思是与 Apache 上的 mod_fcgi 一样快。当第一次请求符合条件的脚本时,它会启动侦听器。不过,我似乎无法让它在大门外制作多个,尽管尝试使用不同的配置设置。所以,如果两个请求同时命中,只有一个好处……
  • 我实际上在ServerFault上询问了一段时间关于这个FastCGI问题,但没有得到任何建议:serverfault.com/questions/1060978/…
  • 您是说只有一个进程在运行您的脚本?这是不对的,而且与 Fast CGI 的想法完全矛盾。 "mod_fcgid 是 mod_cgi 或 mod_cgid 的高性能替代方案,它启动足够数量的 CGI 程序实例来处理"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 2022-11-24
相关资源
最近更新 更多