为什么我的mod_perl脚本会冻结我的服务器?

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模块方法似乎非常慢.

  • 新()
  • 现在()
  • 组(...)
  • delta_ms(...)

我打算用快速模拟代替它们.

另一个问题.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的内存.

Ada*_*ire 5

您的数字top似乎表明VM外部的其他进程限制了您的CPU,请注意最后一个数字,87.2%st,这表示您的虚拟机管理程序为VM外部的任务分配了大约87%的CPU时间,即使您的VM有自己喜欢的东西.这是否与您的问题有关很难说.

除了通过展开建议升级服务器之外,使用zoul建议的持久进程环境,您的进程可能根本不受CPU限制,而是IO绑定,例如网络或磁盘访问,或者内存限制.如果没有更多关于脚本在调用时实际执行的操作的细节,很难说.

编辑:您的更新问题与您的内存使用情况信息是显而易见的,因为您的每个进程都需要45M的内存,并且共享17M.只运行5或6个进程,就超出了可用的RAM量.这是一个很好的内存供香草Perl脚本使用,它用它做什么?