У нас есть сервер Ubuntu (16.04), на котором запущен сервер R-Studio, на котором мы проводим статистическое моделирование. Эти симуляции иногда тяжелы для ОЗУ и ЦП, поэтому я хотел бы знать, как память и ОЗУ распределяются ядром, если, например, два пользователя вошли в систему, и каждый из них запускает отдельный сеанс R, где они «соревнуются» за память и процессор.
Поскольку никто из нас не является администратором сервера, мы действительно не хотим вносить изменения вручную, однако нас интересует, является ли распределение ОЗУ и ЦП более менее одинаковым для всех пользователей.
Примечание: версия R-Studio Server Pro позволяет довольно легко выделять определенный объем памяти отдельным пользователям, но поскольку у нас нет версии Pro, мы не можем изменить эти настройки.
Если вам нужно ограничить использование памяти на том же сервере, лучше всего либо
Оперативная память работает в порядке очереди. Если пользователь A запускает 9 процессов, каждый из которых выделяет 10% памяти, а затем пользователь B входит в систему, пользователь B увидит только 10% оставшейся памяти. В случае исчерпания памяти Linux начнет убивать процессы. Насколько мне известно, убийца OOM не настроен на многопользовательскую работу, поэтому в данном сценарии это может быть несправедливо.
Процессорное время обычно выделяется для каждого процесса, а не для каждого пользователя (но см. Ниже).
Любой процесс, готовый к запуску (не спящий, ожидающий ввода-вывода и т. Д.), Рассматривается для планирования. (Процессы, которые не готовы к запуску, игнорируются и поэтому «не считаются». (Это небольшое упрощение, но достаточно близко).)
В простейшей модели, если два пользователя запускают по одному процессу каждый, каждый из них получает примерно половину доступного процессорного времени. Но если userA выполняет 10 процессов, а userB - 1 процесс, тогда userA получает 90% CPU, а userB - 10% CPU (при прочих равных).
Однако планировщик Linux может уточнить это, группируя процессы вместе, а затем распределяя процессорное время между этими группами.
Кроме того, в Linux есть возможность автоматически группировать процессы на основе идентификатора сеанса (обычно связанного с терминалами, окнами терминала и / или сеансами входа в систему X). Это называется «автогруппировка». Цель состоит в том, чтобы один пользователь, выполняющий тяжелую фоновую задачу в одном окне и интерактивную задачу в другом окне, по-прежнему видел быструю интерактивную производительность.
Обе эти возможности включены по умолчанию в Ubuntu, насколько я могу определить.
Я не могу найти информацию о том, как группы задач и / или автогруппировка ведут себя в многопользовательской рабочей нагрузке. Теоретически, если планировщик поместит каждого пользователя в отдельную группу задач, то пользователи всегда получат сбалансированный доступ к ЦП (50/50 для двух пользователей). Однако я не нашел ничего, что говорило бы, что это произойдет автоматически.
Дальнейшее чтение:
По умолчанию в Ubuntu у пользователей неограниченный объем памяти, и в данном случае это «первым пришел, первым обслужен». Другими словами, пользователь A может использовать всю память и ничего не оставить для второго пользователя.
Однако обратите внимание: если вы настраиваете ограничения, они всегда будут одинаковыми и не будут зависеть от количества текущих пользователей, поэтому вы ограничите своих пользователей, даже если они одни на машине.
Для ЦП дела обстоят немного лучше, и планировщик ядра распределяет время ЦП между процессами (а не пользователями!).
Это будет зависеть от того, какие фоновые процессы выполняются, какие версии программного обеспечения устанавливаются при установке Ubuntu, выполняются ли задания cron и т. Д. Единственный реальный способ выяснить это - проверить использование ОЗУ во всех интересующих вас сценариях. , никто не сможет вам сказать, поскольку даже такие вещи, как количество процессоров и сетевых карт, будут влиять на использование ОЗУ.
Вы должны иметь возможность использовать группы управления для ограничения использования ОЗУ, но я не знаю, нужны ли вам для этого права root. В идеале вы должны создать несколько виртуальных машин и таким образом распределить ресурсы.