Skip to content

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

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?

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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