我一直在探索如何编译Perl程序,以提高复杂Perl CGI程序的初始启动时间。@Rurban's detailed overview对我很有帮助。使用perlcc -o launcher launcher.fpl编译我的主进程脚本可以获得更快的启动时间。最终的过程至少快20% --不是压倒性的,但仍然有意义。
为什么我试图编译为反对简单地进一步优化?我花了几个月的时间使用Devel::NYTProf来捕获效率低下的代码,所以我相信我已经攻击了大多数低挂优化结果。代码是快速的,一旦加载并通过mod_fcgi FastCGI运行,因此它将保持持久加载。但是,如果它发生崩溃,或者FastCGI需要生成一个新进程(要么是因为上一个进程已经达到了其最大请求级别,要么是有足够的需求需要另一个工作人员),那么缓慢的加载时间就会让它变得丑陋。新进程上的第一个请求可能需要1-1.5秒,而随后的请求则在200 at以下。
问题是:很多程序都是以Perl模块的形式出现的,核心“加载器”根据其所做的工作动态加载这些模块。例如,为我的网站首页加载的模块是最慢的模块之一。因此,合理地说,一些最重要的优化将来自于编译这些模块。但是,使用perlcc -B Front.pm -o Front.pmc和perl -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)如果我没有完全走在错误的道路上,那么如果编译的话,有没有办法调试我的模块段错误?
发布于 2021-07-10 22:25:25
如果
发生崩溃,或者FastCGI需要生成一个新的进程,那么缓慢的加载时间就会让它变得丑陋。
这不是真的;它应该只是一个叉,它是瞬间的。(即使确实需要时间,也是在请求之间,而不是在客户等待的时候。)这里没有需要解决的问题。
如果你没有分叉,这就是你应该集中精力的地方。通过分叉,您可以预加载脚本使用的模块。CGI的净效果不仅是避免加载perl所需的时间,也是执行模块所需的时间。
https://stackoverflow.com/questions/68331091
复制相似问题