Наши партнеры

UnixForum




1с склад купить | документооборот 1с

Библиотека сайта 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.