Как управлять приоритетом процесса в Linux с помощью команд nice и renice
В этом уроке мы поговорим о том, как вы расставляете приоритеты для процессов, которые они запускают в системе Linux.
В моей предыдущей статье я объяснил следующие концепции и прошу вас прочитать эти руководства:
Вступление
Теперь вспомните, что Linux — это многозадачная операционная система.
Следовательно, процессорное время вращается между каждым из процессов, которые в настоящее время выполняются в системе, создавая иллюзию того, что все эти процессы выполняются одновременно.
Теперь, поскольку Linux является многозадачной операционной системой, вы можете указать уровень приоритета для каждого процесса, запущенного в системе.
И это определяет, сколько процессорного времени будет занимать конкретный процесс по сравнению с другими процессами, запущенными в системе.
Теперь по умолчанию Linux действительно не уделяет много внимания приоритетам.
Фактически он пытается уравнять количество процессорного времени, отведенного всем процессам, запущенным в системе, с очень ограниченным числом исключений.
Однако бывают случаи, когда вам нужно изменить приоритет, назначенный конкретному процессу.
Теперь, в зависимости от того, как развернута система, вы можете захотеть, чтобы один конкретный процесс имел более высокий приоритет, чем другие процессы, запущенные в системе.
Возможно, система используется для веб-сервера, и в этом случае вы хотите, чтобы процесс веб-сервера имел более высокий приоритет, чем другие процессы, запущенные в системе.
Что ж, вы можете сделать это с помощью нескольких утилит Linux.
Как изменить приоритет процесса в Linux
Итак, в этом уроке мы поговорим о том, как расставить приоритеты с помощью nice
команда и как вы можете установить приоритет процесса, который уже запущен с renice
команда.
Начнем с того, что посмотрим, как можно использовать nice
утилита.
Установите приоритеты с помощью красивой команды
В nice
Утилиту можно использовать для запуска нового процесса в системе Linux с индивидуальным уровнем приоритета.
Теперь вспомните как top
и ps
утилиты можно использовать для отображения информации о процессах, запущенных в системе Linux.
И два значения, которые будут отображаться ps
а также top
являются PR
ценность, которая является приоритетом, и хорошая ценность, которая является NI
.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
30738 helpdesk 20 0 2955736 105168 29692 S 8.3 13.0 2:56.70 gnome-shell
31252 helpdesk 20 0 534516 21444 13576 S 1.3 2.6 0:11.46 gnome-terminal-
1 root 20 0 262096 5536 3184 S 0.0 0.7 0:11.67 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.05 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-kblockd
Понимание ценности PR (приоритета)
Вот ключевая вещь, о которой вам нужно помнить, и на самом деле это то, что сбивает с толку многих новых системных администраторов Linux.
Чем выше номер приоритета, тем ниже приоритет процесса. Это как-то нелогично.
В этом примере у нас есть большинство этих процессов, работающих со значением приоритета 20, но есть также процессы, которые имеют значение приоритета 0.
Как видите, kworker / 0: 0H-kblockd
команда имеет приоритет 0.
Потому что kworker / 0: 0H-kblockd
использует меньшее число, это на самом деле процесс с более высоким приоритетом, чем все другие процессы со значением приоритета 20.
Просто помните, что в столбце приоритета чем меньше число, тем выше приоритет процесса.
Понимание ценности NI (Nice)
Помимо приоритета, который вам необходимо знать о Приятной ценности, она отображается в NI
столбец.
В NI
value — это приятная ценность процесса, она в основном определяет, насколько хорош процесс.
Чем лучше процесс, тем меньше процессорного времени он потребует, чем менее приятен процесс, тем больше процессорного времени он потребует.
Важная вещь, которую следует помнить о значении nice, — это тот факт, что оно учитывается при вычислениях ядра, которые будут определять общий приоритет процесса.
Теперь значение nice для любого процесса Linux может находиться в диапазоне от -20 до +19.
Теперь обратите внимание на вывод top
команда здесь, что большинство этих процессов имеют точно такое же значение Nice.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
30738 helpdesk 20 0 2955736 105168 29692 S 8.3 13.0 2:56.70 gnome-shell
31252 helpdesk 20 0 534516 21444 13576 S 1.3 2.6 0:11.46 gnome-terminal-
1 root 20 0 262096 5536 3184 S 0.0 0.7 0:11.67 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.05 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-kblockd
По умолчанию они имеют значение 0, что в основном дает им одинаковый приоритет в системе.
Обратите внимание, однако, что есть несколько исключений, таких как kworker/0:0H-kblockd
Процесс, он имеет значение Nice -20.
В результате он имеет более низкий приоритет, чем другие процессы, запущенные в системе, что означает, что он имеет более высокий уровень приоритета в системе.
Важно помнить, что чем ниже значение Nice, тем ниже будет значение приоритета и, следовательно, выше общий приоритет процесса в системе.
Как использовать красивую команду
Вот еще одна ключевая вещь, которую вам нужно понять, это тот факт, что вы не можете напрямую управлять приоритетом процесса, но вы можете манипулировать им косвенно, настраивая значение Nice процесса.
Самый простой способ сделать это — установить для процесса значение Nice, когда вы первоначально загружаете этот процесс в командной строке и делаете это с помощью nice
команда.
Здесь показан синтаксис, вы вводите nice -n
за которым следует хороший уровень, который вы хотите назначить процессу, за которым следует имя фактической команды, которую вы хотите запустить.
Синтаксис: nice -n nice_level command
Например, предположим, что я хотел запустить gedit
программу из командной строки.
gedit
это графический текстовый редактор, который можно использовать в системах Linux.
Но я хочу запустить gedit
с повышенным приоритетом в системе, потому что я серьезно отношусь к редактированию текста.
Теперь по умолчанию, если я просто бегу gedit
из приглашения оболочки он получит приоритет 80 в системе, потому что ему будет присвоено хорошее значение 0.
# ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
1 I root 8 2 0 60 -20 - 0 - May11 ? 00:00:00 [mm_percpu_wq]
1 S root 9 2 0 80 0 - 0 - May11 ? 00:00:03 [ksoftirqd/0]
1 I root 484 2 0 60 -20 - 0 - May11 ? 00:00:00 [ttm_swap]
0 S helpdesk 40156 30633 1 80 0 - 140623 x64_sy 22:56 ? 00:00:00 /usr/bin/gedit --gapplication-service
0 R root 40187 32751 0 80 0 - 14455 - 22:56 pts/0 00:00:00 ps -elf
4 S root 32746 31257 0 80 0 - 33371 - 14:52 pts/0 00:00:00 su
4 S root 32751 32746 0 80 0 - 6730 - 14:52 pts/0 00:00:00 bash
Это значение Nice 0 используется ядром для вычисления общего приоритета этого процесса и с использованием его различных вычислений, которое оказывается равным 80.
Теперь, поскольку, как я уже сказал, я очень серьезно отношусь к своим текстовым редакторам, я мог бы настроить уровень приоритета этого процесса на более высокий уровень, уменьшив его значение Nice, чтобы добиться максимальной производительности при редактировании текста.
Например, здесь я ввел nice -n -15
за которым следует gedit
команда.
# nice -n -15 gedit
Помните, что по умолчанию значение nice равно 0, теперь я уменьшаю его до -15.
Это приведет к уменьшению номера приоритета, назначенного процессу, созданному командой, что также увеличит его общий приоритет в системе, и вы можете увидеть это прямо здесь.
# ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
1 I root 8 2 0 60 -20 - 0 - May11 ? 00:00:00 [mm_percpu_wq]
1 S root 9 2 0 80 0 - 0 - May11 ? 00:00:03 [ksoftirqd/0]
1 I root 484 2 0 60 -20 - 0 - May11 ? 00:00:00 [ttm_swap]
0 S helpdesk 40156 30633 1 65 -15 - 140623 x64_sy 22:56 ? 00:00:00 /usr/bin/gedit --gapplication-service
0 R root 40187 32751 0 80 0 - 14455 - 22:56 pts/0 00:00:00 ps -elf
4 S root 32746 31257 0 80 0 - 33371 - 14:52 pts/0 00:00:00 su
4 S root 32751 32746 0 80 0 - 6730 - 14:52 pts/0 00:00:00 bash
После выполнения команды мое значение Nice уменьшилось до -15, а мой номер приоритета уменьшился до 65 с 80, что увеличивает общий приоритет этого процесса в системе.
Теперь с учетом сказанного имейте в виду, что Linux на самом деле не решается позволить вам уменьшить значение параметра Nice для процессов, запущенных в системе.
Поскольку Linux — это настоящая многопользовательская операционная система, несколько пользователей одной системы могут настраивать значения Nice для своих собственных процессов.
А теперь, когда человеческая природа является естественной, что все будут делать?
Все будут хорошо думать, что мои процессы важнее всех остальных, поэтому каждый пользователь в системе будет пытаться снизить ценность своих процессов в Nice, чтобы повысить свой уровень приоритета в системе.
И мы закончим большим перетягиванием каната.
Поэтому, чтобы этого не происходило, Linux не позволит вам изменить значение процесса Nice ниже 0, если вы не вошли в систему как root.
Это означает, что если вы не являетесь пользователем root, вам не будет разрешено использовать отрицательное число с nice
команда.
Установите приоритеты с помощью команды renice
Сейчас nice
Команда отлично подходит для изменения значения Nice, когда вы изначально запускаете команду, которая запрашивает оболочку для запуска процесса.
Но что вы делаете с процессом, который вы хотите изменить, уже запущен, и вы действительно не хотите или не можете его перезапустить.
Возможно, на нем запущено какое-то критически важное приложение, и если вы отключите его и перезапустите с новым значением Nice, вся компания будет преследовать вас с вилами.
Что ж, в этой ситуации вы не можете использовать nice
вместо этого вы можете использовать renice
команда.
Вместо того, чтобы убить процесс и перезапустить его с помощью nice
чтобы сбросить его Хорошее значение.
Вы можете использовать renice
, чтобы настроить значение Nice для уже запущенного процесса, и здесь показан синтаксис.
Как использовать команду renice
Мы бежим renice -n
за которым следует уровень nice, который мы хотим назначить, и на этот раз мы ссылаемся на номер идентификатора процесса (PID) процесса, значение nice которого мы хотим изменить.
Синтаксис: renice -n nice_level PID
Итак, в этом примере у меня уже есть gedit
запущенный в системе, он имеет хорошее значение -15, а его уровень приоритета равен 65.
Скажем, из-за того, что я сделал это, я использую гораздо больше системных ресурсов, чем должен, просто для редактирования текстовых файлов.
В этой ситуации я хочу увеличить значение Nice для gedit
программа, которая делает ее более удобной и дружественной, которая затем снижает общий уровень приоритета в системе, освобождая ресурсы для использования другими пользователями.
И поскольку я по-прежнему серьезно отношусь к редактированию текста, я не хочу выходить из gedit
и перезагрузите его с помощью Nice, вместо этого хотите динамически изменять его значение Nice, пока он все еще работает.
Итак, первое, что я делаю, это бегу ps -elf
чтобы узнать идентификатор процесса (PID) gedit
процесс, который в данном случае 40156
.
# ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
1 I root 6 2 0 60 -20 - 0 - May13 ? 00:00:00 [kworker/0:0H-kblockd]
0 S root 48359 1048 0 80 0 - 1820 hrtime 01:23 ? 00:00:00 sleep 60
4 S root 48360 1 0 80 0 - 61161 x64_sy 01:23 ? 00:00:00 /usr/libexec/fprintd
0 S helpdesk 48404 30633 0 80 0 - 80189 x64_sy 01:23 ? 00:00:00 /usr/libexec/gnome-boxes-search-provider
0 S helpdesk 48405 30633 4 80 0 - 238057 x64_sy 01:23 ? 00:00:00 /usr/bin/nautilus --gapplication-service
0 S helpdesk 48407 30633 1 80 0 - 107318 x64_sy 01:23 ? 00:00:00 /usr/libexec/gnome-control-center-search-provider
0 S helpdesk 40156 30633 1 65 -15 - 140624 x64_sy 01:23 ? 00:00:00 /usr/bin/gedit --gapplication-service
0 R root 48458 32751 0 80 0 - 14455 - 01:23 pts/0 00:00:00 ps -elf
Итак, я могу запустить renice
и я указываю хорошее значение 4.
# renice -n 4 40156
Теперь обратите внимание, когда я запускаю ps -elf
команду во второй раз, и если я посмотрю на приоритет и значение Nice gedit
процесс, теперь он намного выше, чем был до создания gedit
гораздо более дружелюбная программа.
# ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
1 I root 6 2 0 60 -20 - 0 - May13 ? 00:00:00 [kworker/0:0H-kblockd]
0 S root 48359 1048 0 80 0 - 1820 hrtime 01:23 ? 00:00:00 sleep 60
4 S root 48360 1 0 80 0 - 61161 x64_sy 01:23 ? 00:00:00 /usr/libexec/fprintd
0 S helpdesk 48404 30633 0 80 0 - 80189 x64_sy 01:23 ? 00:00:00 /usr/libexec/gnome-boxes-search-provider
0 S helpdesk 48405 30633 4 80 0 - 238057 x64_sy 01:23 ? 00:00:00 /usr/bin/nautilus --gapplication-service
0 S helpdesk 48407 30633 1 80 0 - 107318 x64_sy 01:23 ? 00:00:00 /usr/libexec/gnome-control-center-search-provider
0 S helpdesk 40156 30633 1 84 4 - 140624 x64_sy 01:23 ? 00:00:00 /usr/bin/gedit --gapplication-service
0 R root 48458 32751 0 80 0 - 14455 - 01:23 pts/0 00:00:00 ps -elf
Значение Nice намного выше, чем у большинства других процессов, запущенных в системе, поэтому мой номер приоритета также выше, что означает, что мой уровень приоритета в системе ниже.
Я получу меньше внимания процессора, чем другие процессы, запущенные в системе.
Следует быстро запомнить, что когда вы используете renice
вы по-прежнему ограничены тем же правилом, о котором мы говорили nice
.
И это тот факт, что вы должны войти в систему как root, если вы хотите настроить уровень запущенного процесса Nice на число меньше 0, другими словами -ve
количество.
Если вы вошли в систему как обычный пользователь, вы можете установить только значение 0 или выше.
Заключение
Я надеюсь, что теперь вы хорошо понимаете, как управлять приоритетом процесса в Linux с помощью команд nice и renice.
Если у кого-то есть какие-либо вопросы о том, что мы рассмотрели в этом руководстве, не стесняйтесь спрашивать в разделе комментариев ниже, и я постараюсь ответить на них.