Ограничение потребления ресурсов процессов в Unix: различия между версиями
Vix (обсуждение | вклад) Нет описания правки |
Vix (обсуждение | вклад) Нет описания правки |
||
Строка 5: | Строка 5: | ||
'''systemd-run''' - это системный менеджер и менеджер служб, доступный напрямую в большинстве дистрибутивов Linux. Он занимается запуском процессов, служб и демонов. Этот инструмент позволяет нам добавлять ограничения непосредственно к конкретному процессу, который мы хотим запустить. | '''systemd-run''' - это системный менеджер и менеджер служб, доступный напрямую в большинстве дистрибутивов Linux. Он занимается запуском процессов, служб и демонов. Этот инструмент позволяет нам добавлять ограничения непосредственно к конкретному процессу, который мы хотим запустить. | ||
* Например, мы можем запустить процесс с ограничением в 1 ГБ оперативной памяти: | * Например, мы можем запустить процесс с ограничением в 1 ГБ оперативной памяти: | ||
systemd-run --scope -p MemoryLimit=1000M ./myProcess.sh | $ systemd-run --scope -p MemoryLimit=1000M ./myProcess.sh | ||
Здесь, '''myProcess.sh''' был запущен с помощью systemd-run и может обращаться только к указанной оперативной памяти. | Здесь, '''myProcess.sh''' был запущен с помощью systemd-run и может обращаться только к указанной оперативной памяти. | ||
* Мы также можем использовать это, чтобы заставить процесс использовать только максимальный процент процессора: | * Мы также можем использовать это, чтобы заставить процесс использовать только максимальный процент процессора: | ||
systemd-run --scope -p CPUQuota=10% ./myProcess.sh | $ systemd-run --scope -p CPUQuota=10% ./myProcess.sh | ||
* '''systemd-run''' позволяет нам сочетать ограничение как процессора, так и памяти: | * '''systemd-run''' позволяет нам сочетать ограничение как процессора, так и памяти: | ||
systemd-run --scope -p MemoryLimit=1000M -p CPUQuota=10% ./myProcess.sh | $ systemd-run --scope -p MemoryLimit=1000M -p CPUQuota=10% ./myProcess.sh | ||
'''3. Использование ulimit''' | '''3. Использование ulimit''' | ||
Строка 21: | Строка 21: | ||
* Давайте установим мягкое ограничение в '''1ГБ''' оперативной памяти для нашего текущего пользователя: | * Давайте установим мягкое ограничение в '''1ГБ''' оперативной памяти для нашего текущего пользователя: | ||
ulimit -Sv 1000000 | $ ulimit -Sv 1000000 | ||
Теперь любой запущенный нами процесс сможет использовать только '''1ГБ''' оперативной памяти. Это ограничение повлияет на все запускаемые нами процессы в будущем, но мы можем изменить его перед запуском следующего процесса, если пожелаем. | Теперь любой запущенный нами процесс сможет использовать только '''1ГБ''' оперативной памяти. Это ограничение повлияет на все запускаемые нами процессы в будущем, но мы можем изменить его перед запуском следующего процесса, если пожелаем. | ||
* С помощью '''ulimit''' мы также можем добавить ограничения на максимальный размер файла, создаваемого процессом, тем самым ограничивая используемое дисковое пространство: | * С помощью '''ulimit''' мы также можем добавить ограничения на максимальный размер файла, создаваемого процессом, тем самым ограничивая используемое дисковое пространство: | ||
ulimit -Sf 2000 | $ ulimit -Sf 2000 | ||
Теперь все процессы, запускаемые нашим пользователем, будут способны создавать или копировать файлы только с максимальным размером 2 МБ. Следует отметить, что это ограничение распространяется на каждый файл. | Теперь все процессы, запускаемые нашим пользователем, будут способны создавать или копировать файлы только с максимальным размером 2 МБ. Следует отметить, что это ограничение распространяется на каждый файл. | ||
* Мы также можем комбинировать ограничения: | * Мы также можем комбинировать ограничения: | ||
ulimit -Sv 1000000 -Sf 2000 && ./myProcess.sh | $ ulimit -Sv 1000000 -Sf 2000 && ./myProcess.sh | ||
Здесь мы установили мягкие ограничения на оперативную память и размер файла и сразу же запустили '''myProcess.sh'''. | Здесь мы установили мягкие ограничения на оперативную память и размер файла и сразу же запустили '''myProcess.sh'''. | ||
Строка 36: | Строка 36: | ||
Обычно мы указываем ограничение для '''ulimit''' численно. Однако для сброса ограничений '''ulimit''' мы можем использовать ключевое слово '''unlimited''' . | Обычно мы указываем ограничение для '''ulimit''' численно. Однако для сброса ограничений '''ulimit''' мы можем использовать ключевое слово '''unlimited''' . | ||
* Давайте представим, что мы установили некоторые ограничения: | * Давайте представим, что мы установили некоторые ограничения: | ||
$ ulimit -Sv 1000000 -Sf 2000 | |||
$ ulimit -a | |||
... | |||
file size (blocks, -f) 2000 | |||
... | |||
virtual memory (kbytes, -v) 1000000 | |||
... | |||
* Чтобы устранить их, мы устанавливаем вместо них неограниченный лимит: | |||
$ ulimit -Sv unlimited -Sf unlimited | |||
$ ulimit -a | |||
... | |||
file size (blocks, -f) unlimited | |||
... | |||
virtual memory (kbytes, -v) unlimited | |||
... | |||
'''4. Использование cpulimit''' | |||
может ограничить использование ЦП новыми или существующими процессамиcpulimit. Этот инструмент обычно доступен в Ubuntu. | |||
* Если мы используем другой дистрибутив, нам может потребоваться получить его: | |||
$ sudo apt-get install cpulimit | |||
'''4.1. Как использовать это в новом процессе''' | |||
* Мы можем напрямую запускать новые процессы с примененным ограничением ЦП: | |||
$ cpulimit -l 20 firefox | |||
Process 5202 detected | |||
Здесь мы запустили новый процесс – браузер Firefox - с ограничением процессора в 20%. |
Версия от 17:45, 7 февраля 2025
1. Обзор Запуск нескольких процессов в наших системах Linux требует от них совместного использования ресурсов, таких как центральный процессор, оперативная память и дисковое пространство. Чтобы избежать зависания ресурсоемких процессов, приводящих к зависанию системы, мы можем пожелать ограничить ресурсы, потребляемые другими процессами. В этом руководстве мы узнаем, как добавить ограничения в отношении процессора, оперативной памяти и дискового пространства. Мы будем использовать такие команды, как ulimit, cgroups, systemd-run, ionice, и nice. В некоторых случаях для выполнения этих команд потребуются разрешения суперпользователя.
2. Использование systemd-run systemd-run - это системный менеджер и менеджер служб, доступный напрямую в большинстве дистрибутивов Linux. Он занимается запуском процессов, служб и демонов. Этот инструмент позволяет нам добавлять ограничения непосредственно к конкретному процессу, который мы хотим запустить.
- Например, мы можем запустить процесс с ограничением в 1 ГБ оперативной памяти:
$ systemd-run --scope -p MemoryLimit=1000M ./myProcess.sh
Здесь, myProcess.sh был запущен с помощью systemd-run и может обращаться только к указанной оперативной памяти.
- Мы также можем использовать это, чтобы заставить процесс использовать только максимальный процент процессора:
$ systemd-run --scope -p CPUQuota=10% ./myProcess.sh
- systemd-run позволяет нам сочетать ограничение как процессора, так и памяти:
$ systemd-run --scope -p MemoryLimit=1000M -p CPUQuota=10% ./myProcess.sh
3. Использование ulimit ulimit позволяет нам перезаписывать или создавать ограничения на оперативную память и дисковое пространство. Это встроенная функция оболочки bash.
3.1 Жесткие и мягкие ограничения Для всех пользователей в системе существует жесткое ограничение, устанавливаемое администратором. Затем существует мягкое ограничение, которое каждый пользователь может установить самостоятельно. Эти ограничения остаются в силе до тех пор, пока их не изменят.
- Давайте установим мягкое ограничение в 1ГБ оперативной памяти для нашего текущего пользователя:
$ ulimit -Sv 1000000
Теперь любой запущенный нами процесс сможет использовать только 1ГБ оперативной памяти. Это ограничение повлияет на все запускаемые нами процессы в будущем, но мы можем изменить его перед запуском следующего процесса, если пожелаем.
- С помощью ulimit мы также можем добавить ограничения на максимальный размер файла, создаваемого процессом, тем самым ограничивая используемое дисковое пространство:
$ ulimit -Sf 2000
Теперь все процессы, запускаемые нашим пользователем, будут способны создавать или копировать файлы только с максимальным размером 2 МБ. Следует отметить, что это ограничение распространяется на каждый файл.
- Мы также можем комбинировать ограничения:
$ ulimit -Sv 1000000 -Sf 2000 && ./myProcess.sh
Здесь мы установили мягкие ограничения на оперативную память и размер файла и сразу же запустили myProcess.sh.
3.2 Как отменить ограничения, установленные с помощью ulimit
Любой пользователь может изменить свое мягкое ограничение. Однако общие жесткие ограничения по-прежнему имеют приоритет. Однако изменить жесткое ограничение может только администратор.
Обычно мы указываем ограничение для ulimit численно. Однако для сброса ограничений ulimit мы можем использовать ключевое слово unlimited .
- Давайте представим, что мы установили некоторые ограничения:
$ ulimit -Sv 1000000 -Sf 2000 $ ulimit -a ... file size (blocks, -f) 2000 ... virtual memory (kbytes, -v) 1000000 ...
- Чтобы устранить их, мы устанавливаем вместо них неограниченный лимит:
$ ulimit -Sv unlimited -Sf unlimited $ ulimit -a ... file size (blocks, -f) unlimited ... virtual memory (kbytes, -v) unlimited ...
4. Использование cpulimit может ограничить использование ЦП новыми или существующими процессамиcpulimit. Этот инструмент обычно доступен в Ubuntu.
- Если мы используем другой дистрибутив, нам может потребоваться получить его:
$ sudo apt-get install cpulimit
4.1. Как использовать это в новом процессе
- Мы можем напрямую запускать новые процессы с примененным ограничением ЦП:
$ cpulimit -l 20 firefox Process 5202 detected
Здесь мы запустили новый процесс – браузер Firefox - с ограничением процессора в 20%.