У нас есть сервер среднего размера с 48 ГБ оперативной памяти, и мы пытаемся импортировать список из примерно 100 000 подписчиков электронной почты, которые согласны с этим, в новую систему управления списками, написанную на Perl. Насколько я понимаю, Perl не накладывает ограничений на память, как PHP, и тем не менее мы постоянно получаем внутренние ошибки сервера при попытке выполнить импорт. Изучая журналы ошибок, мы видим, что скрипту не хватает памяти. Поскольку Perl не имеет настройки для ограничения использования памяти (насколько я могу судить), почему мы получаем эти ошибки? Я сомневаюсь, что такой небольшой импорт потребляет 48 ГБ оперативной памяти.
Мы взломали и разделили список на части по 10 000, но хотели бы выяснить основную причину для будущих исправлений. Это машина CentOS с Litespeed в качестве веб-сервера.
Трудно отлаживать, не видя кода, но вы можете читать файл в памяти вместо того, чтобы обрабатывать его построчно, используя foreach $line (<FILE>)
. Кроме того, если вы добавите это к переменной или массиву, это то же самое. Выполните всю обработку вместо foreach
. Даже в этом случае 100 тыс. Писем не должны использовать 48 ГБ.
Здесь могут применяться многие факторы (параметры памяти ядра, selinux, проверки работоспособности CGI веб-сервером), но ulimit, вероятно, является наиболее вероятной причиной; начать с /etc/limits.conf
. Тем не менее, запуск сценария пакетного импорта в качестве CGI, вероятно, не ваш лучший выбор - даже если он не исчерпывает память, большинство веб-серверов не пользуются долгоживущими сценариями CGI, и вы все равно можете завершить работу. Такой сценарий лучше всего запускается из командной строки, в идеале с контрольными точками или, по крайней мере, с журналами, чтобы вы могли видеть, как далеко вы продвинулись через импорт в случае, если сценарий умирает до завершения.