Perl 脚本和内存不足错误

Perl 脚本和内存不足错误

我们有一台配备 48GB RAM 的中型服务器,并尝试将大约 100,000 个选择加入的电子邮件订阅者列表导入到用 Perl 编写的新列表管理系统中。据我所知,Perl 没有像 PHP 那样强加内存限制,但我们在尝试导入时不断收到内部服务器错误。调查错误日志时,我们发现脚本内存不足。由于 perl 没有限制内存使用的设置(据我所知),为什么我们会收到这些错误?我怀疑像这样的小导入会消耗 48GB 的​​ RAM。

我们已经破解并将列表分成 10,000 个块,但希望找出根本原因以便将来修复。这是一台 CentOS 机器,以 Litespeed 作为 Web 服务器。

答案1

如果不看代码就很难调试,但您可能正在将文件读入内存,而不是使用逐行处理foreach $line (<FILE>)。此外,如果您将其添加到变量或数组,情况也一样。进行所有处理而不是foreach。即便如此,100k 封电子邮件也不应该使用 48Gb。

答案2

这里可能有许多因素(内核内存参数、selinux、Web 服务器的 CGI 健全性检查),但 ulimit 可能是最有可能的罪魁祸首;首先/etc/limits.conf。也就是说,将批量导入脚本作为 CGI 运行可能不是您的最佳选择 - 即使它不会耗尽内存,大多数 Web 服务器也不喜欢长期存在的 CGI 脚本,并且您最终可能会被终止。这种脚本最好从命令行运行,最好使用检查点或至少日志,这样您就可以看到在脚本在完成之前终止的情况下您已经完成了多远的导入。

相关内容