Назад | Перейти на главную страницу

Автоматическая балансировка нагрузки процессора для программы или группы программ под Linux?

Предположим следующую настройку: система (Ubuntu 14.04 LTS) с 40 ядрами, большим количеством ОЗУ. Кроме того, это программа, которая лишь частично является многопоточной. То есть он постоянно переключается между работой на нескольких ядрах в течение нескольких часов, а затем только на одном ядре (также в течение нескольких часов).

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

  1. все 10 экземпляров хотят работать на всех 40 ядрах параллельно (ужасное разрушение кеша)
  2. Я говорю каждому экземпляру использовать, скажем, максимум 4 ядра, но затем возникают ситуации, когда 9 из них используются в одноядерном режиме, а десятый может мгновенно использовать все ядра, но не может, поскольку ему разрешено использовать только 4.

Вопрос: существуют ли утилиты / расширения ОС, позволяющие это? Использование "renice" не совсем то, что было бы необходимо, хотя, если бы был автоматический супервизор, которому разрешено динамически повышать или понижать уровень процессов, это могло бы быть довольно близко. В идеале это будет работать примерно так: пока набор программ не максимизирует заданные ресурсы ЦП, им разрешено получать столько, сколько они хотят. Но если они используют больше, то программа (ы) с самым длинным временем выполнения (или что-то еще) получает наивысший приоритет для ЦП, что в конечном итоге приводит к нехватке других экземпляров.

Ближайшее, что я нашел, - это группы управления (cgexec и друзья), но из того, что я могу сказать, можно определить только группы программ с фиксированным соотношением ЦП, например, программы в группе могут использовать не более 60% ЦП (даже если остальные 40% не используются), и нет способа предотвратить получение чего-либо всеми процессами (опять же, уничтожение кешей ЦП).

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