Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Директива worker_processes со значением auto, лимиты на CPU в контейнере и Cgroups #105

Open
karabanov opened this issue Nov 1, 2024 · 2 comments
Labels
enhancement New feature or request

Comments

@karabanov
Copy link

karabanov commented Nov 1, 2024

Здравствуйте.

Если в конфиге указать worker_processes auto; и запустить Angie в контейнере с выставленным лимитом на CPU, то этот лимит будет проигнорирован и запустится столько воркеров, сколько есть CPU в системе.

# Пример
~$ docker run -it --cpus=1 docker.angie.software/angie

... skipped ...

2024/11/01 16:47:03 [notice] 1#1: start worker processes
2024/11/01 16:47:03 [notice] 1#1: start worker process 20
2024/11/01 16:47:03 [notice] 1#1: start worker process 21
2024/11/01 16:47:03 [notice] 1#1: start worker process 22
2024/11/01 16:47:03 [notice] 1#1: start worker process 23

# Ожидалось, что запуститься один воркер, а запустилось четыре

В образе с Nginx существуют entrypoint скрипты которые, среди прочего, позволяют вычитать лимиты из Cgroups, внести изменения в конфиг перед запуском и соблюсти лимит:

# Посмотреть на скрипт можно так
~$ docker run -it nginx cat /docker-entrypoint.d/30-tune-worker-processes.sh

Если скопировать эти скрипты из образа c Nginx, подправить их под реалии Angie, подкинуть их в образ с Angie, то получиться выполнить этот же трюк и соблюсти лимит:

# Пример
# FYI чтобы скрипт запустился должна быть указана специальная переменная окружения
# ANGIE_ENTRYPOINT_WORKER_PROCESSES_AUTOTUNE с любым значением

~$ docker run -it -e ANGIE_ENTRYPOINT_WORKER_PROCESSES_AUTOTUNE=true --cpus=1 angie

... skipped ...

2024/11/01 16:56:54 [notice] 1#1: start worker processes
2024/11/01 16:56:54 [notice] 1#1: start worker process 72


# Ожидалось, что запуститься один воркер и запустился один воркер

Да, это рабочий костыль но у него есть существенное ограничение - если в контейнере будет файловая система доступная только для чтения этот трюк провернуть не получится. В общем это всё выглядит противоестественно...

Будет очень хорошо если Angie в момент запуска сначала проверит Cgroups на предмет лимита на CPU и если он есть, то запустит столько воркеров, сколько указано в лимите, а если нет, то запустит столько воркеров, сколько есть CPU в системе.

@lonerr
Copy link

lonerr commented Nov 2, 2024

Добрый день.
Да, было бы хорошо проверять количество доступных ядер в рамках самой программы, но, если фича не будет взята в разработку, то аналогичный костыль для докера мы сможем сделать в рамках вот этого запроса: #101

@lonerr
Copy link

lonerr commented Nov 15, 2024

@karabanov , приветствую.
В рамках #101 предложили решение, заодно снабдив его определением cpu constraint контейнера.
Будем рады услышать ваши соображения.

@lonerr lonerr added the enhancement New feature or request label Nov 19, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants