Система распределения нагрузки на процессоры Shenango — как она работает

Говорим о балансировщике нагрузки от инженеров MIT, который планируют использовать в ЦОД. В статье — о принципах работы и возможностях решения.
Цель разработки
Аналитики одного из крупных облачных провайдеров говорят, что мировые ЦОД используют треть имеющихся у них вычислительных ресурсов. В исключительных случаях этот показатель может вырастать до 60%. Из-за неэффективного расходования мощностей в машинных залах появляются так называемые серверы-зомби. Они не выполняют полезную работу (находятся в состоянии «комы») и лишь впустую расходуют электричество. По данным Uptime Institute, без работы стоит около 10 млн серверов (это 30% всех машин). На поддержание их работоспособности ежегодно уходит 30 млрд долларов. Инженеры из Массачусетского технологического института (MIT) решили исправить ситуацию. Они разработали балансировщик нагрузки, который в теории повысит эффективность использования ресурсов процессоров до 100%. Система получила название Shenango.
Как работает балансировщик

Shenango — это Linux-библиотека на языке программирования C (есть биндинги на Rust и C++). Она мониторит буфер задач CPU и распределяет процессы между свободными ядрами. В основе системы лежит алгоритм IOKernel. Он запускается на отдельном ядре процессора и управляет запросами к CPU, которые поступают по сетевому интерфейсу NIC. Для этих целей IOKernel использует фреймворк DPDK (Data Plane Development Kit). Фреймворк дает приложениям возможность «общаться» с сетевыми картами напрямую. Когда процессору поступает новая задача, IOKernel самостоятельно выбирает, какому ядру (или ядрам) ее передать. При этом для каждого процесса выделяются основные ядра (guaranteed) и вспомогательные (burstable) — последние подключаются только в том случае, если количество запросов резко возрастает. Алгоритм проверяет буфер задач с интервалом в 5 мкс. Он ищет «застрявшие» процессы, которые CPU уже долгое время не может обработать. Если таковые обнаруживаются, они сразу же назначаются свободным ядрам (или другим серверам в дата-центре). Приоритет отдается ядрам, на которых уже выполнялся аналогичный процесс и часть информации о котором осталась в кэше. Чтобы повысить эффективность балансировки, Shenango также использует метод work stealing. Ядра, работающие с одним приложением, автоматически снимают друг с друга часть нагрузки, если выполняют свои задачи раньше остальных. Общую схему работы алгоритма IOKernel и системы Shenango можно представить следующим образом: Код проекта и примеры приложений вы можете найти в официальном репозитории на GitHub.
Возможности
Разработчики говорят, что Shenango способен обрабатывать 5 млн запросов в секунду. Среднее время реакции при этом составляет 37 мкс. Эксперты ИТ-индустрии отмечают, что система поможет оптимизировать работу веб-приложений, например онлайн-магазинов. По статистике, секундная задержка при загрузке страницы снижает количество просмотров на 11%, что в дни распродаж может быть критично. Эффективное распределение нагрузки поможет обслужить большее количество клиентов. Сейчас инженеры из MIT работают над устранением недостатков и расширением функциональности своего решения. Пока что Shenango не умеет работать с многопроцессорными NUMA-системами. В них чипы подключены к различным модулям памяти и не могут взаимодействовать друг с другом напрямую. Такой подход усложняет распределение нагрузки: IOKernel может контролировать работу отдельного кластера процессоров, но не все устройства сервера.
Кто еще разрабатывает балансировщики нагрузки на CPU

Не только в MIT занимаются разработкой систем распределения нагрузки на процессоры. В качестве еще одного примера можно привести систему Arachne — это библиотека C++ для Linux (код есть на GitHub, документацию по API можно найти на официальном сайте). Arachne рассчитывает, сколько ядер понадобится конкретному приложению, и выделяет необходимое количество при запуске соответствующего процесса. / фото Brian Kostiuk Unsaplsh Еще одним примером балансировщика может служить ZygOS — специализированная операционная система, которая использует структуры данных с общей памятью, NIC с несколькими очередями и межпроцессорные прерывания для распределения нагрузки между ядрами. Как и Shenango (в отличие от Arachne), решение также использует подход work stealing. Код проекта можно найти на GitHub. Современные дата-центры становятся все крупнее. В мире уже построено более четырехсот гипермасштабируемых ЦОД. В ближайшее время их число вырастет еще на 30%. Технологии балансировки нагрузки позволят эффективнее расходовать вычислительные ресурсы. Поэтому решения подобные Shenango, ZygOS и Arachne будут становиться все более востребованными — уже сейчас их внедряют крупные корпорации. Что еще почитать в нашем блоге по теме:
- Процессоры для серверов: обсуждаем новинки
- Развитие дата-центров: технологические тренды
- Как повысить энергоэффективность дата-центра
Распределение нагрузки по ядрам
Таки заметил что моя система нагружает одно ядро из восьми до талого. Правильна ли такая загрузка ядра? Нужно ли и как указать чтобы распределялось по всем, или же система сама знает как лучше. На скриншоте нагрузка осуществляется с помощью:
cat /dev/urandom > /dev/null
4.9.0-5-amd64 #1 SMP Debian 4.9.65-3+deb9u2 (2018-01-04) x86_64 GNU/Linux
Картинки вставлять можно на форуме?

Night_Activity
14.01.18 07:54:05 MSK
Как распределить программы по ядрам?
Не программист, не инженер. Есть процессор AMD-6300 3 ядра. Нагруженность на процессор составляет от 90% до 100% в рабочее время. Две программы занимают в среднем 60% нагрузки на ЦП, остальные программы оставшуюся треть нагрузки ЦП. Поэтому подумал что стоит распределить две эти программы на два ядра, а остальные программы оставить на оставшимся — третьем ядре.

Есть ли смысл в таких манипуляциях? Если да, то не могли бы подсказать через какие утилиты это можно добиться?
- Вопрос задан более трёх лет назад
- 716 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 4

Любые ответы на любые вопросы
Ос гораздо лучше вас соображает, на какое ядро ей что положить, не мешайте машине работать.
Ответ написан более трёх лет назад
Нравится 5 2 комментария
Дмитрий Перевалов @iPerevalov Автор вопроса
Вы уверенны в этом? Уверены в том, что мое вмешательство повредит работоспособность ЦП?
Stalker_RED @Stalker_RED
Дмитрий Перевалов, вы не повредите цп, после перезагрузки все ваши настройки сбросятся. Самое плохое что можно сделать — заставить все адово тормозить и вообще завесить систему (до перезагрузки). Иногда играясь с ядрами и приоритетами можно вытянуть несколько лишних FPS или сделать так, чтобы киношка не заикалась пока что-то тяжелое обрабатывается. Но совсем волшебных результатов не ждите.
Stalker_RED @Stalker_RED
Смысл есть, если у вас ОООЧЕНЬ тяжелый процесс и очень слабое железо. Я такое для некоторых игрушек применял (rust, elite, несколько окон eve online на core2duo, например).

В таскменеджере:
Или можно при запуске приложения указывать (сделать ярлык)
Утилиты автоматические тоже есть, но при неосторожном применении можно ухудшить положение.
Ответ написан более трёх лет назад
Нравится 1 5 комментариев
Дмитрий Перевалов @iPerevalov Автор вопроса
То есть если показывает 6 ядер, хотя сам процессор имеет 3 ядра, то я могу не ошибиться назначив исполнение на определенное ядро?

Stalker_RED @Stalker_RED
Снимая галочки вы запрещаете приложению использовать определенные ядра.
Можно запретить вашему бондарю первое ядро, а скайпу запретить все ядра кроме первого, например. и тормоза бондаря не заставят скайп заикаться.
Дмитрий Перевалов @iPerevalov Автор вопроса
Вот меня этот вопрос и смутил. Здесь показано ЦП от 0 до 5, но здесь видимо речь идет о лог. процессорах. Еще раз проверил сколько ядер на ЦП. Их три

Правильно ли я понимаю, что 0-1 это 1 ядро, 2-3 — 2, 4-5 — 3? Я на самом деле запутался
Распределение нагрузки по всем ядрам CPU (1 онлайн
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Вам необходимо обновить браузер или попробовать использовать другой.
nikolas_n
Active Member
22 Мар 2019 735 99 28 34
При работе с NI KOTNAKT и задействовании комплекса библиотек, заметил что идет неравномерная нагрузка на процессор . Какие то ядра загружены какие то простаивают. Так как в один контакт были подключены несколько библиотек-по совету удалил и оставил один контакт-одна библиотека внутри . Теперь один контакт одна библиотека . Затем под первым контактом загрузил второй контакт со второй библиотекой -но почему то все равно график нагрузки неравномерен. Кто может подсказать есть ли вариант распределить нагрузку? Так же вопрос , второй контакт в который загружена библиотека не играет при проигрывании MIDI . Пробовал менять каналы итд, но играет только первый контакт второй не играет. В чем причина? 

PianoIst
Well-Known Member
19 Май 2010 4.040 4.048 113 29 Kirchberg, kreis Zwickau soundcloud.com
Контакты надо пихать на разные треки. Последовательно они будут кратно увеличивать задержку. Для того чтобы пробрасывать через контакт MIDI — надо покопаться в настройках контакта, есть там такая галочка. Но вообще так делать точно не надо.
Один трек — один контакт — один инструмент (за исключением случаев, когда у нас разные артикуляции одного инструмента, которые 90% времени молчат).
PianoIst
Well-Known Member
19 Май 2010 4.040 4.048 113 29 Kirchberg, kreis Zwickau soundcloud.com
Что касается распределения — во-первых, сами контакты можно понастраивать по этому поводу: сколько потоков один контакт пытается задействовать. Во-вторых, в целом, чтобы все ядра пахали на 100%. Это надо либо майнить, либо комп менять. Если один поток не нагружает ядро под завязку — то это ж хорошо. Главное, чтоб в деадлок не уходило и аудио-поток не тормозило, но это не проблемы пользователей, а проблемы програмо-писателей.