Проверяя клиентское приложение на стороннем виртуальном сервере, я заметил интересное явление:
Кажется, что отдельные процессы PHP используют более одного ядра. Насколько я знаю, PHP не может этого сделать.
Описание поведения
Вот вывод htop при обработке одного запроса к веб-приложению:
Вывод htop, зеленый — процессор пользователя, красный — системный процессор.
Все четыре ядра на 100%, только один процесс PHP на 396%, процессор и низкое использование памяти.
Я уже исследовал процессор высокой системы, используя strace или pidstat, но не смог найти проблем с IO.
Информация о сервере
Виртуальный сервер представляет собой среду Debain LAMP, использующую Intel VT-X Virtualization и Virtuozzo, обеспечивающую 4 ядра на частоте 560 МГц:
Сервер работает под управлением PHP 5.5.9 в быстром CGI, обслуживаемом Apache 2.4.7 (prefork).
Nginx 1.9.4 служит прокси-сервером, а Plesk 12.5 используется для настройки сервера.
Пример кода PHP (РЕДАКТИРОВАТЬ)
Чтобы исключить код приложения в качестве источника, я подтвердил поведение, используя простой фрагмент кода:
$array = array('z', 'y', 'x', 'h', 'd', 's', 'w', 'q', 'a');
for ($i=0; $i < 9999999; $i++) {
sort($array); // Delaying execution
}
echo 'loop ended';
Два или более процессов PHP (РЕДАКТИРОВАТЬ)
Если два или более запроса обрабатываются одновременно, каждый процесс выполняется на максимально возможном количестве ядер (2 процесса => 2 ядра каждый, 3 процесса => 1,33 ядра каждый).
Вопросы
Да, это называется pthreads. Он предназначен для создания многопоточности в PHP.
Навряд ли. Я думаю, так же, как сказал Уилл, это, вероятно, подпроцесс, запускаемый php.
Это полностью связано с приложением. Но любая многоядерная задача, запущенная php, может так выглядеть. Java-приложение для растеризации набора изображений SVG для примера.
Других решений пока нет …