Библиотека сайта rus-linux.net
Администрирование систем Linux. Приоритеты процессов
Оригинал: Process prioritiesАвтор: Paul Cobbaut
Дата публикации: 12 марта 2015 г.
Перевод: A. Панин
Дата перевода: 28 марта 2015 г.
Глава 2. Приоритеты процессов
2.1. Приоритеты процессов и значения nice
2.1.1. Введение
Все процессы в системе имеют соответствующие приоритеты
и значения nice
. Процессы с более высокими приоритетами будут получать больше процессорного времени
, нежели остальные процессы с низкими приоритетами. Вы можете повлиять на распределение процессорного времени, воспользовавшись утилитами nice
и renice
.
2.1.2. Именованные программные каналы (утилита mkfifo)
Процессы могут обмениваться информацией друг с другом посредством именованных программных каналов
. Эти именованные программные каналы могут создаваться с помощью утилиты mkfifo
.
В примере ниже показана процедура создания четырех отдельных именованных программных каналов (в новой директории).
paul@ubuntu910:~$ mkdir procs paul@ubuntu910:~$ cd procs/ paul@ubuntu910:~/procs$ mkfifo pipe33a pipe33b pipe42a pipe42b paul@ubuntu910:~/procs$ ls -l итого 0 prw-r--r-- 1 paul paul 0 2010-04-12 13:21 pipe33a prw-r--r-- 1 paul paul 0 2010-04-12 13:21 pipe33b prw-r--r-- 1 paul paul 0 2010-04-12 13:21 pipe42a prw-r--r-- 1 paul paul 0 2010-04-12 13:21 pipe42b paul@ubuntu910:~/procs$
2.1.3. Увлекательные манипуляции с утилитой cat
Для демонстрации методики использования утилит top
и renice
мы будем применять комбинацию из утилиты cat
и созданных ранее именованных программных каналов
с целью полного исчерпания вычислительных ресурсов центрального процессора
.
Бинарный файл cat
должен быть скопирован в текущую директорию с отличным именем. (Это позволит нам достаточно просто отслеживать созданные процессы с помощью утилиты top
. Вы можете выполнить эти же действия и без копирования бинарного файла cat, но с использованием различных учетных записей пользователей. Или же вы можете просто отслеживать значения идентификаторов
каждого из созданных процессов
.)
paul@ubuntu910:~/procs$ cp /bin/cat proj33 paul@ubuntu910:~/procs$ cp /bin/cat proj42 paul@ubuntu910:~/procs$ echo -n x | ./proj33 - pipe33a > pipe33b & [1] 1670 paul@ubuntu910:~/procs$ ./proj33 <pipe33b >pipe33a & [2] 1671 paul@ubuntu910:~/procs$ echo -n z | ./proj42 - pipe42a > pipe42b & [3] 1673 paul@ubuntu910:~/procs$ ./proj42 <pipe42b >pipe42a & [4] 1674
Команды, которые вы можете обнаружить в примере выше, предназначены для создания двух процессов с именами proj33
, которые на самом деле будут являться экземплярами утилиты cat
, выполняющими циклическую передачу символа x с помощью именованных программных каналов pipe33a
и pipe33b
. Те же самые манипуляции осуществляются процессом с именем proj42
с символом z.
2.1.4. Утилита top
Простой запуск утилиты top
без передачи каких-либо параметров или аргументов приведет к выводу информации о параметрах системы и обо всех процессах в системе. При этом в верхней части вывода утилиты top
может быть обнаружена следующая информация.
top - 13:59:29 up 48 min, 4 users, load average: 1.06, 0.25, 0.14 Tasks: 139 total, 3 running, 136 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.3 us, 99.7 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st Mem: 509352k total, 460040k used, 49312k free, 66752k buffers Swap: 746980k total, 0k used, 746980k free, 247324k cached
Обратите внимание на нулевое значение времени простоя центрального процессора (cpu idle time 0.0 id
). Оно объясняется тем, что наши процессы cat
используют все вычислительные ресурсы центрального процессора
. Результаты могут отличаться при использовании систем с четырьмя или большим количеством ядер центрального процессора
.
2.1.5. Команда top -p
Команда top -p 1670,1671,1673,1674
из примера ниже позволяет выводить информацию о четырех процессах, каждый из которых использует примерно 25 процентов вычислительных ресурсов центрального процессора.
paul@ubuntu910:~$ top -p 1670,1671,1673,1674 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1674 paul 20 0 2972 616 524 S 26.6 0.1 0:11.92 proj42 1670 paul 20 0 2972 616 524 R 25.0 0.1 0:23.16 proj33 1671 paul 20 0 2972 616 524 S 24.6 0.1 0:23.07 proj33 1673 paul 20 0 2972 620 524 R 23.0 0.1 0:11.48 proj42
Все четыре процесса имеют одинаковый приоритет
(столбец PR) и на равных соревнуются за время центрального процессора
. В некоторых системах ядро Linux
может использовать немного отличающиеся значения приоритетов процессов
, но в любом случае в результате описанных выше манипуляций четыре процесса будут на равных соревноваться за время центрального процессора
.
2.1.6. Утилита renice
Так как упомянутые ранее процессы уже исполняются, нам придется использовать утилиту renice
для изменения их значений nice
(столбец NI).
В примере ниже показана методика использования утилиты renice
по отношению к обоим процессам с именами proj33
.
paul@ubuntu910:~$ renice +8 1670 1670 (process ID) old priority 0, new priority 8 paul@ubuntu910:~$ renice +8 1671 1671 (process ID) old priority 0, new priority 8
Обычные пользователи могут устанавливать значения nice
для своих процессов из диапазона от 0 до 20. Отрицательные значения nice может устанавливать исключительно пользователь root
. Будьте осторожны при использовании отрицательных значений nice, так как в случае их установки управление системой с помощью клавиатуры или удаленной командной оболочки, работающей по протоколу ssh, может быть значительно осложнено или же вообще окажется невозможным.
2.1.7. Влияние значений nice на работу процессов
Влияние значения nice на работу процесса может может варьироваться. В примере ниже показан результат исполнения нашей команды renice +8
. Обратите внимание на значения доли процессорного времени из столбца %CPU
для каждого из процессов.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1674 paul 20 0 2972 616 524 S 46.6 0.1 0:22.37 proj42 1673 paul 20 0 2972 620 524 R 42.6 0.1 0:21.65 proj42 1671 paul 28 8 2972 616 524 S 5.7 0.1 0:29.65 proj33 1670 paul 28 8 2972 616 524 R 4.7 0.1 0:29.82 proj33
Важно помнить о том, что значения nice менее важных процессов всегда должны быть выше соответствующих значений более важных процессов. При этом использование отрицательных значений nice
может оказать негативное влияние на стабильность работы системы.
2.1.8. Утилита nice
Утилита nice
функционирует аналогично утилите renice
, но применяется в момент запуска приложения.
В примере ниже показана методика исполнения сценария с значением nice
, равным пяти.
paul@ubuntu910:~$ nice -5 ./backup.sh
2.2. Практическое задание: приоритеты процессов
-
1. Создайте новую директорию и шесть
именованных программных каналов
в ней. -
2. Инициируйте циклическую передачу символа посредством двух
именованных программных каналов
. -
3. Используйте утилиты
top
иps
для вывода информации (pid, ppid, приоритет, значение nice, ...) о двух созданных процессах cat. -
4. Инициируйте циклическую передачу другого символа посредством двух других именованных программных каналов, но в этот раз используйте утилиту
nice
для запуска приложений. Проверьте, соревнуются ли созданные процессы за все вычислительные ресурсы центрального процессора. (Не забывайте о том, что в случае необходимости вы можете создать еще два или большее количество процессовcat
, использующих оставшиеся программные каналы). -
5. Используйте утилиту
ps
для установления факта использования двумя новыми процессамиcat
измененных значенийnice
. Для этого используйте параметры -o и -C утилитыps
. -
6. Используйте утилиту
renice
для увеличения значения nice процессов c 10 до 15. Обратите внимание на отличия в работе данных процессов и процессов со стандартными значениями nice.
2.3. Корректная процедура выполнения практического задания: приоритеты процессов
-
1. Создайте новую директорию и шесть
именованных программных каналов
в ней. -
[paul@rhel53 ~]$ mkdir pipes ; cd pipes [paul@rhel53 pipes]$ mkfifo p1 p2 p3 p4 p5 p6 [paul@rhel53 pipes]$ ls -l итого 0 prw-rw-r-- 1 paul paul 0 апр 12 22:15 p1 prw-rw-r-- 1 paul paul 0 апр 12 22:15 p2 prw-rw-r-- 1 paul paul 0 апр 12 22:15 p3 prw-rw-r-- 1 paul paul 0 апр 12 22:15 p4 prw-rw-r-- 1 paul paul 0 апр 12 22:15 p5 prw-rw-r-- 1 paul paul 0 апр 12 22:15 p6
-
2. Инициируйте циклическую передачу символа посредством двух
именованных программных каналов
. -
[paul@rhel53 pipes]$ echo -n x | cat - p1 > p2 & [1] 4013 [paul@rhel53 pipes]$ cat <p2 >p1 & [2] 4016
-
3. Используйте утилиты
top
иps
для вывода информации (pid, ppid, приоритет, значение nice, ...) о двух созданных процессах cat. -
top (скорее всего, две верхних строки) [paul@rhel53 pipes]$ ps -C cat PID TTY TIME CMD 4013 pts/0 00:03:38 cat 4016 pts/0 00:01:07 cat [paul@rhel53 pipes]$ ps fax | grep cat 4013 pts/0 R 4:00 | \_ cat - p1 4016 pts/0 S 1:13 | \_ cat 4044 pts/0 S+ 0:00 | \_ grep cat
-
4. Инициируйте циклическую передачу другого символа посредством двух других именованных программных каналов, но в этот раз используйте утилиту
nice
для запуска приложений. Проверьте, соревнуются ли созданные процессы за все вычислительные ресурсы центрального процессора. (Не забывайте о том, что в случае необходимости вы можете создать еще два или большее количество процессовcat
, использующих оставшиеся программные каналы). -
echo -n y | nice cat - p3 > p4 & nice cat <p4 >p3 &
-
5. Используйте утилиту
ps
для установления факта использования двумя новыми процессамиcat
измененных значенийnice
. Для этого используйте параметры -o и -C утилитыps
. -
[paul@rhel53 pipes]$ ps -C cat -o pid,ppid,pri,ni,comm PID PPID PRI NI COMMAND 4013 3947 14 0 cat 4016 3947 21 0 cat 4025 3947 13 10 cat 4026 3947 13 10 cat
-
6. Используйте утилиту
renice
для увеличения значения nice процессов c 10 до 15. Обратите внимание на отличия в работе данных процессов и процессов со стандартными значениями nice. -
[paul@rhel53 pipes]$ renice +15 4025 4025 (process ID) old priority 10, new priority 15 [paul@rhel53 pipes]$ renice +15 4026 4026 (process ID) old priority 10, new priority 15 [paul@rhel53 pipes]$ ps -C cat -o pid,ppid,pri,ni,comm PID PPID PRI NI COMMAND 4013 3947 14 0 cat 4016 3947 21 0 cat 4025 3947 9 15 cat 4026 3947 8 15 cat
Предыдущий раздел: | Оглавление | Следующий раздел: |
Глава 1. Вводная информация об управлении процессами | Глава 3. Фоновые задачи |