Размер пула многопроцессорной обработки - cpu_count или cpu_count / 2? - PullRequest
0 голосов
/ 08 июля 2020

Я запускаю python скриптов, которые выполняют пакетную обработку данных на довольно больших aws экземплярах (48 или 96 виртуальных ЦП). multiprocessing.Pool () работает хорошо: рабочие имеют минимальную связь с основным процессом (взять путь к файлу, вернуть True / False). Ввод-вывод и память, похоже, не ограничивают.

У меня была переменная производительность, где иногда лучшая скорость зависит от размера пула = количество vCPU, иногда количество vCPU / 2, а иногда vCPU * некоторые кратные 2-4. Они предназначены для разных типов заданий и в разных экземплярах, поэтому было бы сложно провести сравнительный анализ всех из них.

Есть ли практическое правило для выбора пула размера? .cpu_count () возвращает число, которое кажется равным количеству vCPU. Если это согласуется, я хотел бы выбрать некоторое разумное кратное cpu_count и просто оставить его как есть.

Ответы [ 2 ]

2 голосов
/ 08 июля 2020

Существует множество практических правил, которым вы можете следовать, в зависимости от задачи, как вы уже выяснили

  • Количество физических ядер
  • Количество логических ядер
  • Количество физических или логических ядер минус одно (предположительно зарезервировано одно ядро ​​для лог c и управления)

Чтобы избежать подсчета логических ядер вместо физических, я предлагаю использовать библиотеку psutil:

import psutil
psutil.cpu_count(logical=False)

Что касается того, что использовать в конечном итоге, для приложений с интенсивным числовым использованием я обычно использую go с количество физических ядер. Имейте в виду, что некоторые реализации BLAS по умолчанию используют многопоточность, что может сильно повлиять на масштабируемость конвейеров с параллельными данными. Используйте MKL_NUM_THREADS=1 или OPENBLAS_NUM_THREADS=1 (в зависимости от вашего сервера BLAS) в качестве переменных среды при выполнении пакетной обработки, и у вас должно быть квазилинейное ускорение по отношению к количеству физических ядер.

1 голос
/ 09 июля 2020

Причина этих чисел:

  1. количество виртуальных ЦП: это разумно, мы используем все ядра.
  2. количество виртуальных ЦП / 2: Это также разумно, так как иногда у нас есть двойные логические ядра по сравнению с физическими ядрами. Но логические ядра на самом деле не ускорят вашу программу, поэтому мы просто используем vCPU / 2.
  3. vCPU * несколько в районе 2-4: это разумно для некоторых задач с интенсивным вводом-выводом. Для такого рода задач процесс не всегда занимает ядро, поэтому мы можем запланировать некоторые другие задачи во время операций ввода-вывода.

Итак, теперь давайте проанализируем ситуацию, я думаю, вы работаете на сервер, который может быть VPS. В этом случае нет разницы между логическими ядрами и физическими ядрами, потому что vCPU - это просто абстрактный вычислительный ресурс, предоставляемый поставщиком VPS. Вы не можете прикоснуться к базовым физическим ядрам.

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

В зависимости от вашей ситуации я хотел бы предложить количество виртуальных ЦП. Но вам все равно нужно принять решение, исходя из реальной ситуации, с которой вы столкнетесь. Критическое правило:

Максимальное использование ресурсов (используйте как можно больше ядер), минимизируйте конкуренцию за ресурсы (слишком много процессов будут конкурировать за ресурс, что замедлит работу всей программы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...