Ошибка ввода-вывода с 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 секунд, регистрирует, что он занимал много времени, затем регистрирует трассировку стека сценария, чтобы вы могли видеть, что он делал, что занимало так много времени.

В вашем случае трассировка стека (чтобы определить, что делает скрипт) не работает. Если у вас заканчиваются процессы, это потому что:

  1. После того, как php-fpm остановит процесс, чтобы отследить его, процесс не сможет возобновиться из-за ошибки при его трассировке
  2. Процесс возобновляется, но продолжает работать вечно.

Моим первым предположением было бы отключить request_slowlog_timeout. Так как это не работает правильно, это может принести больше вреда, чем пользы. Если это не решает проблему нехватки процессов, установите php.ini max_execution_time что-то, что убьет сценарий наверняка.

Более правильное объяснение неудачному ptrace(PEEKDATA) выглядит так:

... рабочий может уйти, когда мастер определяет медленное выполнение. При остановке для отслеживания он, возможно, завершил это выполнение и на любой стадии обслуживает другой запрос, поэтому трассировщик получает шанс на неудачу или, что еще хуже, выбрасывает стек несущественного выполнения.

из FPM Slowlog отстой, который объясняет весь беспорядок гораздо более подробно.

Другие вопросы по тегам