2015-04-16 2 views
1

Я хочу запустить кучу приложений или контейнеров на одной машине. Я хотел бы, чтобы изолировать использование следующих ресурсов:Выделение изоляции контейнеров (на Linux)?

  1. CPU
  2. память
  3. ввод/вывод (сетевой, диск, и т.д.)

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

Я знаю, что мы можем сделать это для CPU, но я не уверен, что это обобщает на все. Поблагодарю подробные ответы (а не просто использовать «tp/qdisc»/«iptables» для сети).

+1

> пропорциональное использование всех ресурсов < > Изоляция производительности <Это трудно смешивать. Вы либо ограничиваете ресурсы контейнера (лимиты могут перекрываться), либо предоставляют доступ ко всем ресурсам, и надеются, что планировщики внутри Linux достаточно справедливы (CFS, CFQ и т. Д.) – myaut

+0

Достаточно справедливо. Может быть, я должен уточнить. Я имею в виду, что если какой-либо контейнер хочет использовать 4 ядра, 2 Гб оперативной памяти, 10 Мбит/с диска и 20 Мбит/с сети, это должно быть гарантировано так много, но мы также должны масштабироваться, когда на машине больше ничего не работает. – sydraz

ответ

5

С контрольными группами (cgroups) вы можете добиться выделения ресурсов для:

  • CPU
  • памяти
  • Сеть
  • Disk

Когда два или более процессов могут использовать слишком большая часть ресурса, чтобы другие не получили справедливого шанса, вы можете использовать группы, чтобы сказать им: если вы t для одного и того же ресурса один из вас не может получить более 60%, а другой - не более 30% и т. д. Если нет гонок для одного и того же ресурса, у нас есть один запросчик. Он может использовать то, что хочет, пока другой процесс не попытается его использовать.

Examples of I/O Throttling

Introduction to Linux Control Groups

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

Redhat resource management guide:

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

cpusets.txt documentation

А если запустить CPU из задач его runqueue, процессор попытаться вытащить дополнительных задач из других занятых процессоров до помогите им, прежде чем он будет простоя.

Конечно, для поиска подвижных задач и/или простаивающих процессоров, планировщик может не искать все процессоры в домене каждые раз. На самом деле, в некоторых архитектурах диапазоны поиска на событиях ограничены в том же сокете или узле, где находится ЦП, а баланс нагрузки по тику просматривает все.

Например, предположим, что CPU Z относительно далеко от CPU X. Даже если CPU Z простаивает в то время как процессор X и братья заняты, планировщик не может мигрировать активированную задачи B от X до Z, так как он находится вне его диапазона поиска. Как результат результат, задача B на процессоре X должна ждать задачи A или подождать баланс нагрузки на следующем тике. Для некоторых приложений в особой ситуации ожидания 1 тик может быть слишком длинным.

Немногие другие методы для достижения изоляции ресурсов: nice (используется для простых настроек), cpulimit - статическое распределение ресурсов, когда другие процессоры простаивают, акции не заимствованы для других процессов.

+0

Используется ли использование незанятых ресурсов для IO или памяти? – sydraz

Смежные вопросы