Я хотел бы контролировать выполнение пользовательских программ в зависимости от нагрузки на сервер. Каждый пользователь использует bash. Есть ли способ создать какую-то очередь, в которой выполнение команд из командной строки будет отложено до тех пор, пока ресурсы не будут доступны?
спасибо Арман.
Арман, предлагаемая вами парадигма - это жесткая модель мэйнфреймов с разделением времени. В мэйнфрейме один процесс будет доминировать над машиной до тех пор, пока он не завершится или не будет приостановлен. С течением времени люди устали от неконтролируемых заданий, и ядра стали чаще вмешиваться, приостанавливая процессы, чтобы другие процессы могли иметь очередь. Эта функция получила название планировщика. Поработайте со мной минутку.
Планировщик требует много работы, чтобы каждый, кто использует систему, чувствовал, что система должна выполнять свои приказы, даже если только один процесс получает ход за один раз. Теперь с несколькими процессорами и более поздними ядрами компьютер действительно может выполнять сразу несколько задач. В многоядерных системах представление о том, что компьютер «занят», немного более расплывчато. В Linux процессы назначен ЦП и иметь близость для этого, когда они приостанавливаются и возобновляются, хотя планировщик оставляет за собой право перенести процесс на другое ядро.
Итак, в этом сценарии может быть выражено ваше реальное требование. Доступ к вашей новой системе получили три человека: Мишель, Ник и Орвилл. Всем троим хотелось бы увидеть, насколько быстро компьютер может визуализировать сложный кадр в известном трассировщике лучей. Пов-луч. Мишель - ваш ведущий разработчик, и начальник сказал, что она может использовать машину как захочет. Ник - один из ваших младших разработчиков, и начальник сказал, что может работать до тех пор, пока он не мешает случайному рендерингу кадров Мишель. Ник больше увлечен машиной, и у него выстроились в очередь всевозможные развлечения. Орвилл работает в графическом отделе, и босс хочет, чтобы он видел только изображения и файлы сцен, но он не хочет, чтобы Орвилл вмешивался в рендеринг. Чтобы он был аккуратным и упорядоченным, у нас будет три группы пользователей: сотрудники, новички и посторонние. Я не рекомендую использовать эти имена, если вы не хотите, чтобы вас добавили в последнюю группу. Отрывок из /etc/group
можно прочитать:
staff:1001::michelle,theboss
newbie:1002::nick,alode,ian
outsider:1003::orville
raytracers:1004::staff,newbie
Мы будем использовать двухсторонний подход для решения этой проблемы. Первым звеном будут ограничения, а вторым - простые права доступа к файлам (chmod
и chgrp
).
Сначала мы разберемся с ограничениями. Подключаемый модуль аутентификации (PAM) обеспечивает это через pam_limits
модуль. Ниже мы убедимся, что он настроен правильно. Взгляните на страницу руководства для limits.conf
для получения подробной информации о том, какие ограничения вы можете применить. Здесь важны две части терминологии: мягкие ограничения и жесткие ограничения. Мягкий предел всегда должен быть меньше жесткого. Жесткий предел - это верхняя граница, которую нельзя изменить после установки. Мягкие ограничения используются, если пользователь хочет получить предупреждение о том, что они вот-вот будут сдавлены, а также служат в качестве настройки по умолчанию, если пользователю разрешено изменить ее с помощью ulimit
команда. Подробности о ulimit
вероятно, находятся на странице руководства вашей оболочки (например, man bash
). Нас интересует жесткий лимит, потому что мы будем использовать его для Enforcer, который сделает всю грязную работу. Эксперимент с ulimit
некоторое время, пока вы не поймете эффекты и не увидите, что числа - это то, что вы понимаете.
А теперь самое сложное. Сложно, потому что, если вы ошибетесь, Мишель или Ник придут и пожалуются вам или вашему боссу. Мишель может пожаловаться, что Ник вмешивается, а Ник может пожаловаться, что не может любой время по новой системе. Обратите внимание, что это не техническая проблема, а, скорее, ваша лучшая догадка, как интерпретировать желание начальника и преобразовать его в конфигурацию системы. Сообщение о том, какие ограничения существуют, может уменьшить вашу боль.
Итак, давайте установим эти ограничения для Ника и Орвилла так, чтобы это не расстроило Нэнси. Мы подробно расскажем только о newbie
настройки группы.
Важное замечание: мы намерены установить приоритет по умолчанию для всех должностей персонала равным 15, максимум 10. Да, в этом случае 15 меньше 10, потому что 20 - это самый низкий приоритет, а 0 - самый высокий для не- пользователь root. Его легче схватить, если вы встанете на голову.
Я должен упомянуть, что я использую и Ubuntu, и ваш опыт может варьироваться в зависимости от того, как в дистрибутивах настроен PAM, в частности, pam_limits
. В моей системе есть эта линия, session required pam_limits.so
в этих файлах:
/etc/pam.d/login
/etc/pam.d/sshd
/etc/pam.d/cron
/etc/pam.d/at
/etc/pam.d/su
/etc/pam.d/sudo
/etc/pam.d/gdm
/etc/pam.d/gdm-autologin
Затем давайте поместим наши ограничения либо в /etc/limits.conf
или в отдельные файлы в /etc/limits.d/
. Если это уникальная сделка, то вложите ее в /etc/limits.conf
, но было бы разумно создать такой файл, как /etc/limit.d/raytracers
и поместите в него эти строки (пока мы будем ограничивать Орвилла). См. Страницу руководства для limits.conf
подробности и примеры можно найти в /etc/limits.conf
.
@newbie hard data 1024000
@newbie soft priority 20
@newbie hard priority 15
@newbie hard maxlogins 1
@outsider hard data 102400
@outsider soft 20
@outsider hard 20
@outsider hard maxlogins 1
@staff hard priority 10
@staff soft priority 15
Чтобы изменения вступили в силу, пользователям необходимо выйти и снова войти в систему. Однако вы собираетесь проявить смекалку и протестировать эти ограничения, прежде чем передавать их пользователям. Использовать ulimit
, чтобы проверить, применяются ли настройки. Максимальные логины необходимы, потому что применяются ограничения оболочка для каждого входа и пользователь мог обойти их, войдя в систему несколько раз.
Хорошо, наконец-то мы заблокировали пользователей, чтобы персонал всегда мог работать с машиной. Теперь идет наблюдатель. Это сложно, потому что вам нужно каким-то образом понять, что значит быть наблюдателем. У вас есть несколько сотен стандартных команд, которые вы не хотите блокировать. Таким образом, вы либо хотите защитить выбранные приложения, либо заставить их запускать одно основное приложение. Добавление X-Windows (GNOME или KDE) действительно усложняет это и потребует значительных усилий с вашей стороны. По этой причине вы можете просто ограничить количество процессорного времени, которое они могут занять (конечно, с помощью ограничений), и оставить все как есть.
Но, возможно, вы заплатили большие деньги за доступ к POV-Ray, и это то, что босс хочет, чтобы наблюдатели не бежали. Просто сделай chgrp -R raytracers /directory/with/application/and/settings
. Затем убедитесь, что у верхнего дерева есть разрешение 750
так что наблюдатель не может даже зайти в каталог и запустить программу.
Если вы хотите, чтобы наблюдатель запускал только конкретное приложение, у вас есть два варианта. Если это строго текстовая среда, сделайте их оболочку именем программы и убедитесь, что программа находится в /etc/shells
. Возможно, вам придется сделать некоторые исключения с модулями PAM, чтобы пользователь не выполнял scp
или ftp
. Если это графическая среда, вам придется повозиться с оконной средой. Графические среды довольно сложны для полной блокировки и потребуют некоторых экспериментов с вашей стороны.
Вот контрольный вопрос: как мы заставили новичков и наблюдателей всегда преобладать над должностями сотрудников? (Подсказка: посмотрите наши записи в /etc/limit.d/raytracers
)
Использовать at
/ batch
команда.
(Примеры)
Арман,
Я думал над вашим вопросом пару минут и хотел бы предположить, что похоже, что вы, возможно, полностью ошиблись. Это просто не соответствует шаблону того, как был разработан nix.
Оболочка обычно порождает ТОННУ маленьких процессов; вещи направляют ввод и вывод от одного к другому, и любая задержка в этой системе сделает ее практически непригодной для использования. Если ваши системные ресурсы таковы, что пользователи не могут запускать grep без постановки их процесса в очередь, они просто сойдут с ума.
Я бы посоветовал поискать другие дороги. Можно было бы экспериментировать с «хорошими» уровнями для каждого процесса или пользователя. Если ваши пользователи запускают задания, требующие огромного количества ресурсов, возможно, ограниченные способы запуска этих конкретных заданий для постановки в очередь будут в порядке, но способ работы самих заданий должен быть обновлен для этого варианта использования.
Еще одна вещь, на которую следует обратить внимание, - это изоляция ваших пользователей в виртуальных средах с использованием vserver или какого-либо другого паравиртуального гостя, тем самым позволяя им ограничивать часть всех ресурсов сервера.
Надеюсь, это вам немного поможет. Если бы вы поделились дополнительной информацией о том, какие задачи выполняют люди, которые потребляют так много ресурсов, возможно, люди смогут предложить более точные решения. В нынешнем виде я просто хотел сказать, что это действительно похоже на то, что вы пытаетесь решить проблему с помощью неправильных инструментов, вроде предотвращения плоских участков на вашей машине, сняв колеса и таща ее, как сани. Поймать мой дрейф?
Калеб