Администрирование систем 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
http://rus-linux.net/MyLDP/BOOKS/LSA/ch02.html
|