我们有一个48GB内存的中型服务器,并试图将大约100,000个selectjoin电子邮件订阅者列表导入到一个用Perl编写的新列表pipe理系统中。 从我的理解来看,Perl并没有像PHP这样强加的内存限制,但是当我们尝试导入的时候,我们却不断收到内部的服务器错误。 在调查错误日志时,我们看到脚本内存不足。 由于perl没有设置限制内存使用(据我所知)为什么我们得到这些错误? 我怀疑像这样的小import是消耗48GB的内存。
我们已经妥协并将这个清单分成了10,000个大块,但是想找出未来修复的根本原因。 这是一台Litespeed作为networking服务器的CentOS机器。
没有看到代码就很难debugging,但是你可能正在将文件读到内存中,而不是使用foreach $line (<FILE>)处理它。 另外,如果你把这个添加到一个variables或数组中,它是一样的。 做所有的处理,而不是foreach 。 即使如此,10万封电子邮件也不应该使用48Gb。
在这里可以使用许多因素(内核内存参数,selinux,由web服务器进行的CGI完整性检查),但ulimit可能是最可能的罪魁祸首; 从/etc/limits.conf开始。 也就是说,将批量导入脚本作为CGI运行可能不是您的最佳select – 即使内存不足,大多数Web服务器也不会享受长寿命的CGI脚本,您可能最终终止。 这种脚本将从命令行运行得最好,理想情况下使用检查点或至less是日志,这样在脚本完成之前死亡的情况下,您可以看到通过导入完成了多less操作。