我无法让我的 Perl 脚本在服务器上稳定运行。这是问题所在。
当脚本每秒访问超过 5 次时,服务器会冻结。一段时间后,服务器永远挂起。SSH 没有响应,我必须重新启动服务器。
我将 Apache 与mod_perl
.
该脚本托管在 Ubuntu 下的虚拟专用服务器上。我通过 SSH 操作它。这些是服务器参数 CPU:400 MHz RAM:256 MB
脚本的最大执行时间为 200 毫秒。
我使用“top”实用程序监控了服务器负载。它没有显示任何问题,这是每秒加载 5 个脚本期间的 CPU 统计信息:
中央处理器: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辅助| fgrep perl www-数据 2925 0.3 6.5 45520 17064 ? R 17:00 0:01 /var/www/perl/loa -k 开始 www-数据 2926 0.2 6.5 45520 17068 ? R 17:00 0:01 /var/www/perl/loa -k 开始 www-数据 2927 0.4 6.5 45676 17060 ? R 17:00 0:01 /var/www/perl/loa -k 开始 www-数据 2928 0.3 6.5 45676 17060 ? R 17:00 0:01 /var/www/perl/loa -k 开始 www-数据 2929 0.2 6.5 45676 17060 ? R 17:00 0:01 /var/www/perl/loa -k 开始 www-数据 2931 0.4 6.5 45740 17076 ? R 17:00 0:01 /var/www/perl/loa -k 开始 根 2968 0.0 0.2 3196 656 pts/0 R+ 17:06 0:00 fgrep perl
更新
我找到了瓶颈。我在代码中多次使用 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);
然后我同时生成许多这些脚本。顶级实用程序中的隐身时间 (st) 从 0% 上升到 80% 并保持高位,直到脚本完成。
这个负载从何而来?
另外,正如我已经提到的,每个 perl 实例占用 36M 内存。