Skip to content

Часть процессов phpDaemon впадает в бесконечный цикл вызовов epoll_wait и увеличивают использование cpu #300

@lightbliss

Description

@lightbliss

Добрый день!
Используем phpDaemon для обработки API-запросов.
Столкнулись с такой проблемой, что несколько (примерно равно количеству ядер на сервере) процессов phpd через некоторое время (если полностью перезапустить мастер-процесс, то через 10 минут) начинают очень активно делать системные вызовы "epoll_wait" такого вида:
[pid 7118] epoll_wait(7, {EPOLLIN, {u32=2, u64=2}}, 32, 766) = 1
[pid 7118] epoll_wait(7, {EPOLLIN, {u32=2, u64=2}}, 32, 766) = 1
[pid 7118] epoll_wait(7, {EPOLLIN, {u32=2, u64=2}}, 32, 766) = 1
[pid 7118] epoll_wait(7, {EPOLLIN, {u32=2, u64=2}}, 32, 764) = 1
[pid 7118] epoll_wait(7, {EPOLLIN, {u32=2, u64=2}}, 32, 764) = 1
[pid 7118] epoll_wait(7, {EPOLLIN, {u32=2, u64=2}}, 32, 764) = 1
[pid 7118] epoll_wait(7, {EPOLLIN, {u32=2, u64=2}}, 32, 764) = 1
[pid 7118] epoll_wait(7, {EPOLLIN, {u32=2, u64=2}}, 32, 763) = 1
[pid 7118] epoll_wait(7, {EPOLLIN, {u32=2, u64=2}}, 32, 763) = 1
[pid 7118] epoll_wait(7, {EPOLLIN, {u32=2, u64=2}}, 32, 763) = 1
[pid 7118] epoll_wait(7, {EPOLLIN, {u32=2, u64=2}}, 32, 763) = 1
[pid 7118] epoll_wait(7, {EPOLLIN, {u32=2, u64=2}}, 32, 763) = 1
[pid 7118] epoll_wait(7, {EPOLLIN, {u32=2, u64=2}}, 32, 762) = 1
[pid 7118] epoll_wait(7, {EPOLLIN, {u32=2, u64=2}}, 32, 762) = 1

Стрейс статистика по процессу показывает такое:
% time | seconds | usecs/call | calls | errors | syscall
98.98 | 0.661405 | 5 | 121343 | | epoll_wait

lsof процесса выглядит так:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
...
php 7118 root 2u a_inode 0,10 0 6487 [eventfd]
php 7118 root 3r CHR 1,9 0t0 1033 /dev/urandom
php 7118 root 4u a_inode 0,10 0 6487 [eventfd]
php 7118 root 5u a_inode 0,10 0 6487 [eventpoll]
php 7118 root 6u a_inode 0,10 0 6487 [eventfd]
php 7118 root 7u a_inode 0,10 0 6487 [eventpoll]
php 7118 root 8w REG 253,0 79811 136834586 /var/log/phpdaemon.log
php 7118 root 9u a_inode 0,10 0 6487 [eventfd]
...

Эти процессы сразу начинают использовать cpu на 100% и cpu на сервере начинает упираться в полку (50% system, 40% nice).
При этом кажется, что процессы просто греют воздух и реальной работы не делают. Когда же приходят настоящие запросы, то они успешно выполняются и 5xx ошибок мы не наблюдаем.

Версия phpDaemon: commit e8d5178
Версия php 7.0.33
Версия php-расширения event 2.4.1
libevent2 headers version => 2.0.21-stable

Конфиг phpDaemon:
min-workers 64;
max-workers 128;
min-spare-workers 32;
max-spare-workers 64;
start-workers 64;
max-idle 120;
max-requests 16384;

phpDaemon запускается через systemd

На виртуалке - 8 ядер, система - CentOS Linux 7.
Также, по наблюдениям, если уменьшить первые 4 опции в конфиге phpDeamon в 2 раза (min-workers, max-workers, min-spare-workers, max-spare-workers), то 100% использования cpu прекращается, но по htop и strace видно, что больные процессы все еще появляются в системе. На более мощном сервере (20 ядер), при таких же настройках phpDaemon, процессы с бесконечным вызовом epoll_wait не появляются.

Можно ли как-то такое поведение с воркерами починить, чтобы не было бесконечных вызовов epoll_wait?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions