По каким схемам или алгоритмам можно выделять вычислительные ресурсы в распределенных системах?

Ответ

В распределенных системах ресурсы (CPU, память, сеть, диск) выделяются по различным схемам и алгоритмам, которые определяют эффективность и справедливость их использования.

Основные схемы и алгоритмы выделения ресурсов:

  1. Статическое выделение (Static Partitioning):

    • Ресурсы заранее фиксированно разделены между потребителями (нодами, контейнерами).
    • Плюсы: Простота, предсказуемость, отсутствие накладных расходов на оркестрацию.
    • Минусы: Неэффективное использование, отсутствие эластичности.
    • Пример: Выделение фиксированного количества виртуальных ядер и памяти для каждого микросервиса в конфигурации Kubernetes (resources.requests/limits).
  2. Динамическое выделение (Dynamic Allocation):

    • Ресурсы выделяются и освобождаются по требованию во время выполнения.
    • Алгоритмы:
      • Очередь с приоритетами (Priority Queue): Задачи с высшим приоритетом получают ресурсы первыми.
      • Пропорциональное распределение (Proportional Share): Ресурсы делятся между задачами в заданной пропорции (например, Weighted Fair Queueing).
    • Пример: YARN ResourceManager в Hadoop или менеджер ресурсов в Apache Mesos.
  3. Выделение на основе квот (Quota-based):

    • Пользователю или команде выделяется гарантированная доля ресурсов кластера (квота). Внутри квоты может работать динамическое выделение.
    • Пример: Namespace Resource Quotas в Kubernetes.
  4. Выделение на основе аукциона (Auction-based):

    • Задачи "конкурируют" за ресурсы, предлагая виртуальную "цену". Ресурсы достаются задачам, максимизирующим ценность для системы.
    • Пример: Используется в некоторых исследовательских системах и системах обработки данных (Borg).
  5. Выделение с учетом размещения (Bin Packing):

    • Задача оптимизации: разместить множество задач ("предметов") на минимальном количестве серверов ("контейнеров"), минимизируя простои.
    • Алгоритмы: First-Fit, Best-Fit, их производные.
    • Пример: Алгоритмы планировщика (scheduler) в Kubernetes или Docker Swarm, которые решают, на какую ноду поместить под.

Практический пример в Kubernetes: Планировщик использует Bin Packing для эффективного размещения подов, учитывая requests и limits, а также приоритеты и вытеснение (Priority & Preemption) для динамического перераспределения в условиях нехватки ресурсов.

Ответ 18+ 🔞

Давай разжую эту тему, как будто объясняю за кружкой пива после тяжёлого деплоя. Сиди, слушай.

Представь, у тебя есть овердохуища серверов — целая ферма. И на них всем надо как-то жить твоим контейнерам, этим ненасытным мартышкам. Так вот, способы, как им раздавать процессоры, память и прочую лабуду, — это целый ёперный театр.

Как этим тварям ресурсы тыкают:

  1. Жёсткая разметка, как в совке (Static Partitioning):

    • Берёшь и наглухо забиваешь гвозди в стену: этому микросервису — два ядра и четыре гига, этому — одно и два. Всё, приехали.
    • Чем хорошо: Проще некуда. Поставил и забыл. Никаких сюрпризов, оркестратору даже думать не надо, доверия ебать ноль, но спокойно.
    • Чем плохо: А тем, что один сервис спит, а его память простаивает, а другому в это же время, сука, не хватает и он падает. Неэффективность пиздец. Эластичности — ноль.
    • Где встречается: Да прямо в твоём kubernetes.yaml, эти самые resources.requests и limits. Задал лимиты — и сиди, как пень.
  2. Динамическая раздача, как в баре (Dynamic Allocation):

    • Тут уже веселее. Ресурсы — как стойка с бокалами. Пришёл — взял, выпил — вернул. По потребности.
    • Алгоритмы-вышибалы:
      • Очередь для важняков (Priority Queue): Кто начальник или у кого срочный дедлайн — того и пропускают первым к ресурсам.
      • Поровну, но с коэффициентом (Proportional Share): Всем сестрам по серьгам, но у одной серьги золотые, у другой — бижутерия. Делим по весу.
    • Где: Всякие умные менеджеры вроде YARN в Hadoop. Там, где задачи приходят и уходят толпами.
  3. По блату и квотам (Quota-based):

    • Ты — тимлид. Тебе говорят: «Вася, вот тебе 40% мощности всего кластера, делай что хочешь». А ты внутри своей команды уже сам решаешь, кому из своих проектов сколько дать. Главное — за забор не вылезать.
    • Пример: Quotas в Kubernetes на уровне неймспейса. Создал неймспейс team-pidorasy, выставил квоту — и пусть они там друг друга ебут, но общие ресурсы кластера не засрут.
  4. Аукцион, как на рынке (Auction-based):

    • Вообще дичь. Твои задачи начинают торговаться: «Я дам 10 виртуальных долларов за эти ядра!» — «А я 15!». Кто больше предложил, тот и забирает. Система старается отдать тому, кто принесёт больше «пользы».
    • Пример: Где-то в недрах Google Borg такое практикуют. Для нас, простых смертных, это выглядит как магия, хуй с горы.
  5. Упаковка чемоданов в багажник (Bin Packing):

    • Самая жизненная задача. У тебя есть куча серверов (чемоданов) и куча подов (шмоток). Надо запихать всё так, чтобы чемоданов (серверов) ушло меньше всего, а свободного места в них почти не осталось. Идеальная тётка в отпуск.
    • Алгоритмы: «Суй в первый попавшийся» (First-Fit), «Ищи, где самый плотный засов получится» (Best-Fit).
    • Где: Да это же основа основ планировщика Kubernetes! Он смотрит на твои requests и думает: «Эту хитрожопую поду куда воткнуть, чтобы остальные тоже влезли?». Весь день только этим и занимается, бедолага.

Ну и как это в кубересе выглядит на практике?

Планировщик — это такой главный упаковщик. Он Bin Packing-ом мозги ломает, чтобы сервера не пустовали. Смотрит на то, что ты в requests наобещал, и пытается запихать поды поплотнее.

А когда ресурсы на исходе, в ход идут приоритеты и вытеснение. Прилетает новая, важная подка, а места нет. Планировщик смотрит: «Ага, вот эта пода — низкоприоритетная, пизда рулю». И вышвыривает её на мороз, чтобы место освободить. Жестоко, но таков закон джунглей в кластере. Выживает самый важный, а не самый первый.