скрипт php cli виснет без сообщений - PullRequest
3 голосов
/ 03 мая 2010

Я написал PHP-скрипт, который работает через SSH и nohup, предназначенный для обработки записей из базы данных и работы с ними (например, обработка некоторых изображений, обновление некоторых строк).

Отлично работает при небольших нагрузках, возможно, до 10 тыс. Записей. У меня есть несколько больших наборов данных, которые обрабатывают около 40 тыс. Записей (я понимаю, что это не так много, но это требует много работы, когда каждая запись требует загрузки и обработки до 50 изображений).

Для обработки больших наборов данных могут потребоваться дни. Иногда я вижу в журналах отладки ошибки памяти, которые достаточно ясны, но иногда сценарий просто «умирает» или зомбирует меня. Мой конец журнала отладки просто останавливается без сообщений об ошибках, конец журнала nohup заканчивается без ошибок, и процесс все еще отображается в списке ps, выглядя так:
26075 pts / 0 S 745: 01 / usr / bin / php ./import.php
но никакой работы не делается.

Кто-нибудь может дать мне несколько идей о том, почему процесс просто завершится? Насколько я могу судить, очевидные вещи (такие как таймаут php-скрипта и проблемы с памятью) не имеют значения.

Спасибо за любые советы

PS-- это размещено на Godaddy VDS (не мой выбор). Я подозреваю, что у godaddy есть какие-то ограничения, которые могут сработать, несмотря на то, какие переопределения я вставил в код (например, set_time_limit (0);).

1 Ответ

2 голосов
/ 03 мая 2010

Очень вероятно убийца OOM . Если вы действительно действительно действительно хотите остаться вне его досягаемости, как root , попросите ваш процесс записать -17 в /proc/self/oom_adj. Осторожно: Ядро обычно знает лучше. Уклонение от убийцы OOM может нанести вред той же СУБД, к которой вы пытаетесь обратиться. Какой это порочный круг:)

Возможно, вы (вместо этого) хотите разбивать запросы на основе того, что вы прочитали из /proc/loadavg и /proc/meminfo. Если вы увеличиваете нагрузку или меняетесь в геометрической прогрессии, вам необходимо отступить, особенно в фоновом режиме:)

Кроме того, монитор IOWAIT во время работы. Это может быть усреднено от /proc/stat по сравнению со временем загрузки системы. Обратите внимание, когда вы начинаете и прогрессируете.

К сожалению, серийный убийца, известный как убийца OOM, не поддерживает количество тела, доступное за пределами анализа сообщений ядра.

Или ваша задача cron продолжает увеличивать количество выделенной кучи на ulimit. В любом случае, перед выполнением какой-либо работы ваша работа должна в случае необходимости отступать или предотвращать ее упадок (как отмечено выше).

Как примечание, вам, вероятно, не следует делать то, что вы делаете на виртуальном хостинге. Если он такой большой, самое время получить VPS (по крайней мере), где у вас есть некоторый контроль над тем, что процесс должен делать и что.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...