103.6 Урок 1
Сертифікат: |
LPIC-1 |
---|---|
Версія: |
5.0 |
Розділ: |
103 GNU та команди Unix |
Тема: |
103.6 Зміна пріоритетів виконання процесу |
Урок: |
1 з 1 |
Вступ
Операційні системи, здатні одночасно запускати більше одного процесу, називаються багатозадачними або багатопроцесорними. Хоча справжня одночасність відбувається лише тоді, коли доступно більше одного процесора, навіть системи з одним процесором можуть імітувати одночасність, дуже швидко перемикаючись між процесами. Цей метод також використовується в системах з багатьма еквівалентними процесорами або симетричними багатопроцесорними (SMP, symmetric multi-processor) системами, враховуючи, що кількість потенційно одночасних процесів значно перевищує кількість доступних процесорних блоків.
Фактично, лише один процес може керувати процесором одночасно. Однак більшість дій процесу — це системні виклики, тобто запущений процес передає керування ЦП процесу операційної системи для виконання запитаної операції. Системні виклики відповідають за весь зв’язок між пристроями, наприклад, розподіл пам’яті, читання та запис у файлових системах, друк тексту на екрані, взаємодію з користувачем, мережеві передачі тощо. Передача керування ЦП під час системного виклику дозволяє операційній системі вирішувати, чи повернути управління ЦП попередньому процесу або передати його іншому процесу. Оскільки сучасні ЦП можуть виконувати інструкції набагато швидше, ніж більшість зовнішнього обладнання може спілкуватися між собою, новий керуючий процес може виконати багато роботи ЦП, поки запитані раніше апаратні відповіді все ще недоступні. Щоб забезпечити максимальне використання ЦП, багатопроцесорні операційні системи зберігають динамічну чергу активних процесів, які очікують часового інтервалу ЦП.
Хоча вони дозволяють значно покращити використання часу ЦП, покладатися виключно на системні виклики для перемикання між процесами недостатньо для досягнення задовільної багатозадачності. Процес, який не здійснює системних викликів, може керувати ЦП необмежено. Ось чому сучасні операційні системи також є випереджувальними, тобто запущений процес можна повернути в чергу, щоб більш важливий процес міг керувати ЦП, навіть якщо запущений процес не здійснив системний виклик.
Планувальник Linux
Linux, як багатопроцесорна операційна система з випередженням, реалізує планувальник, який організовує чергу процесів. Точніше, планувальник також вирішує, який потік із черги буде виконуватися — процес може розгалужувати багато незалежних потоків — але в цьому контексті процес і потік є взаємозамінними термінами. Кожен процес має два предикати, які втручаються в його планування: політика планування і пріоритет планування.
Існує два основних типи політик планування: політики реального часу та звичайні політики. Процеси відповідно до політики реального часу плануються безпосередньо за значеннями пріоритету. Якщо більш важливий процес стає готовим до запуску, менш важливий запущений процес витісняється, і процес вищого пріоритету отримує контроль над ЦП. Процес з нижчим пріоритетом отримає контроль ЦП лише в тому випадку, якщо процеси вищого пріоритету не працюють або чекають відповіді обладнання.
Будь-який процес у реальному часі має вищий пріоритет, ніж звичайний процес. Як операційна система загального призначення, Linux запускає лише кілька процесів у реальному часі. Більшість процесів, включно з системними та користувацькими програмами, виконуються за звичайними політиками планування. Звичайні процеси зазвичай мають однакове значення пріоритету, але звичайні політики можуть визначати правила пріоритету виконання, використовуючи інший предикат процесу: значення nice. Щоб уникнути плутанини з динамічними пріоритетами, отриманими зі значень nice, пріоритети планування зазвичай називаються статичними пріоритетами планування.
Планувальник Linux можна налаштувати багатьма різними способами, і існують ще більш складні способи встановлення пріоритетів, але ці загальні концепції завжди застосовуються. Перевіряючи та налаштовуючи планування процесу, важливо пам’ятати, що це впливатиме лише на процеси, які відповідають стандартній політиці планування.
Пріоритети читання
Linux резервує статичні пріоритети в діапазоні від 0 до 99 для процесів реального часу, а звичайним процесам призначаються статичні пріоритети від 100 до 139, тобто існує 39 різних рівнів пріоритету для звичайних процесів. Нижчі значення означають вищий пріоритет. Статичний пріоритет активного процесу можна знайти у файлі sched
, розташованому у відповідному каталозі всередині файлової системи /proc
:
$ grep ^prio /proc/1/sched prio : 120
Як показано в прикладі, рядок, що починається з prio
, дає значення пріоритету процесу (процес PID 1 - це процес init або systemd, перший процес, який ядро запускає під час ініціалізації системи). Стандартним пріоритетом для звичайних процесів є 120, тому його можна зменшити до 100 або збільшити до 139. Пріоритети всіх запущених процесів можна перевірити за допомогою команди ps -Al
або ps -el
:
$ ps -el F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1 0 0 80 0 - 9292 - ? 00:00:00 systemd 4 S 0 19 1 0 80 0 - 8817 - ? 00:00:00 systemd-journal 4 S 104 61 1 0 80 0 - 64097 - ? 00:00:00 rsyslogd 4 S 0 63 1 0 80 0 - 7244 - ? 00:00:00 cron 1 S 0 126 1 0 80 0 - 4031 - ? 00:00:00 dhclient 4 S 0 154 1 0 80 0 - 3937 - pts/0 00:00:00 agetty 4 S 0 155 1 0 80 0 - 3937 - pts/1 00:00:00 agetty 4 S 0 156 1 0 80 0 - 3937 - pts/2 00:00:00 agetty 4 S 0 157 1 0 80 0 - 3937 - pts/3 00:00:00 agetty 4 S 0 158 1 0 80 0 - 3937 - console 00:00:00 agetty 4 S 0 160 1 0 80 0 - 16377 - ? 00:00:00 sshd 4 S 0 280 0 0 80 0 - 5301 - ? 00:00:00 bash 0 R 0 392 280 0 80 0 - 7221 - ? 00:00:00 ps
Стовпець PRI
вказує на статичний пріоритет, призначений ядром. Зауважте, однак, що значення пріоритету, яке відображається ps
, відрізняється від значення, отриманого у попередньому прикладі. З огляду на історичні причини, пріоритети, які відображаються ps
, за замовчуванням варіюються від -40 до 99, тому фактичний пріоритет отримується шляхом додавання до нього 40 (зокрема, 80 + 40 = 120).
Також можна безперервно відстежувати процеси, якими зараз управляє ядро Linux, за допомогою програми top
. Як і у випадку з ps
, top
також відображає значення пріоритету інакше. Щоб полегшити ідентифікацію процесів реального часу, top
віднімає від значення пріоритету 100, таким чином, усі пріоритети реального часу від’ємні, з від’ємним числом або rt, що їх ідентифікує. Таким чином, звичайні пріоритети, які відображаються top
, варіюються від 0 до 39.
Note
|
Щоб отримати більш детальну інформацію з команди $ ps -e -o user,uid,comm,tty,pid,ppid,pri,pmem,pcpu --sort=-pcpu | head |
Nice процесу
Кожен звичайний процес починається зі стандартного значення nice 0 (пріоритет 120). Назва nice походить від ідеї, що «приємніші» процеси дозволяють іншим процесам запускатися перед ними в конкретній черзі виконання. Nice-числа коливаються від -20 (менш гарний, високий пріоритет) до 19 (більш гарний, низький пріоритет). Linux також дає можливість призначати різні хороші значення потокам в рамках одного процесу. Стовпець NI
у виводі ps
вказує на nice число.
Тільки користувач root може зменшити приємність процесу нижче нуля. Запустити процес з нестандартним пріоритетом можна командою nice
. За замовчуванням nice
змінює приємність до 10, але також значення можна вказати за допомогою параметра -n
:
$ nice -n 15 tar czf home_backup.tar.gz /home
У цьому прикладі команда tar
виконується з приємністю 15. Команду renice
можна використовувати для зміни пріоритету запущеного процесу. Параметр -p
вказує номер PID цільового процесу. Наприклад:
# renice -10 -p 2164 2164 (process ID) old priority 0, new priority -10
Параметри -g
та -u
використовуються для зміни всіх процесів певної групи чи користувача відповідно. З renice +5 -g users
, приємність процесів, які належать користувачам групи users, буде підвищена на п’ять.
Крім renice
, пріоритет процесів можна змінити за допомогою інших програм, наприклад, програми top
. На головному процесі top приємність процесу можна змінити, натиснувши r
, а потім номер PID процесу:
top - 11:55:21 up 23:38, 1 user, load average: 0,10, 0,04, 0,05 Tasks: 20 total, 1 running, 19 sleeping, 0 stopped, 0 zombie %Cpu(s): 0,5 us, 0,3 sy, 0,0 ni, 99,0 id, 0,0 wa, 0,2 hi, 0,0 si, 0,0 st KiB Mem : 4035808 total, 774700 free, 1612600 used, 1648508 buff/cache KiB Swap: 7999828 total, 7738780 free, 261048 used. 2006688 avail Mem PID to renice [default pid = 1] PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 74232 7904 6416 S 0,000 0,196 0:00.12 systemd 15 root 20 0 67436 6144 5568 S 0,000 0,152 0:00.03 systemd-journal 21 root 20 0 61552 5628 5000 S 0,000 0,139 0:00.01 systemd-logind 22 message+ 20 0 43540 4072 3620 S 0,000 0,101 0:00.03 dbus-daemon 23 root 20 0 45652 6204 4992 S 0,000 0,154 0:00.06 wickedd-dhcp4 24 root 20 0 45648 6276 5068 S 0,000 0,156 0:00.06 wickedd-auto4 25 root 20 0 45648 6272 5060 S 0,000 0,155 0:00.06 wickedd-dhcp6
Повідомлення PID to renice [default pid = 1]
з’являється з першим у списку процесом, вибраним за замовчуванням. Щоб змінити пріоритет іншого процесу, введіть його PID і натисніть Enter. Потім з’явиться повідомлення Renice PID 1 to value
(із потрібним номером PID), і можна призначити нове значення.
Вправи до посібника
-
Що відбувається у випереджувальній багатозадачній системі, коли процес з нижчим пріоритетом займає процесор, а процес з більш високим пріоритетом ставиться до черги для виконання?
-
Розглянемо наступні дані команди
top
:top - 08:43:14 up 23 days, 12:29, 5 users, load average: 0,13, 0,18, 0,21 Tasks: 240 total, 2 running, 238 sleeping, 0 stopped, 0 zombie %Cpu(s): 1,4 us, 0,4 sy, 0,0 ni, 98,1 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st MiB Mem : 7726,4 total, 590,9 free, 1600,8 used, 5534,7 buff/cache MiB Swap: 30517,0 total, 30462,5 free, 54,5 used. 5769,4 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 171420 10668 7612 S 0,0 0,1 9:59.15 systemd 2 root 20 0 0 0 0 S 0,0 0,0 0:02.76 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 8 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 mm_percpu_wq 9 root 20 0 0 0 0 S 0,0 0,0 0:49.06 ksoftirqd/0 10 root 20 0 0 0 0 I 0,0 0,0 18:24.20 rcu_sched 11 root 20 0 0 0 0 I 0,0 0,0 0:00.00 rcu_bh 12 root rt 0 0 0 0 S 0,0 0,0 0:08.17 migration/0 14 root 20 0 0 0 0 S 0,0 0,0 0:00.00 cpuhp/0 15 root 20 0 0 0 0 S 0,0 0,0 0:00.00 cpuhp/1 16 root rt 0 0 0 0 S 0,0 0,0 0:11.79 migration/1 17 root 20 0 0 0 0 S 0,0 0,0 0:26.01 ksoftirqd/1
Які PID мають пріоритети реального часу?
-
Розглянемо результ команди
ps -el
:F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1 0 0 80 0 - 42855 - ? 00:09:59 systemd 1 S 0 2 0 0 80 0 - 0 - ? 00:00:02 kthreadd 1 I 0 3 2 0 60 -20 - 0 - ? 00:00:00 rcu_gp 1 S 0 9 2 0 80 0 - 0 - ? 00:00:49 ksoftirqd/0 1 I 0 10 2 0 80 0 - 0 - ? 00:18:26 rcu_sched 1 I 0 11 2 0 80 0 - 0 - ? 00:00:00 rcu_bh 1 S 0 12 2 0 -40 - - 0 - ? 00:00:08 migration/0 1 S 0 14 2 0 80 0 - 0 - ? 00:00:00 cpuhp/0 5 S 0 15 2 0 80 0 - 0 - ? 00:00:00 cpuhp/1
Який PID має вищий пріоритет?
-
Після спроби повторити процес за допомогою
renice
виникає така помилка:$ renice -10 21704 renice: failed to set priority for 21704 (process ID): Permission denied
Яка ймовірна причина помилки?
Дослідницькі вправи
-
Зміна пріоритетів процесів зазвичай потрібна, коли процес займає занадто багато часу ЦП. Використовуючи
ps
зі стандартними параметрами для друку всіх системних процесів у довгому форматі, як перемикач--sort
сортуватиме процеси за ознакою використання ЦП, в порядку зростання? -
Команда
schedtool
може встановлювати всі параметри планування процесора, на які Linux здатний, або відображати інформацію для певних процесів. Як цю команду можна використовувати для відображення параметрів планування процесу1750
? Крім того, як можна використовуватиschedtool
, щоб змінити процес 1750 на режим реального часу з пріоритетом -90 (як показано уtop
)?
Підсумки
Цей урок розповідає про те, як Linux розподіляє процесорний час між своїми керованими процесами. Щоб забезпечити найкращу продуктивність, більш критичні процеси повинні випереджати менш критичні процеси. Урок розглядає наступні питання:
-
Основні поняття про багатопроцесорні системи.
-
Що таке планувальник процесів і як його реалізує Linux.
-
Що таке пріоритети Linux, nice-числа та їх призначення.
-
Як читати та інтерпретувати пріоритети процесів у Linux.
-
Як змінити пріоритет процесу до та під час його виконання.
Відповіді на вправи до посібника
-
Що відбувається у випереджувальній багатозадачній системі, коли процес з нижчим пріоритетом займає процесор, а процес з більш високим пріоритетом ставиться до черги для виконання?
Процес з нижчим пріоритетом призупиняється, і замість нього виконується процес з вищим пріоритетом.
-
Розглянемо наступні дані команди
top
:top - 08:43:14 up 23 days, 12:29, 5 users, load average: 0,13, 0,18, 0,21 Tasks: 240 total, 2 running, 238 sleeping, 0 stopped, 0 zombie %Cpu(s): 1,4 us, 0,4 sy, 0,0 ni, 98,1 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st MiB Mem : 7726,4 total, 590,9 free, 1600,8 used, 5534,7 buff/cache MiB Swap: 30517,0 total, 30462,5 free, 54,5 used. 5769,4 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 171420 10668 7612 S 0,0 0,1 9:59.15 systemd 2 root 20 0 0 0 0 S 0,0 0,0 0:02.76 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 8 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 mm_percpu_wq 9 root 20 0 0 0 0 S 0,0 0,0 0:49.06 ksoftirqd/0 10 root 20 0 0 0 0 I 0,0 0,0 18:24.20 rcu_sched 11 root 20 0 0 0 0 I 0,0 0,0 0:00.00 rcu_bh 12 root rt 0 0 0 0 S 0,0 0,0 0:08.17 migration/0 14 root 20 0 0 0 0 S 0,0 0,0 0:00.00 cpuhp/0 15 root 20 0 0 0 0 S 0,0 0,0 0:00.00 cpuhp/1 16 root rt 0 0 0 0 S 0,0 0,0 0:11.79 migration/1 17 root 20 0 0 0 0 S 0,0 0,0 0:26.01 ksoftirqd/1
Які PID мають пріоритети в реального часу?
12 та 16 PID.
-
Розглянемо результат команди
ps -el
:F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1 0 0 80 0 - 42855 - ? 00:09:59 systemd 1 S 0 2 0 0 80 0 - 0 - ? 00:00:02 kthreadd 1 I 0 3 2 0 60 -20 - 0 - ? 00:00:00 rcu_gp 1 S 0 9 2 0 80 0 - 0 - ? 00:00:49 ksoftirqd/0 1 I 0 10 2 0 80 0 - 0 - ? 00:18:26 rcu_sched 1 I 0 11 2 0 80 0 - 0 - ? 00:00:00 rcu_bh 1 S 0 12 2 0 -40 - - 0 - ? 00:00:08 migration/0 1 S 0 14 2 0 80 0 - 0 - ? 00:00:00 cpuhp/0 5 S 0 15 2 0 80 0 - 0 - ? 00:00:00 cpuhp/1
Який PID має вищий пріоритет?
PID 12.
-
Після спроби повторити процес за допомогою
renice
виникає така помилка:$ renice -10 21704 renice: failed to set priority for 21704 (process ID): Permission denied
Яка ймовірна причина помилки?
Тільки користувач root може зменшити nice-числа нижче нуля.
Відповіді до дослідницьких вправ
-
Зміна пріоритетів процесів зазвичай потрібна, коли процес займає занадто багато часу ЦП. Використовуючи
ps
зі стандартними параметрами для друку всіх системних процесів у довгому форматі, як перемикач--sort
сортуватиме процеси за ознакою використання ЦП, в порядку зростання?$ ps -el --sort=pcpu
-
Команда
schedtool
може встановлювати всі параметри планування процесора, на які Linux здатний, або відображати інформацію для певних процесів. Як цю команду можна використовувати для відображення параметрів планування процесу1750
? Крім того, як можна використовуватиschedtool
, щоб змінити процес 1750 на режим реального часу з пріоритетом -90 (як показано уtop
)?$ schedtool 1750
$ schedtool -R -p 89 1750