CPU-квота cgroup ограничивает время выполнения, а не обязательно видимое число процессоров. Поэтому os.cpu_count() может видеть 64 CPU, хотя контейнеру разрешено лишь 2 CPU-времени.
Почему стандартная функция Python os.cpu_count() внутри Docker-контейнера, запущенного в Kubernetes-поде с ограничением CPU: 2, часто возвращает общее количество ядер физического сервера, например 64? К каким критическим проблемам с размером пула потоков Gunicorn или Celery это приводит и как это исправить?
CPU-квота cgroup ограничивает время выполнения, а не обязательно видимое число процессоров. Поэтому os.cpu_count() может видеть 64 CPU, хотя контейнеру разрешено лишь 2 CPU-времени.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
CPU-квота cgroup ограничивает время выполнения, а не обязательно видимое число процессоров. Поэтому os.cpu_count() может видеть 64 CPU, хотя контейнеру разрешено лишь 2 CPU-времени.
Автоподбор workers по числу CPU хоста вызывает лишние процессы, память, соединения к БД и троттлинг. Задавайте concurrency явно по измеренной нагрузке и бюджету контейнера. В cgroup v2 отношение quota/period берут из cpu.max с учётом родительских ограничений; cpuset и affinity тоже важны. process_cpu_count() учитывает доступность CPU по affinity, но не является универсальным измерителем временной квоты. Оптимальное число workers зависит также от I/O и памяти.
Источник: cdn.kernel.org, docs.python.org.