Ошибка ввода-вывода с PHP5-FPM, ptrace(PEEKDATA) не удалось
Я получил много из них:
[NOTICE] child 19214 stopped for tracing
[NOTICE] about to trace 19214
[ERROR] ptrace(PEEKDATA) failed: Input/output error (5)
[NOTICE] finished trace of 19214
[WARNING] [pool www] child 19208, script 'blahblah.php' executing too slow (30.041419 sec), logging
[NOTICE] child 19208 stopped for tracing
[NOTICE] about to trace 19208
[ERROR] ptrace(PEEKDATA) failed: Input/output error (5)
[NOTICE] finished trace of 19208
[WARNING] [pool www] child 19218, script 'blahblah.php' executing too slow (30.035029 sec), logging
И когда php достигает максимального числа детей (по крайней мере, я предполагаю, что это так), он перестает "работать"... теперь я знаю, что могу увеличить max_children (в настоящее время установлено на 9), но есть способ остановить php от "умирания"?
Я использую VPS с 1 ядром и 512 МБ ОЗУ (PHP5-FPM 5.4.4 + APC 3.1.10).
После отключения медленного журнала я теперь получаю:
WARNING: [pool www] child 1684 exited on signal 15 (SIGTERM) after 77.802376 seconds from start
NOTICE: [pool www] child 1694 started
WARNING: [pool www] child 1377, script 'blahblah.php' (request: "GET /blahblah.php") execution timed out (38.291440 sec), terminating
WARNING: [pool www] child 1377 exited on signal 15 (SIGTERM) after 2750.295279 seconds from start
NOTICE: [pool www] child 1696 started
WARNING: [pool www] child 1722, script 'blahblah.php' (request: "POST /blahblah.php") execution timed out (39.653910 sec), terminating
WARNING: [pool www] child 1722 exited on signal 15 (SIGTERM) after 793.953090 seconds from start
Я думаю, что это не нормально, что эти скрипты такие медленные. Вы предлагаете поиграть с max_execution_time?
2 ответа
Похоже, у вас есть request_slowlog_timeout
включен. Обычно этот запрос занимает больше времени, чем N секунд, регистрирует, что он занимал много времени, затем регистрирует трассировку стека сценария, чтобы вы могли видеть, что он делал, что занимало так много времени.
В вашем случае трассировка стека (чтобы определить, что делает скрипт) не работает. Если у вас заканчиваются процессы, это потому что:
- После того, как php-fpm остановит процесс, чтобы отследить его, процесс не сможет возобновиться из-за ошибки при его трассировке
- Процесс возобновляется, но продолжает работать вечно.
Моим первым предположением было бы отключить request_slowlog_timeout. Так как это не работает правильно, это может принести больше вреда, чем пользы. Если это не решает проблему нехватки процессов, установите php.ini max_execution_time
что-то, что убьет сценарий наверняка.
Более правильное объяснение неудачному ptrace(PEEKDATA) выглядит так:
... рабочий может уйти, когда мастер определяет медленное выполнение. При остановке для отслеживания он, возможно, завершил это выполнение и на любой стадии обслуживает другой запрос, поэтому трассировщик получает шанс на неудачу или, что еще хуже, выбрасывает стек несущественного выполнения.
из FPM Slowlog отстой, который объясняет весь беспорядок гораздо более подробно.