Linux ограничения оперативной памяти

Содержание
  1. limits.conf и лимиты потребления ресурсов для пользователей в Linux
  2. ulimit в Linux и ограничение ресурсов для пользователя
  3. Ограничить память и ЦПУ для пользователя
  4. Re: Ограничить память и ЦПУ для пользователя
  5. Re: Ограничить память и ЦПУ для пользователя
  6. Re: Ограничить память и ЦПУ для пользователя
  7. Re: Ограничить память и ЦПУ для пользователя
  8. Re: Ограничить память и ЦПУ для пользователя
  9. Re: Ограничить память и ЦПУ для пользователя
  10. Re: Ограничить память и ЦПУ для пользователя
  11. Re: Ограничить память и ЦПУ для пользователя
  12. Re: Ограничить память и ЦПУ для пользователя
  13. Re: Ограничить память и ЦПУ для пользователя
  14. Re: Ограничить память и ЦПУ для пользователя
  15. Re: Ограничить память и ЦПУ для пользователя
  16. Re: Ограничить память и ЦПУ для пользователя
  17. Re: Ограничить память и ЦПУ для пользователя
  18. Как ограничить использование центрального процессора и памяти в Linux
  19. Контроль использования центрального процессора и памяти в Linux
  20. Как установить timeout
  21. Опции timeout:
  22. Как ограничить время выполнения программы (нагрузку на процессор)
  23. Как ограничить потребление памяти
  24. Как ограничить использование процессорного времени и памяти
  25. Ограничение нагрузки на процессор с множеством коротких дочерних процессов
  26. Продвинутые опции
  27. Сбор информации о «тяжёлых» процессах:
  28. Сбор статистики о «лёгких» дочерних процессах
  29. Выявление зависаний в программе:
  30. Нехватка оперативной памяти в Linux на рабочем ПК: оптимизация и действия при зависании
  31. zram и приоритеты свопов
  32. Быстро вырубить программу, перегружающую ОЗУ. Запас ОЗУ для SSH

limits.conf и лимиты потребления ресурсов для пользователей в Linux

Прежде всего, как выяснить процессы каких пользователей потребляют больше всего ресурсов CPU оперативной памяти.

Для текущего момента посмотреть процессы можно при помощи утилиты ps

ps aux —sort=%cpu | grep -v ‘root’ | head -n 35

ps aux —sort=%mem | grep -v ‘root’ | head -n 35

Команды выведут сортированные списки процессов в одной из колонок каждого списка будет указано имя пользователя. Процессы, запущенные от имени root показываться не будут и выведутся только 35 самых активных процессов.

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

Ограничения нужны на нагруженных серверах, они существует у каждого хостинг провайдера.

Лимитировать количество процессов можно используя механизм ядра cgroups — на практике проще всего установить ограничения отредактировав файл /etc/security/limits.conf и перезагрузив сервер.

Изменять /etc/security/limits.conf может только пользователь root или другой пользователь работающий из под sudo.

Файл хорошо задокументирован, вся необходимая информация находится в нем в комментариях

В общем виде любое правило выглядит так:

domain — это пользователь или группа, для которых лимитируем ресурсы

type — тип ограничения: soft или hard, ограничение soft может быть переопределено пользователем.

item — ресурс, который ограничиваем — обычно это cpu (в минутах) или as — максимальное количество оперативной памяти (в Кб); также можно задать nice level, который не сможет быть превышен процессами пользователя/группы (минимум 20, максимум -19); здесь же можно задать chroot (только для debian)

item — само численное значение

Как уже упоминалось — для того чтобы изменения вступили в силу нужна перезагрузка.

ulimit в Linux и ограничение ресурсов для пользователя

Soft лимиты пользователь может переопределить используя ulimit

Выполнение команды с аргументом -a выведет актуальные ограничения

ulimit -as 1500000
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 14685
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 14685
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

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

Дополнительно следует указывать тип ограничения:

-H — hard

-S — soft

Если не указывать ничего лимиты будут заданы жестко. hard здесь можно задать для текущего пользователя даже без прав root, но изменения не сохранятся после перезагрузки и чтобы ограничения были установлены постоянно нужно редактировать файл, который был рассмотрен ранее.

Создадим ограничение по оперативной памяти в 1500 Мб для пользователя

Выполнив ulimit -Hm сейчас можно увидеть, что ограничение установлено. Получить ту же информацию можно просмотрев лимиты для процесса

Можно указывать идентификатор любого процесса, запущенного от имени пользователя, для которого задали ограничение по памяти

Источник

Ограничить память и ЦПУ для пользователя

Как ограничить кол-во используемой памяти и ЦПУ в % определённому пользователю? ulimit же только на 1 процесс действует.

Читайте также:  При запуске windows не работает панель

Что то кроме всяких OpenVZ ничего не нагуглилось.

Re: Ограничить память и ЦПУ для пользователя

Re: Ограничить память и ЦПУ для пользователя

CPU делить в % между пользователями нельзя, by design.

Re: Ограничить память и ЦПУ для пользователя

разве? ulimit просто засунуть в .bashrc или что вы там используете, и должно быть хорошо. я так думаю

Re: Ограничить память и ЦПУ для пользователя

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

Re: Ограничить память и ЦПУ для пользователя

> CPU делить в % между пользователями нельзя, by design.

Fair scheduling и process containers aka control groups вроде бы уже включили в ядро.

Re: Ограничить память и ЦПУ для пользователя

Re: Ограничить память и ЦПУ для пользователя

Как минимум насчет ulimit он совершенно прав.

Re: Ограничить память и ЦПУ для пользователя

Я не про ulimit говорю.

Re: Ограничить память и ЦПУ для пользователя

> Я не про ulimit говорю.

А про что? AFAIK, до последнего года в стандартном ядре не было средств ограничения именно пользователя — только процессов (как и сказал sdio).

Re: Ограничить память и ЦПУ для пользователя

Надо посмотреть, машина времени в Etch старой версии с огр. радиусом действия.

Re: Ограничить память и ЦПУ для пользователя

/etc/security/limits.conf как раз и задает значения по умолчанию для ulimit

Re: Ограничить память и ЦПУ для пользователя

Странно, я был уверен, что ulimit относится к bash, а /etc/security — к PAM.

Re: Ограничить память и ЦПУ для пользователя

Re: Ограничить память и ЦПУ для пользователя

Кажется оно, но придется пересобрать (а может и все таки пропатчить) ядро.

Источник

Как ограничить использование центрального процессора и памяти в Linux

Контроль использования центрального процессора и памяти в Linux

Скрипт timeout — это полезная программа мониторинга использования ресурсов. Она ограничивает потребление времени и памяти процессом Linux. Это позволяет вам запускать программу под контролем, указав ограничения по времени и памяти, если программа нарушит эти пределы, то она будет остановлена.

Особенностью этого скрипта является то, что он не только контролирует родительский процесс, но также учитывает его дочерние форки. Вы можете выбрать, ограничен ли объем наблюдаемых процессов группой процессов или деревом процессов.

Программа не требует установки и у неё практически нет зависимостей (только Perl 5), она запускает программу вместе с её аргументами и контролирует её потребление ресурсов, если программа выходит за пределы, то она завершается, а пользователь уведомляется сообщением.

Программа timeout работает по принципу «чёрного ящика», то есть не требует какой-либо настройки самих процессов.

Обратите внимание, что данный скрипт не является одноимённой программой timeout из coreutils — это две разные программы.

Ещё нужно обязательно упомянуть Cgroups (Control Groups), которая контролирует потребление ресурсов системы на уровне ядра. По сравнению с рассматриваемым скриптом timeout, Cgroups сложнее в использовании, но и возможностей там больше.

Как установить timeout

Для работы скрипта на вашей системе Linux нужен установленный Perl 5 и смонтированная файловая система /proc.

Для проверки версии Perl на вашей системе Linux запустите следующую команду:

Теперь нужно скачать сам скрипт — можно клонировать весь репозиторий https://github.com/pshved/timeout или скачать всего один файл:

Поскольку у меня установлена программа timeout из пакета coreutils, то чтобы не вызывать путаницу, я не стал копировать этот скрипт в системную директорию исполнимых файлов. Поэтому я буду вызывать программу по относительному пути так (когда нахожусь в директории со скриптом):

Также программу можно вызывать по абсолютному пути (независимо от вашей текущей рабочей папки) — но у вас путь до файла будет другим:

Опции timeout:

Базовыми опциями являются:

  • -t T — устанавливает лимит времени CPU+SYS на T секунд
  • -m M — устанавливает лимит времени виртуальной памяти на M килобайт
  • TIMEOUT_IDSTR переменная_окружения — строка добавляемая к сообщению о нарушении лимитов использования ресурсов (для разграничения от строк, печатаемых самой командой). Само сообщение может быть:
  • TIMEOUT — лимит времени закончился
  • MEM — лимит памяти израсходован
  • HANGUP — обнаружено зависание (смотрите ниже)
  • SIGNAL — процесс timeout был убит сигналом

После этого сообщения печатается количество секунд, которое проработал процесс.

Как ограничить время выполнения программы (нагрузку на процессор)

Для ограничения времени выполнения используется опция -t после которой указывается количество секунд, которое должен проработать скрипт. Пример ограничения работы четыремя секундами:

В выводе показана статистика использования процессора и памяти. Обратите внимание, что имеется ввиду процессорное время, то есть нагрузка на ЦПУ. Чтобы разница была более понятной, посмотрите на следующий пример:

Читайте также:  Отключить спящий режим линукс минт

Он проработает не 4 секунды, а 20 секунд, поскольку нагрузка на процессор отсутствует. В выводе будет показано:

Как ограничить потребление памяти

В следующем примере программа будет работать любое количество времени, но если она её потребление ресурсов превысит 10 гигабайт памяти, то она будет остановлена:

Посмотрите на скриншот, на нём видно, как программа постепенно увеличивала количество занятой памяти, а потом была завершена из-за превышения лимита:

Как ограничить использование процессорного времени и памяти

В следующем примере количество используемой памяти ограничено 1 гигабайтом и процессорное время ограничено 9 секундами:

Как можно увидеть, было потреблено менее трёх секунд процессорного времени, а программа была завершена из-за превышения лимита памяти.

Ограничение нагрузки на процессор с множеством коротких дочерних процессов

То есть программа timeout успешно подсчитывает не только ресурсы основного процесса, но и дочерних процессов.

Продвинутые опции

  • -p .*regexp1.*,ИМЯ1;.*regexp2.*,ИМЯ2 — собирает статистику для дочерних процессов с указанными командами. ИМЕНА определяют сегменты, а regexps (регулярные выражения в формате Perl) определяют совпадение дочерних процессов, которые попадают в эти сегменты.
    Если шаблон начинается с CHILD:, тогда в эту категорию собирается информация о работе дочерних совпадающих процессах (поиск совпадений выполняется по остальному шаблону). Обратите внимание, что это единственный способ собрать статистику потреблённого времени дочерними процессами, которые длятся только доли секунды.
  • -o файл_вывода — файл для сброса статистики сегментов, собранной опцией -p
  • —detect-hangups — выключить выявление зависаний. Если вы указали фрагмент опцией -p, тогда если CPU время в любом из фрагментов не увеличивается во время некоторого времени, то скрипт timeout приходит к выводу, что контролируемый процесс завис и выключает его.
  • —no-info-on-success — отключает вывод статистики использования если контролируемый процесс успешно завершил работу.
  • —confess, -c — при выключении контролируемого процесс возвращает его код выхода или сигнал+128. Это также приводит к тому, что timeout ожидает пока контролируемый процесс не завершиться. Без этой опции скрипт возвращает толь.
  • —memlimit-rss, -s — монитор лимита памяти RSS (resident set size)

Сбор информации о «тяжёлых» процессах:

Сбор статистики о «лёгких» дочерних процессах

В этом шаблоне легковесные дочерние процессы должны отслеживаться с помощью специального префикса CHILD:, сравните предыдущую команду и эту:

Почему остальные не показаны в статистике? Все процессы запускаются из Perl, но короткоживущие не отслеживаются в полной мере, поскольку timeout не просыпается достаточно часто.

Выявление зависаний в программе:

Более простой пример для остановки процесса, если он завис:

Итак, скрипт timeout — это простая программа для мониторинга потребления ресурсов, которая ограничивает потребление процессорного времени и памяти любой программы в Linux, она умеет выявлять зависания и подсчитывать статистику, в том числе с учётом дочерних процессов, а также отдельно для дочерних процессов.

Источник

Нехватка оперативной памяти в Linux на рабочем ПК: оптимизация и действия при зависании

На любой операционной системе часто не хватает оперативной памяти. Рассмотрим, как и сэкономить на увеличении аппаратных ресурсов машины с Linux, и продолжить более-менее комфортно пользоваться компьютером с Linux в условиях нехватки памяти.

Типична такая ситуация: есть своп (swap, раздел подкачки), который начинает использоваться при нехватке оперативной памяти, и размещен он на HDD, то есть жестком диске с низкой скоростью чтения информации. В таких ситуациях операционная система начинает тормозить, подвисает курсор мыши, сложно переключиться в соседнюю tty и т.д. Почему? Потому что планировщик ядра Linux не может выполнить запрос на какое-то действие в запущенной программе, пока не получит доступ к ее оперативной памяти, выполнить следующее действие тоже не может, образовывается очередь из запросов на чтение с диска, и система «подвисает» именно потому, что обработка очереди происходит гораздо медленнее, чем этого хочет пользователь.

Если в такой момент запустить htop или uptime , то показатель Load Average (LA) будет очень высоким, несмотря на низкую загруженность ядер процессора. Сочетание высокого Load Average и низкой загрузки процессора говорят о забитой очереди процессора.

Часто в интернете советуют изменить параметр ядра Linux vm.swappiness . Узнать его текущее значение на вашей системе можно так:

Ответ будет 60 почти наверняка. Это значит, что ядро Linux начинает свопить редко используемые страницы оперативной памяти, когда использование свободной оперативной памяти достигает 100%-60%=40%. Часто встречаются рекомендации поставить, например, vm.swappiness=10, чтобы своп не начинал использоваться, пока загрузка ОЗу не достигнет 90%. На самом деле не нужно трогать vm.swappiness, вы не умнее разработчиков ядра Linux, которые не просто так поставили 60 по умолчанию. Почему?

Представьте, что у вас всего 4 ГБ оперативной памяти, из них прямо сейчас занято 3 ГБ, vm.swappiness=10, своп на жестком диске (HDD) занят на 0%, и вы открываете тяжелый сайт в браузере, для чего требуется больше, чем имеющийся свободный 1 ГБ, например, 2 ГБ. Операционная система начинает в экстренном порядке отправлять в своп как минимум 0.5 ГБ (а по факту больше), чтобы можно было выделить браузеру необходимое количество оперативной памяти. Эта процедура становится самой приоритетной задачей, и придется пожертвовать даже движениями курсора мыши, чтобы ее выполнить как можно быстрее. Вы ждете. Проходит 5 минут, и система развисает, потому что окончила процедуру 100% загрузки очереди доступа к медленному жесткому диску, на котором размещена оперативная память (своп). При дефолтном vm.swappiness=60 редко используемые страницы памяти сбрасываются в своп заблаговременно, и резкого зависания на 5-10 минут не происходит.
UPD. В комментарии подсказывают, что это не точное описание работы vm.swappiness.

Читайте также:  Какая разрядность у windows 10 home

zram и приоритеты свопов

Рекомендую включить zram — прозрачное сжатие содержимого оперативной памяти. В Ubuntu это автоматизировано, достаточно установить пакет:

sudo apt install zram-config

Здесь и далее для дистрибутивов Rosa, Fedora все то же самое, но вместо zram-config —

Сервис systemd zram-config на Ubuntu будет автоматически добавлен в автозагрузку при установке пакета и запущен при перезагрузке системы. Для запуска вручную:

sudo systemctl start zram-config

sudo systemctl stop zram-config

Удаления из автозапуска:

sudo systemctl disable zram-config

Добавление в автозапуск:

sudo systemctl enable zram-config

При запуске zram-config берет число, равное 50% всего объема оперативной памяти, далее делает по одному виртуальному устройству /dev/zramN, где N начинается с 0, для каждого ядра процессора, а объем каждого /dev/zramN равен 50% всей оперативной памяти, деленному на количество ядер процессора. Так делалается для распараллеливания сжатия содержимого оперативной памяти по ядрам процессора; насколько я знаю, на современных ядрах Linux достаточно одного устройства /dev/zramN, а распараллелится оно само, но меня полностью устраивает искоробочная работа zram-config, и предпочитаю не лезть в нее руками.

Команда swapon -s выведет список всех задействованных свопов с указанием их приоритета. Первым используется тот своп, у которого приоритет выше. Если у вас уже есть дисковый своп и включен zram, то в случае с описанным выше пакетом-автокофигуратором приоритеты из коробки будут правильными. Например, у дискового свопа будет -1, а все /dev/zramN — 5. Таким образом, сначала используется zram, и только потом — диск.

Кстати, zram часто применяется на смартфонах, какую-либо на глаз заметную нагрузку на процессор при дефолтном методе сжатия lz4 он не создает.

Также приоритет свопа можно указать в /etc/fstab . Покажу на примере, как это сделано на моем рабочем компьютере с 6 ГБ ОЗУ.

Опцией монтирования pri=X заданы приоритеты свопов. Если еще включить zram, то картинка будет такой:

В первую очередь будет свопиться в zram, то есть сжиматься внутри оперативной памяти без использования внешнего устройства для свопа, во вторую — использовать небольшой своп на SSD. Почти никогда не будет использоваться 6 ГБ свопа на HDD, однако они понадобятся, если я захочу отправить компьютер в спящий режим в условиях большой загрузки оперативной памяти. (На самом деле у меня отключен zram).

На офисных ПК с 4 ГБ ОЗУ (Xubuntu 16.04, 17.10) всегда ставлю пакет zram-config . Chromium, по наблюдениям, на глаз, очень хорошо сжимается в оперативной памяти, в результате чего zram позволяет сделать работу намного более комфортной без модернизации железа.

Быстро вырубить программу, перегружающую ОЗУ. Запас ОЗУ для SSH

Бывает такое, что даже при vm.swappiness=60 какому-то черту, как правило, браузеру, требуется очень много оперативной памяти, и система подвисает. Решается очень просто: сочетание клавиш Alt+SysRq(PrintScreen)+F заставляет oom_killer принудительно включиться и вырубить процесс, который на момент вызова занимает больше всего памяти. Строго 1 процесс на 1 вызов, и строго обязательно что-то будет убито. Если много раз подряд нажмете, то, скорее всего, перезапустится графическая сессия. Событие убиения процесса отражается в dmesg красным цветом.

Однако эта штука, называющаяся Magic SysRq, из коробки отключена в большинстве дистрибутивов, потому что непривилегированный пользователь может убить абсолютно любой процесс. За это отчечает параметр ядра kernel.sysrq , узнать его текущее значение можно так:

Для работы Alt+SysRq+F нужно kernel.sysrq=1. Для этого отредатируем параметры ядра, расположенные в файлах /etc/sysctl.conf (обычно симлинк на /etc/sysctl.d/99-sysctl.conf) и /etc/sysctl.d/*.conf. Лучше всего создать отдельный файл:

sudo nano /etc/sysctl.d/99-dumalogiya.conf

Нажмем Ctrl+O, Enter для сохранения.

В случае с браузером Chromium Alt+SysRq(PrintScreen)+F будет вырубать по одной вкладке, не закрывая сам браузер, что очень удобно.

Сочетания клавиш Magic SysRq перехватываются напрямую ядром Linux, поэтому работают даже когда из-за очереди процессора подвисает X-сервер.

Источник

Оцените статью