Pav*_*vel 1 linux apache perl mod-perl virtualhost
我不能让我的Perl脚本在服务器上运行稳定.这是问题所在.
当脚本每秒访问超过5次时,服务器会冻结.一段时间后,服务器永远挂起.SSH没有响应,我必须重新启动服务器.
我正在使用Apache mod_perl.
该脚本托管在Ubuntu下的Virtual Dedicated Server上.我是通过SSH操作的.这些是服务器参数CPU:400 MHz RAM:256 MB
脚本的最大执行时间是200毫秒.
我用"顶部"实用程序监视了服务器负载.它不会显示任何问题,这是每秒加载5个脚本时的CPU统计信息:
Cpu(s): 12.1%us, 0.6%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 87.2%st
我有什么选择让脚本无问题地工作?
这是ps aux | fgrep perl加载时的结果:
ps aux | fgrep perl www-data 2925 0.3 6.5 45520 17064 ? R 17:00 0:01 /var/www/perl/loa -k start www-data 2926 0.2 6.5 45520 17068 ? R 17:00 0:01 /var/www/perl/loa -k start www-data 2927 0.4 6.5 45676 17060 ? R 17:00 0:01 /var/www/perl/loa -k start www-data 2928 0.3 6.5 45676 17060 ? R 17:00 0:01 /var/www/perl/loa -k start www-data 2929 0.2 6.5 45676 17060 ? R 17:00 0:01 /var/www/perl/loa -k start www-data 2931 0.4 6.5 45740 17076 ? R 17:00 0:01 /var/www/perl/loa -k start root 2968 0.0 0.2 3196 656 pts/0 R+ 17:06 0:00 fgrep perl
UPDATE
我找到了瓶颈.我一直在代码周围多次使用DateTime模块.以下DateTime模块方法似乎非常慢.
我打算用快速模拟代替它们.
另一个问题.mod_perl实例需要大量内存.我不明白为什么.我试图运行一个不导入任何模块的简单perl脚本.我在apache重启后运行它.该脚本需要37M的内存.为什么会这样?你知道如何强制mod_perl不使用额外的内存吗?
没有mod_perl支持的常规perl脚本需要3-5M的内存.
伙计们,谢谢你们的帮助,我没想到会有如此精彩的回应!
更新2
我发现了另外一个事实.我创建了一个简单的perl脚本,等待5秒钟.
#!/usr/bin/perl
use CGI;
my $query= new CGI;
my $content = "5 second delay...\n";
$query->header(
'-Content-type' => "text/plain",
'-Content-Length' => length($content)
);
print $content;
sleep(5);
Run Code Online (Sandbox Code Playgroud)
然后我同时产生了许多这些脚本.顶级实用程序中的隐藏时间(st)从0%上升到80%并保持高位,直到脚本完成.
这个负载来自哪里?
另外,正如我已经提到的,每个perl实例需要36M的内存.
您的数字top似乎表明VM外部的其他进程限制了您的CPU,请注意最后一个数字,87.2%st,这表示您的虚拟机管理程序为VM外部的任务分配了大约87%的CPU时间,即使您的VM有自己喜欢的东西.这是否与您的问题有关很难说.
除了通过展开建议升级服务器之外,使用zoul建议的持久进程环境,您的进程可能根本不受CPU限制,而是IO绑定,例如网络或磁盘访问,或者内存限制.如果没有更多关于脚本在调用时实际执行的操作的细节,很难说.
编辑:您的更新问题与您的内存使用情况信息是显而易见的,因为您的每个进程都需要45M的内存,并且共享17M.只运行5或6个进程,就超出了可用的RAM量.这是一个很好的内存供香草Perl脚本使用,它用它做什么?