Назад | Перейти на главную страницу

Невозможно разветвить потомков даже после выхода из предыдущих

У меня есть виртуальная машина CentOS, на которой я запускаю сервер сокетов php, который разветвляется при каждом подключении. Дочерний процесс выполняет свою работу и затем завершается.

Родитель тоже ждет, чтобы пожинать мертвый зомби-процесс (я проверил ps auxf вывод)

pcntl_wait($status, WNOHANG); выполняется после каждой вилки, так что очищается 1 процесс Зомби (если есть)

Однако после долгой работы родитель не может выполнить форк.

Я думаю, это из-за 32768 предел. Количество процессов в ps -auxf выпуск постоянно около 750.

[root@test-machine ~]# cat /proc/self/limits
Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        0                    unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             119925               119925               processes
Max open files            1024                 4096                 files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       119925               119925               signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us


[root@test-machine ~]# cat /proc/sys/kernel/pid_max
32768

ОБНОВИТЬ: Я проверил журналы и увидел, что ошибка говорит PHP Fatal error: Maximum execution time of 30 seconds exceeded in myfile.php

Линия, на которую он указал, - это pcntl_wait($status, WNOHANG);, который предназначен для ожидания завершения дочернего процесса. В WNOHANG flag гарантирует, что он не зависнет, поэтому, если нет выходящего дочернего элемента, он продолжит выполнение.

Хотя "Максимальное время" можно изменить, что-то вызывает pcntl_wait зациклить. Я думаю, что что-то в ОС заставляет это происходить. Это сокет с максимальным количеством подключений (у меня несколько сокетов, только это повлияло)

Я проверил Документация PHP для функции prcntl_wait и нашел это:

параметры

Если в вашей системе доступен wait3 (в основном системы в стиле BSD), вы можете указать необязательный параметр options. Если этот параметр не указан, для системного вызова будет использоваться ожидание. Если wait3 недоступен, указание значения для параметров не будет иметь никакого эффекта. Значение options - это значение нуля или более из следующих двух констант, соединенных вместе ИЛИ:

Возможно, в вашей ОС нет wait3, и это вызывает проблему. Может быть, вы можете изменить функцию на pcntl_waitpid и это решит вашу проблему.