Я занят переносом клиентского приложения, написанного на PHP / MySQL, из Hetzner в AWS. Все отлично работает, но несколько скриптов. Эти сценарии плохо написаны и проходят через миллионы записей, создавая сотни локальных переменных при каждом запуске цикла, записывая каждую строку в файл Excel, открывая другой файл, записывая обновление статуса и закрывая файл при каждом запуске цикла , Сценарий порождается как независимый процесс с использованием shell_exec
из основного веб-приложения.
Когда я впервые протестировал скрипт на EC2, он довольно быстро зависал, как php memory_limit
параметр был установлен в 128M
на моем экземпляре EC2. Ошибка была похожа на приведенную ниже:
Fatal error: Allowed memory size of X bytes exhausted (tried to allocate Y bytes)
Я увеличил memory_limit
от 128M
в 256M
затем 512M
затем 1024M
, 4096M
и в конечном итоге установить -1
чтобы увидеть, в чем проблема.
Установка его в -1
Сначала казалось, что он работает, но затем заморозил весь экземпляр (t2.micro). Затем я понял, что из-за недостатка пространства подкачки пределы системной памяти достигаются, поэтому для целей тестирования я добавил пространство подкачки: 4GB
и установить memory_limit
в -1
, Это сработало, как и ожидалось, и скрипт никогда не падал, но по мере его запуска он становился все медленнее Например, он записал первые 10% записей в файл Excel намного быстрее, чем 10% после 50%. Все это время я наблюдал, как увеличивается объем используемой памяти до 6 ГБ.
Ниже приведены скриншоты из htop
во время работы скрипта:
Я использую по умолчанию php.ini
что идет установка php кроме memory_limit
который установлен в -1.
Тем не менее, когда я запускаю это очень тот же сценарий на другом сервере (в данном случае это общий хостинг Hetzner), сервер каким-то образом ограничивает использование памяти и сценарий работает нормально 128M
из memory_limit
установка. Хотя это не совсем верно (что подтверждается htop
на сервере), похоже, что он не падает на сервере с гораздо меньшим объемом памяти / места подкачки, чем на моем экземпляре EC2.
Ниже приведены скриншоты из htop
работает на Хецнера:
Третий снимок экрана был сделан ближе к концу сценария — и, как вы можете видеть, память мало изменилась между началом и концом. Вот php.ini
Настройки с сервера:
display_errors=1
memory_limit=128M
max_execution_time=90
max_input_vars=3500
upload_max_filesize=64M
post_max_size=64M
allow_url_fopen=0
База данных и кодовая база являются точными копиями в обоих случаях. Результирующий размер файла Excel составляет около 225 МБ в обоих случаях.
Итак, есть идеи, что может быть причиной такого поведения и как мне исправить его на моем экземпляре EC2?
Спасибо за помощь!
Задача ещё не решена.
Других решений пока нет …