- Ограничить использование памяти для одного процесса Linux
- 5 ответов
- выставление ограничения на поедание памяти
- Re: выставление ограничения на поедание памяти
- Re: выставление ограничения на поедание памяти
- Re: выставление ограничения на поедание памяти
- Re: выставление ограничения на поедание памяти
- Re: выставление ограничения на поедание памяти
- Re: выставление ограничения на поедание памяти
- Re: выставление ограничения на поедание памяти
- Re: выставление ограничения на поедание памяти
- Re: выставление ограничения на поедание памяти
- 👈 Как ограничить время и использование памяти процессами в Linux
- Основное ограничение памяти (100 МБ виртуальной памяти):
- Основное ограничение времени процесса:
- Ограничение времени и памяти процесса
- Управление процессами в Linux
- Что такое процесс?
- Управление процессами в Linux
- Посмотреть запущенные процессы
- Поиск процессов в Linux
- Изменение приоритета процессов
- Завершение процессов в Linux
- Ограничение процессов
- Выводы
Ограничить использование памяти для одного процесса Linux
Я запускаю pdftoppm , чтобы преобразовать предоставленный пользователем PDF в изображение 300DPI. Это отлично работает, за исключением случаев, когда пользователь предоставляет PDF с очень большим размером страницы. pdftoppm выделяет достаточно памяти для хранения изображения 300DPI такого размера в памяти, что для 100-дюймовой квадратной страницы составляет 100 * 300 * 100 * 300 * 4 байта на пиксель = 3,5 ГБ. Злоумышленник может просто дать мне глупый PDF-файл и вызвать всевозможные проблемы.
Итак, что бы я хотел сделать, это установить какой-то жесткий лимит на использование памяти для дочернего процесса, который я собираюсь запустить — просто запустите процесс, если он попытается выделить больше, чем, скажем, 500 МБ Память. Возможно ли это?
Я не думаю, что для этого можно использовать ulimit, но есть ли однопроцессный эквивалент?
5 ответов
Есть проблемы с ulimit. Вот полезное чтение по теме: Ограничение времени и памяти для программы в Linux , что приводит к тайм-ауту , что позволяет вы привязываете процесс (и его вилки) по времени или потреблению памяти.
Для тайм-аута требуется установить Perl 5+ и файловую систему /proc . После этого вы копируете инструмент, например. /usr/local/bin :
После этого вы можете «привязать» свой процесс к потреблению памяти, как в своем вопросе, например:
В качестве альтернативы вы можете использовать -t и -x , чтобы соответственно ограничить процесс по времени или ограничениям на cpu.
Как работает этот инструмент, проверяя несколько раз в секунду, если порожденный процесс не превысил установленные границы. Это означает, что на самом деле есть небольшое окно, в котором процесс мог бы потенциально переподписываться перед уведомлениями о тайм-ауте и убивает процесс.
Более правильный подход, скорее всего, будет связан с группами, но это гораздо более важно для настройки, даже если вы будете использовать Docker или runC, которые, среди прочего, предлагают более удобную абстракцию вокруг групп.
Другой способ ограничить это — использовать контрольные группы Linux. Это особенно полезно, если вы хотите ограничить выделение (или группу процессов) процесса физической памятью из виртуальной памяти. Например:
создаст контрольную группу с именем myGroup , закроет набор процессов, выполняемых под myGroup, до 500 МБ физической памяти и до 5000 Мбайт свопа. Чтобы запустить процесс в группе управления:
Обратите внимание, что в современном дистрибутиве Ubuntu этот пример требует установки пакета cgroup-bin и редактирования /etc/default/grub для изменения GRUB_CMDLINE_LINUX_DEFAULT to:
, а затем запустите sudo update-grub и перезагрузитесь для загрузки с новыми параметрами загрузки ядра.
Если ваш процесс не порождает больше детей, которые потребляют большую часть памяти, вы можете использовать setrlimit . Более общий пользовательский интерфейс для этого заключается в использовании команды ulimit оболочки:
Это ограничит только «виртуальную» память вашего процесса, принимая во внимание «и ограничивая» память, в которой процесс, вызываемый совместно с другими процессами, и память, отображаемая, но не зарезервированная (например, большая куча Java) , Тем не менее, виртуальная память является ближайшим приближением для процессов, которые растут очень большими, делая указанные ошибки несущественными.
Если ваша программа порождает детей, а именно они выделяют память, она становится более сложной, и вы должны писать вспомогательные скрипты для запуска процессов под вашим контролем. Я написал в своем блоге почему и как .
В дополнение к инструментам из daemontools , предложенным Марком Джонсоном, вы также можете рассмотреть chpst , который находится в runit . Сам Runit находится в busybox , поэтому вы, возможно, уже установили его.
-m байт ограничить память. Ограничьте сегмент данных, сегмент стека, заблокированные физические страницы и общее количество всего сегмента за процесс до байтов байтов каждая.
Я использую приведенный ниже скрипт, который отлично работает. Он использует группы через cgmanager . Обновление: теперь он использует команды из cgroup-tools . Назовите этот скрипт limitmem и поместите его в свой $ PATH, и вы можете использовать его как limitmem . Это ограничит использование памяти и свопа. Чтобы ограничить только память, удалите строку с помощью limitmem 100M bash .
Источник
выставление ограничения на поедание памяти
Где-то слышал, что такое возможно. открыл один из сайтов в Opera. Сначала проц работал с минуту на всю катушку. затем стремительно съелась вся память и начал жраться своп. затем, все просто остановилось. лишь, жесткий диск работает. сделать уже с час ничего не возможно. ни добраться к консоли, что бы убить процесс, ни ctrl+alt+backspace. полный тормоз. как предупредить такое?
почему под Linux такая философия? а если дома обычный пользователь?
Debian Etch r3
linu-2.6.18
просьба отвечать без приколов и плевков
Re: выставление ограничения на поедание памяти
Re: выставление ограничения на поедание памяти
>Где-то слышал, что такое возможно.
>просьба отвечать без приколов и плевков
Не получится, уходи сам
Re: выставление ограничения на поедание памяти
man limits.conf
Нет записи руководства для limits.conf
Re: выставление ограничения на поедание памяти
а перезапускать что-либо нужно, если и создать такой файл в debian’е?
Re: выставление ограничения на поедание памяти
поставить правильное значение overcommit (sysctl vm.overcommit_memory=2), включить swap. почитать man ulimit.
Re: выставление ограничения на поедание памяти
Re: выставление ограничения на поедание памяти
overcommit (sysctl vm.overcommit_memory=2)
bash: syntax error near unexpected token `sysctl’
не получается так
точно именно так нужно?
Re: выставление ограничения на поедание памяти
Перелогиниться. То есть, желательно, убить иксы, и все консольные сессии. После чего лимиты должны вступить в силу.
Re: выставление ограничения на поедание памяти
«core
limits the core file size (KB)
data
maximum data size (KB)
fsize
maximum filesize (KB)
memlock
maximum locked-in-memory address space (KB)
nofile
maximum number of open files
rss
maximum resident set size (KB)
stack
maximum stack size (KB)
cpu
maximum CPU time (minutes)
nproc
maximum number of processes
as
address space limit
maxlogins
maximum number of logins for this user
maxsyslogins
maximum number of logins on system
priority
the priority to run user process with (negative values boost process priority)
locks
maximum locked files (Linux 2.4 and higher)
sigpending
maximum number of pending signals (Linux 2.6 and higher)
msqqueue
maximum memory used by POSIX message queues (bytes) (Linux 2.6 and higher)
nice
maximum nice priority allowed to raise to (Linux 2.6.12 and higher)
rtprio»
Источник
👈 Как ограничить время и использование памяти процессами в Linux
Скрипт тайм-аута – это полезная программа для мониторинга ресурсов, предназначенная для ограничения потребления времени и памяти процессами в Linux.
Он позволяет вам запускать программы под контролем и применять ограничения по времени и памяти, прерывая работу программы при нарушении этих параметров.
Никакой установки не требуется, просто выполните команду вместе с ее аргументами, используя программу timeout, и он будет отслеживать потребление памяти и время выполнения команды, прерывая процесс, если он выходит за пределы, и уведомляет вас с помощью предварительно определенного сообщения.
Для запуска этого скрипта у вас должен быть установлен Perl 5 в вашей системе Linux и смонтирована файловая система /proc.
Чтобы проверить установленную версию Perl в вашей системе Linux, выполните следующую команду.
Затем клонируйте репозиторий timeout в вашу систему с помощью команды git, затем перейдите в локальный репозиторий с помощью команды cd и вызовите его как обычную команду Linux.
Давайте теперь посмотрим, как работает скрипт timeout.
Основное ограничение памяти (100 МБ виртуальной памяти):
В этом первом примере показано, как ограничить использование памяти процессом до 100 МБ виртуальной памяти, используя флаг -m.
По умолчанию для памяти используется единица измерения в килобайтах.
Здесь команда stress-ng запускает 4 стрессора виртуальной памяти (VMS), которые в совокупности используют 40% доступной памяти в течение 10 минут.
Таким образом, каждый стрессор использует 10% доступной памяти.
Учитывая вывод команды timeout, описанной выше, рабочие процессы stress-ng были прерваны всего через 1,16 секунды.
Это связано с тем, что совокупное потребление памяти VMS (438660 килобайт) превышает допустимое использование виртуальной памяти для stress-ng и его дочерних процессов.
Основное ограничение времени процесса:
Чтобы включить ограничение времени процесса, используйте флаг -t, как показано далее.
Ограничение времени и памяти процесса
Вы также можете одновременно ограничить память и время следующим образом.
Timeout также поддерживает некоторые дополнительные параметры, такие как –detect-hangups, который позволяет обнаружение зависания.
Вы можете контролировать лимит памяти RSS (resident set size), используя ключ –memlimit-rss или -s.
Кроме того, чтобы вернуть код завершения или сигнал + 128 процесса, используйте параметр –confess или -c, как показано далее.
Источник
Управление процессами в Linux
Как вы думаете, операционная система Linux может автоматически позаботиться сама о себе? Когда работает все нормально или вам не нужны никакие нестандартные возможности — вполне да. Но иногда может понадобиться ваше вмешательство в ее работу.
В Linux для каждой отдельной программы, при ее запуске создается процесс. Неважно запускаете программу вы вручную самостоятельно или это делает система или ядро. Например, программа инициализации, которая запускается сразу после завершения загрузки ядра тоже имеет свой процесс с идентификатором 0. Процессы в linux можно описать как контейнеры, в которых хранится вся информация о состоянии и выполнении программы. Если программа работает хорошо, то все нормально, но если она зависла или вам нужно настроить ее работу может понадобиться управление процессами в Linux.
В этой статье будет затронута обширная тема, мы рассмотрим такие возможности:
- Просмотр запущенных процессов
- Просмотр информации о процессах
- Поиск процессов в Linux
- Изменение приоритета процессов
- Завершение процессов
- Ограничение памяти доступной процессу
Я не мог не включить в статью первые пункты, но они очень просты и мы не будем разбирать их очень подробно. Но вот все остальное может показаться сложным и недостаточно описанным.
Что такое процесс?
Начнем с того, что разберемся в терминах. По сути, процесс — это каждая программа. Как я уже говорил для каждой запускаемой программы создается отдельный процесс. В рамках процесса программе выделяется процессорное время, оперативная память и другие системные ресурсы. У каждого процесса есть свой идентификатор, Proccess ID или просто PID, по ним, чаще всего и определяются процессы Linux. PID определяется неслучайно, как я уже говорил, программа инициализации получает PID 1, а каждая следующая запущенная программа — на единицу больше. Таким образом PID пользовательских программ доходит уже до нескольких тысяч.
На самом деле, процессы Linux не настолько абстрактны, какими они вам сейчас кажутся. Их вполне можно попытаться пощупать. Откройте ваш файловый менеджер, перейдите в корневой каталог, затем откройте папку /proc. Видите здесь кучу номеров? Так вот это все — PID всех запущенных процессов. В каждой из этих папок находится вся информация о процессе.
Например, посмотрим папку процесса 1. В папке есть другие под каталоги и много файлов. Файл cmdline содержит информацию о команде запуска процесса:
Поскольку у меня используется система инициализации Systemd, то и первый процесс запускается для нее. С помощью каталога /proc можно сделать все. Но это очень неудобно, особенно учитывая количество запущенных процессов в системе. Поэтому для реализации нужных задач существуют специальные утилиты. Перейдем к рассмотрению утилит, которые позволяют реализовать управление процессами в Linux.
Управление процессами в Linux
В Linux есть очень большое количество утилит для решения различных задач по управлению процессами. Это и такие многофункциональные решения, как htop, top, а также простые утилиты, например, ps, kill, killall, who и т д. Я не буду рассматривать в этой статье графические утилиты, и top тоже рассматривать не буду. Первое потому что слишком просто, второе — потому что htop лучше. Мы остановимся на работе с программой htop и ее аналогами в форме утилит в стиле GNU, одна утилита — одна функция.
Давайте установим htop, если она у вас еще не установлена. В Ubuntu это делается так:
sudo apt install htop
В других дистрибутивах вам нужно просто использовать свой менеджер пакетов. Имя пакета такое же.
Посмотреть запущенные процессы
Это очень простая задача, и также просто она решается. Для этого существует множество утилит, начиная от обычной ps, до более продвинутых интерактивных top, htop и так далее.
Открыв htop, мы сразу видим список запущенных процессов. Конечно, здесь отображены не все процессы linux, их-то в системе очень много, вы уже знаете, все они на один экран не поместятся. По умолчанию выводятся процессы, запущенные от имени вашего пользователя:
Вы можете увидеть такую информацию о процессе:
- PID — идентификатор процесса
- USER — пользователь, от которого был запущен процесс
- PRI — приоритет процесса linux на уровне ядра (обычно NI+20)
- NI — приоритет выполнения процесса от -20 до 19
- S — состояние процесса
- CPU — используемые ресурсы процессора
- MEM — использованная память
- TIME — время работы процесса
К отображению можно добавить и дополнительные параметры, но эти главные. Добавить параметры можно с помощью меню Setup. Там все очень просто, читайте подсказки и следуйте указаниям. Например, добавлен параметр PPID:
Очень важной особенностью программы есть то, что вы можете сортировать процессы в Linux по нужному параметру. Просто кликните по названию параметра, оно выделится зеленым и будет выполнена сортировка. Например, хотите посмотреть в каком порядке запускались процессы, сортируем по PID:
Также есть интересная возможность разместить процессы в виде дерева. Вы сможете увидеть, каким процессом был запущен тот или иной процесс. Для отображения дерева нажмите кнопку F5:
Почти те же действия вы можете выполнять с помощью программы ps. Только здесь нет такого удобного интерактивного режима. Все делается с помощью опций.
Рассмотрим основные опции, которые будем использовать:
- -e — вывести информацию обо всех процессах
- -a — вывести информацию обо всех наиболее часто запрашиваемых процессах
- -t — показывать только процессы из этого терминала
- -p — показывать информацию только об указанном процессе
- -u — показывать процессы только определенного пользователя
Одним словом, чтобы посмотреть все активные на данный момент процессы в linux, используется сочетание опций aux:
Программа показывает все те же параметры, только здесь нет интерактивного интерфейса. Думаете здесь нельзя отсортировать процессы, но ошибаетесь, можно. Для этого есть опция sort. Вы можете сортировать их по любому полю, например:
Список будет отсортирован в обратном порядке, внизу значения больше, вверху — меньше. Если нужно в обратном порядке, добавьте минус:
В качестве поля для сортировки могут быть использованы приоритеты процессов Linux или любые другие параметры. Также вы можете обрезать вывод, если не нужно выводить всю информацию:
Казалось бы, у ps нет возможности стоить деревья процессов. Но не совсем, для этого существует отдельная команда:
Поиск процессов в Linux
Список процессов, это хорошо. Но иногда, когда какой-нибудь процесс завис и нужно убить процесс Linux или нам нужно провести с ним какие-либо действия, нужно выделить этот процесс из списка, узнать его PID и информацию о нем.
Чтобы найти процесс linux в htop можно использовать кнопку F3. Нажмите F3 и наберите нужное слово. Дальше чтобы перейти к следующему вхождению нажимайте F2 или Esc для завершения поиска:
Для поиска процессов в htop можно использовать также фильтр htop. Нажмите F4, введите слово и будут выведены только процессы linux, имя которых включает это слово.
В утилите ps фильтрации нет, но зато мы можем использовать утилиту grep, перенаправив вывод ps на нее чтобы найти процесс linux:
ps aux | grep chromium
Это очень часто употребляемая команда.
Изменение приоритета процессов
Приоритет процесса linux означает, насколько больше процессорного времени будет отдано этому процессу по сравнению с другими. Так мы можем очень тонко настроить какая программа будет работать быстрее, а какая медленнее. Значение приоритета может колебаться от 19 (минимальный приоритет) до -20 — максимальный приоритет процесса linux. Причем, уменьшать приоритет можно с правами обычного пользователя, но чтобы его увеличить нужны права суперпользователя.
В htop для управления приоритетом используется параметр Nice. Напомню, что Priv, это всего лишь поправка, она в большинстве случаев больше за Nice на 20. Чтобы изменить приоритет процесса просто установите на него курсор и нажимайте F7 для уменьшения числа (увеличения приоритета) или F8 — для увеличения числа.
Но и для решения этой задачи управления процессами Linux необязательно использовать htop. Вы можете сделать все и другими командами. Например, команда nice. С помощью нее вы можете указать приоритет для запускаемого процесса:
nice -n 10 apt-get upgrade
Или изменить приоритет для уже существующего по его pid:
renice -n 10 -p 1343
Завершение процессов в Linux
Если процесс завис и не отвечает, его необходимо завершить. В htop, чтобы убить процесс Linux, просто установите курсор на процесс и нажмите F9:
Система для управления процессами использует определенные сигналы, есть сигналы, которые указывают процессу завершиться. Вот несколько основных сигналов:
- SIGTERM — попросить процесс сохранить данные и завершится
- SIGKILL — завершить процесс немедленно, без сохранения
Вообще сигналов есть несколько десятков, но мы не будем их рассматривать. Отправим сигнал SIGKILL:
Также можно воспользоваться утилитой kill:
Также можно уничтожить процесс по имени:
Ограничение процессов
Управление процессами в Linux позволяет контролировать практически все. Вы уже видели что можно сделать, но можно еще больше. С помощью команды ulimit и конфигурационного файла /etc/security/limits.conf вы можете ограничить процессам доступ к системным ресурсам, таким как память, файлы и процессор. Например, вы можете ограничить память процесса Linux, количество файлов и т д.
Запись в файле имеет следующий вид:
- домен — имя пользователя, группы или UID
- тип — вид ограничений — soft или hard
- элемент — ресурс который будет ограничен
- значение — необходимый предел
Жесткие ограничения устанавливаются суперпользователем и не могут быть изменены обычными пользователями. Мягкие, soft ограничения могут меняться пользователями с помощью команды ulimit.
Рассмотрим основные ограничения, которые можно применить к процессам:
- nofile — максимальное количество открытых файлов
- as — максимальное количество оперативной памяти
- stack — максимальный размер стека
- cpu — максимальное процессорное время
- nproc — максимальное количество ядер процессора
- locks — количество заблокированных файлов
- nice — максимальный приоритет процесса
Например, ограничим процессорное время для процессов пользователя sergiy:
sergiy hard nproc 20
Посмотреть ограничения для определенного процесса вы можете в папке proc:
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 204800 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 23562 23562 processes
Max open files 1024 4096 files
Max locked memory 18446744073708503040 18446744073708503040 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 23562 23562 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
Ограничения, измененные, таким образом вступят в силу после перезагрузки. Но мы можем и устанавливать ограничения для текущего командного интерпретатора и создаваемых им процессов с помощью команды ulimit.
Вот опции команды:
- -S — мягкое ограничение
- -H — жесткое ограничение
- -a — вывести всю информацию
- -f — максимальный размер создаваемых файлов
- -n — максимальное количество открытых файлов
- -s — максимальный размер стека
- -t — максимальное количество процессорного времени
- -u — максимальное количество запущенных процессов
- -v — максимальный объем виртуальной памяти
Например, мы можем установить новое ограничение для количества открываемых файлов:
Установим лимит оперативной памяти:
ulimit -Sv 500000
Напоминаю, что это ограничение будет актуально для всех программ, выполняемых в этом терминале.
Выводы
Вот и все. Теперь управление процессами в Linux не вызовет у вас проблем. Мы рассмотрели очень даже подробно эту тему. Если у вас остались вопросы или есть предложения по дополнению статьи, пишите в комментариях!
Источник