Библиотека сайта rus-linux.net
Изучаем команды Linux: nice и renice
Оригинал: Learning Linux Commands: nice & reniceАвтор: Rares Aioanei
Дата публикации: 30 марта 2012 года
Перевод: А. Кривошей
Дата перевода: январь 2013 г.
1. Введение
Возможность для пользователя задавать значение приоритета его собственных процессов определяет ваше отношение к другим пользователям системы. Даете ли вы им возможность использовать поцессор или просто злоупотребляете системными ресурсами без достаточных оснований? В этой статье вы узнаете, как управлять процессами в плане потребления ими ресурсов процессора и изменения приоритета ваших процессов, используя команды nice и renice. Мы начнем с азов теории, поговорим о том, что такое процесс, планирование, как создать дочерний процесс. Затем мы перейдем к команде nice и узнаем, как изменить значение приоритета процесса.
2. Что такое процесс
Простыми словами процесс - это соглашение об именовании, используемое в Linux для обозначения роли запущенной программы. Процесс - это набор правил, которым руководствуется данная программа при использовании выделенного процессорного времени, памяти и ресурсов ввода/вывода. Каждый процесс, запущенный в системе Linux, имеет свой ID (PID), по которому его можно отслеживать.
Ядро Linux позволяет собирать различную информацию о каждом процессе, которая включает, но не ограничивается:
- статус процесса ( работает, спит, зомби или остановлен)
- приоритет выполнения процесса
- информация об используемых ресурсах
- владелец процесса
- сетевые порты и файлы, открытые процессом
- и так далее...
Итак, теперь мы кое-что знаем процессах и можем продвинуться дальше и создать какой-нибудь процесс. Чтобы сделать это, просто откройте терминал и выполните команду yes в фоне, перенаправив ее вывод в /dev/null:
$ yes > /dev/null & [1] 5997
После это воспользуемся командой ps -l, чтобы извлечь информацию о нашем процессе:
$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 5830 3283 0 80 0 - 6412 wait pts/0 00:00:00 bash 0 R 1000 5997 5830 99 80 0 - 1757 - pts/0 00:00:09 yes 0 R 1000 5998 5830 0 80 0 - 2399 - pts/0 00:00:00 ps
Из этой таблицы мы можем узнать немало интересного:
F - FLAG: процесс запущен без привилегий суперпользователя. В противном случае мы могли бы увидеть число 4 или сумму 1 и 4. Подробности можно узнать, посмотрев man-страницу ps.
S - STATE: процесс в настоящее время работает.
UID - ID пользователя, инициализировавшего процесс. UID на самом деле является алиасом EUID (Effective User ID)
PID - ID процесса нашей команды yes 5997.
PPID - Parent Process ID. Это ID родительского для нашей команды yes процесса. В нашем случае это bash с PID 5830.
C - загрузка процессора, целое число, выражается в %.
PRI - Приоритет процесса. Большее значение означает меньший приоритет.
NI - Значение Nice, которое находится в диапазоне от -20 до 19. Большее значение означает меньший приоритет.
2.1. Планирование процессов
Если вы не хотите слишком глубоко вникать в детали планирования и приоритета процессов, то можете пропустить этот раздел. Здесь мы сосредоточимся на описании процессов в Linux и попытаемся обобщить некоторые моменты, так как подробное описание их может занять множество страниц.
С нашей точки зрения необходимо понимать, что принцип работы планировщика Linux (для ядра версии >= 2.6) вытесняющий. Под этим понимается способность ядра выбирать среди всех заданий то, которое имеет наивысший приоритет. Далее, ядро делит списки приоритета на задачи реального времени и пользовательские задания, ранжирующиеся от 1 - 100 и 101 - 140 соответственно.
Далее, ядро Linux выделяет задачам с более высоким приоритетом больший квант времени, а задачам с меньшим приоритетам - меньший квант времени, который в среднем составляет 200 и 10 мс соответственно. Другими словами, каждое задание допускается к выполнению только, если у него остается какая-либо часть времени. Поэтому меньший отрезок времени для выполнения означает, что процесс получает меньше времени в очереди выполнения и, соответственно, получает меньше ресурсов. Когда отрезок времени процесса заканчивается, он помещается в очередь выполнения с истекшим временем, затем его приоритет пересчитывается, и он снова помещается в активную очередь выполнения. Эта зависимость иллюстрируется приведенной здесь диаграммой. Важно помнить, что обе очереди выполнения содержат списки задач, отсортированных по их приоритету.
2.2. Жизненный цикл процесса
Основной принцип управления процессами в Linux включает две важные операции, создающие новый процесс. Операция, при которой процесс копирует себя, и тем самым создает новый процесс с уникальным ID, осуществляется при помощи вызова fork(). За ней часто следует операция exec(), запускающая новую программу. Первый процесс, создающийся при загрузке системы, называется init, он всегда получает PID 1. Все остальные процессы считаются дочерними по отношению к процессу init. В нормальных условиях перед завершением дочернего процесса требуется, чтобы родительский процесс послал ему значение exit. При успешном завершении процесса он отправляет родительскому процессу значение 0. Если по каким-либо причинам дочерний процесс пережил родительский, init отмечает его как не имеющий родителей.
3. Использование команды nice
Так как мощь процессоров на протяжении многих лет возрастает в геометрической прогрессии, соответственно уменьшается важность команды nice. В результате сегодня редко приходится вручную изменять приоритет процессов. Тем не менее, такая возможность имеется и она может быть полезной в некоторых ситуациях. По умолчанию nice устанавливает значение приоритета 10.
$ nice yes > /dev/null & [1] 5199 $ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 3383 3380 0 80 0 - 6445 wait pts/0 00:00:00 bash 0 R 1000 5199 3383 99 90 10 - 1757 - pts/0 00:00:07 yes 0 R 1000 5200 3383 0 80 0 - 2399 - pts/0 00:00:00 ps
Чтобы запустить процесс со значением nice, отличным от 10, можно использовать ключ -n.
$ nice -n 15 yes > /dev/null &
или
$ nice -15 yes > /dev/null & [1] 5270 $ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 3383 3380 0 80 0 - 6447 wait pts/0 00:00:00 bash 0 R 1000 5270 3383 99 95 15 - 1757 - pts/0 00:00:02 yes 0 R 1000 5271 3383 0 80 0 - 2399 - pts/0 00:00:00 ps
Чтобы установить значение nice ниже нуля, требуются права суперпользователя. В противном случае будет установлено значение 0. Ниже мы пробуем задать значение nice -1 без прав root:
$ $ nice -n -1 yes > /dev/null & [1] 5285 nice: cannot set niceness: Permission denied $ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 3383 3380 0 80 0 - 6447 wait pts/0 00:00:00 bash 0 R 1000 5285 3383 95 80 0 - 1757 - pts/0 00:00:07 yes 0 R 1000 5295 3383 0 80 0 - 2399 - pts/0 00:00:00 ps
Поэтому, чтобы задать значение nice меньше 0, необходимо запускать программу как root, или использовать sudo.
# nice -n -1 yes > /dev/null & [1] 5537 # ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 5428 3383 0 80 0 - 14430 wait pts/0 00:00:00 su 0 S 0 5436 5428 1 80 0 - 7351 wait pts/0 00:00:00 bash 4 R 0 5537 5436 87 79 -1 - 1757 - pts/0 00:00:04 yes 4 R 0 5538 5436 0 80 0 - 2399 - pts/0 00:00:00 ps
4. Использование команды renice
В предыдущем разделе мы узнали, как запускать программу с заданным значением nice. Теперь мы попробуем изменить значение nice у запущенной программы с помощью команды renice. Итак, у нас есть работающая программа yes со значением nice 10:
$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 3383 3380 0 80 0 - 6447 wait pts/0 00:00:00 bash 0 R 1000 5645 3383 99 90 10 - 1757 - pts/0 00:00:04 yes 0 R 1000 5646 3383 0 80 0 - 2399 - pts/0 00:00:00 ps
Чтобы изменить его значение, мы можем использовать команду renice со значением nice и PID процесса. Давайте изменим значение nice на 15:
$ renice -n 15 -p 5645 5645 (process ID) old priority 10, new priority 15 $ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 3383 3380 0 80 0 - 6447 wait pts/0 00:00:00 bash 0 R 1000 5645 3383 99 95 15 - 1757 - pts/0 00:00:31 yes 0 R 1000 5656 3383 0 80 0 - 2399 - pts/0 00:00:00 ps
Согласно правилам, обычный пользователь может только увеличивать значение nice (уменьшать приоритет) любого процесса. Если попробовать изменить значение nice с 15 до 10, мы получим следующее сообщение об ошибке:
$ renice -n 10 -p 5645 renice: failed to set priority for 5645 (process ID): Permission denied
Также, команда renice позволяет суперпользователю изменять значение nice процессов любого пользователя. Это делается с помощью ключа -u. Следующая команда изменяет значение приоритета всех процессов пользователя на -19:
# renice -n -19 -u lubos 1000 (user ID) old priority 0, new priority -19
5. Заключение
Команда nice может быть удобным инструментом и она очень проста в использовании. Пожалуйста, отметьте, что для изменения значения приоритета также может использоваться команда top.