Команди в цій лабораторній роботі охоплюють ширший спектр керування процесами, моніторингу системи та керування ресурсами в Linux. Вони додають більшої глибини та різноманітності вашому репертуару системного адміністратора.
Ці вправи охоплюють додаткові команди та поняття Linux, надаючи практичний досвід керування процесами, моніторингу ресурсів і розширеного контролю.
Команда fuser в Linux використовується для ідентифікації процесів за допомогою файлів або сокетів. Це може бути корисною підмогою в управлінні процесами, пов’язаними з файлами, і вирішенні конфліктів.
Щоб створити сценарій для імітації використання файлу¶
Спочатку створіть порожній тестовий файл, до якого ми хочемо отримати доступ. Впишіть:
touch~/testfile.txt
Створіть сценарій, який ми будемо використовувати для імітації доступу до testfile.txt. Впишіть:
perf — це універсальний інструмент для аналізу продуктивності системи та програм у Linux. Він може запропонувати додаткові відомості, які можуть допомогти налаштувати продуктивність.
Встановіть програму perf, якщо вона не встановлена на вашому сервері. Впишіть:
sudodnf-yinstallperf
Програма bc — це точний калькулятор командного рядка. bc буде використовуватися в цій вправі для імітації високого навантаження ЦП. Якщо bc ще не встановлено на вашому сервері, встановіть його за допомогою:
sudodnf-yinstallbc
Щоб створити сценарій для генерації навантаження на процесор¶
Створіть сценарій завантаження ЦП і зробіть його виконуваним, виконавши:
cat>~/generate_cpu_load.sh<< EOF#!/bin/bash# Check if the number of decimal places is passed as an argumentif [ "$#" -ne 1 ]; then echo "Usage: $0 <number_of_decimal_places>" exit 1fi# Calculate Pi to the specified number of decimal placesfor i in {1..10}; do echo "scale=$1; 4*a(1)" | bc -l; doneEOF
chmod+x~/generate_cpu_load.sh
!!! tip "Підказка"
Сценарій generate_cpu_load.sh — це простий інструмент для генерування навантаження на ЦП шляхом обчислення Пі (π) з високою точністю. Такий же розрахунок проводиться десять разів. Сценарій приймає ціле число як параметр для визначення кількості знаків після коми для обчислення Пі.
Для імітації додаткового навантаження на процесор¶
Давайте проведемо простий тест і обчислимо Пі з точністю до 50 знаків після коми. Запустіть сценарій, ввівши:
~/generate_cpu_load.sh50&
Повторно запустіть сценарій, але використовуйте perf, щоб записати продуктивність сценарію для аналізу використання ЦП та інших показників. Впишіть:
./generate_cpu_load.sh1000&perfrecord-p$!sleep5
!!! tip "Підказка"
Параметр `sleep 5` з командою `perf record` визначає часове вікно для `perf` для збору даних про продуктивність щодо навантаження ЦП, створених сценарієм generate_cpu_load.sh. Це дозволяє `perf записувати показники продуктивності системи протягом 5 секунд перед автоматичною зупинкою.
Для аналізу даних про ефективність і моніторингу подій у реальному часі¶
Використовуйте команду perf report, щоб переглянути звіт про продуктивність, щоб зрозуміти шаблони використання процесора та пам’яті. Впишіть:
sudoperfreport
Ви можете використовувати різні клавіші клавіатури для подальшого вивчення звіту.
Введіть q, щоб вийти з інтерфейсу перегляду звітів perf.
Спостерігайте/фіксуйте події кешу процесора в режимі реального часу протягом 40 секунд, щоб виявити потенційні вузькі місця продуктивності. Впишіть:
Збирайте дані про продуктивність усієї системи, які можна використовувати для додаткового аналізу. Впишіть:
sudoperfrecord-asleep10
Досліджуйте лічильники конкретних подій. Підраховуйте конкретні події, як-от цикли процесора, щоб оцінити продуктивність певного сценарію чи програми. Давайте перевіримо за допомогою простої команди find, введіть:
sudoperfstat-ecyclesfind/proc
Зробіть те саме, але зі сценарієм ./generate_cpu_load.sh. Підраховуйте певні події, як-от цикли ЦП, щоб оцінити продуктивність сценарію ./generate_cpu_load.sh. Впишіть:
Ось розбивка кінцевого зразка результату команди `perf stat`:
*1,670,638,886 cycles*: Це вказує на загальну кількість циклів процесора, споживаних під час виконання сценарію. Кожен цикл являє собою один крок у виконанні інструкцій ЦП.
*0.530479014 seconds time elapsed*: Це загальний реальний час (або час настінного годинника), що минув від початку до кінця виконання сценарію. Ця тривалість включає всі типи очікувань (наприклад, очікування дискового вводу-виводу або системних викликів).
*0.488580000 seconds user*: Це час роботи процесора в режимі користувача. Цей час явно виключає час, витрачений на виконання завдань системного рівня.
*0.034628000 seconds sys*: Це час роботи процесора в режимі ядра або системи. Це включає час, який ЦП витрачає на виконання системних викликів або виконання інших завдань системного рівня від імені сценарію.
Усе зроблено за допомогою інструмента perf. Переконайтеся, що фонові сценарії призначені для чистого робочого середовища.
Створіть простий сценарій під назвою strace_script.sh і зробіть його виконуваним. Впишіть:
cat>~/strace_script.sh<< EOF#!/bin/bashwhile true; do date sleep 1doneEOF
chmod+x~/strace_script.sh
Щоб використовувати strace для запущених процесів¶
Запустіть сценарій і прикріпіть strace. Впишіть:
~/strace_script.sh&
Знайдіть PID для процесу strace_script.sh в окремому терміналі. Зберігайте PID у змінній з іменем MYPID. Для цього ми використаємо команду pgrep, виконавши:
exportMYPID=$(pgrepstrace_script);echo$MYPID
Вихід
4006301
Почніть відстежувати системні виклики сценарію, щоб зрозуміти, як він взаємодіє з ядром. Приєднайте strace до запущеного процесу сценарію, ввівши:
sudostrace-p$MYPID
Від’єднайте або зупиніть процес strace, ввівши Ctrl+C
Вихід strace можна відфільтрувати, зосередившись на певних системних викликах, таких як open і read, щоб проаналізувати їх поведінку. Спробуйте зробити це для системних викликів open і read. Впишіть:
sudostrace-etrace=open,read-p$MYPID
Коли ви завершите спробу розшифрувати вихідні дані strace, зупиніть процес strace, ввівши Ctrl+C
Перенаправте вихідні дані у файл для подальшого аналізу, який може допомогти діагностувати проблеми. Збережіть вивід strace у файл, виконавши:
Узагальніть кількість системних викликів, щоб визначити системні виклики, які найчастіше використовуються процесом. Зробіть це лише на 10 секунд, додавши команду timeout. Впишіть:
sudotimeout10strace-c-p$MYPID
Наша зразкова система показує підсумковий звіт таким чином:
Встановіть програму atop, якщо вона не встановлена на вашому сервері. Впишіть:
sudodnf-yinstallatop
Запустіть atop, ввівши:
sudoatop
В інтерфейсі atop ви можете досліджувати різні показники atop, натискаючи певні клавіші на клавіатурі.
Використовуйте 'm', 'd' або 'n' для перемикання між переглядами пам'яті, диска або мережі. Спостерігайте, як використовуються ресурси в реальному часі.
Відстежуйте продуктивність системи з користувацьким інтервалом у 2 секунди, що дозволяє більш детально переглядати діяльність системи. Впишіть:
sudoatop2
Перемикайтеся між різними видами ресурсів, щоб зосередитися на конкретних аспектах продуктивності системи.
Створіть звіт із файлу журналу про діяльність системи, збираючи дані кожні 60 секунд, тричі. Впишіть:
sudoatop-w/tmp/atop_log603
Після виконання попередньої команди ви можете не поспішати та переглянути двійковий файл, у якому було збережено журнали. Щоб прочитати збережений файл журналу, введіть:
sudoatop-r/tmp/atop_log
Очистіть, видаливши всі створені журнали або файли.
NUMA означає "нерівномірний доступ до пам'яті".
Це конструкція/архітектура комп’ютерної пам’яті, що використовується в багатопроцесорній обробці, яка підвищує швидкість доступу до пам’яті, враховуючи фізичне розташування пам’яті навколо процесорів.
Програма numactl керує політикою NUMA, оптимізуючи продуктивність систем на основі NUMA.
Команда iotop відстежує використання дискового введення/виведення (введення/виведення) процесами та потоками. Він надає інформацію в реальному часі, подібну до команди top, зокрема для дискового вводу-виводу. Це робить його необхідним для діагностики уповільнення роботи системи, викликаного активністю диска.
Встановіть утиліту iotop, якщо вона не встановлена. Впишіть:
sudodnf-yinstalliotop
Щоб використовувати iotop для моніторингу дискового введення-виведення¶
Запустіть команду iotop без будь-яких параметрів, щоб використовувати її в інтерактивному режимі за замовчуванням. Впишіть:
sudoiotop
Спостерігайте за використанням живого диска вводу-виводу різними процесами. Використовуйте це для визначення процесів, які зараз читають або записують на диск.
Запустіть iotop у пакетному режимі (-b), щоб отримати неінтерактивний одноразовий перегляд використання введення-виведення. Параметр -n 10 повідомляє iotop взяти 10 зразків перед виходом.
sudoiotop-b-n10
iotop може фільтрувати введення/виведення для певних процесів. Визначте ідентифікатор процесу (PID) у вашій системі за допомогою команди ps або дисплея iotop. Потім відфільтруйте вихідні дані iotop для цього конкретного PID. Наприклад, фільтруйте PID для процесу sshd, виконавши:
sudoiotop-p$(pgrepsshd|head-1)
Опцію -o з iotop можна використовувати для показу процесів або потоків, які виконують фактичний ввід-вивід, замість відображення всіх процесів або потоків. Відобразити лише процеси вводу-виводу, виконавши:
sudoiotop-o
!!! Question "Обговорення"
Обговоріть вплив дискового вводу-виводу на загальну продуктивність системи та як такі інструменти, як `iotop`, можуть допомогти в оптимізації системи.
Використовуйте команду ls, щоб дослідити вміст і структуру файлової системи cgroup. Впишіть:
ls/sys/fs/cgroup/
Знову скористайтеся командою ls, щоб отримати список папок *.slice у файловій системі cgroup. Впишіть:
ls-d/sys/fs/cgroup/*.slice
Папки з суфіксом .slice зазвичай використовуються в systemd для представлення фрагмента системних ресурсів. Це стандартні cgroups, якими керує systemd для організації та керування системними процесами.
Створіть каталог під назвою "exercise_group" у файловій системі /sys/fs/cgroup. У цій новій папці будуть розміщені структури контрольних груп, необхідні для решти цієї вправи. Використовуйте команду mkdir, ввівши:
sudomkdir-p/sys/fs/cgroup/exercise_group
Тепер перелічіть файли та каталоги в структурі /sys/fs/cgroup/exercise_group. Впишіть:
sudols/sys/fs/cgroup/exercise_group/
Вихідні дані показують файли та каталоги, автоматично створені підсистемою cgroup для керування та моніторингу ресурсів для cgroup.
Давайте встановимо обмеження ресурсу пам’яті, щоб обмежити використання пам’яті до 4096 байт (4 КБ). Щоб обмежити процеси в cgroup використовувати максимум 4 Кб пам'яті типу:
Файл /sys/fs/cgroup/exercise_group/cgroup.procs можна використовувати для додавання або перегляду PID (ідентифікаторів процесів) процесів, які є членами даної cgroup. Запис PID до цього файлу призначає процес сценарію ~/memory_stress.sh групі cgroup.
Попередня команда завершиться дуже швидко, тому що вона перевищила обмеження пам’яті cgroup. Ви можете запустити таку команду journalctl в іншому терміналі, щоб переглянути помилку, як вона відбувається. Впишіть:
journalctl-xe-f|grep-imemory
!!! tip "Порада"
Ви можете швидко скористатися командою ps, щоб перевірити приблизне використання пам'яті процесом, якщо вам відомий PID процесу, запустивши:
```bash
pidof <PROCESS_NAME> | xargs ps -o pid,comm,rss
```
Цей вихід має відображати розмір резидентного набору (RSS) у КБ, що вказує на пам’ять, яку використовує вказаний процес у певний момент часу. Кожного разу, коли значення RSS процесу перевищує ліміт пам’яті, вказаний у значенні memory.max `cgroup's`, процес може підлягати політикам керування пам’яттю, які застосовуються ядром або самою `cgroup`. Залежно від конфігурації системи, система може виконувати такі дії, як обмеження використання пам’яті процесом, припинення процесу або ініціювання події браку пам’яті (OOM).
Вихідні дані мають показувати використання ЦП у реальному часі процесом yes. %CPU для так має бути обмежено конфігурацією cgroup (наприклад, близько 10%, якщо обмеження встановлено на 10000).
Встановіть та поекспериментуйте з іншими значеннями для cpu.max для cgroup групи виконання, а потім спостерігайте за ефектом кожного разу, коли ви повторно запускаєте сценарій ~/cpu_stress.sh у контрольній групі.
Щоб визначити та вибрати основний запам'ятовуючий пристрій¶
Основний запам'ятовуючий пристрій може бути ціллю для встановлення обмежень на ресурси введення-виведення. Пристрої зберігання даних у системах Linux мають основні та другорядні номери пристроїв, які можна використовувати для їх унікальної ідентифікації.
По-перше, давайте створимо набір допоміжних змінних для визначення та збереження номера пристрою для основного пристрою зберігання на сервері. Впишіть:
Щоб підтвердити контроль використання ресурсів введення-виведення процесу¶
Перевірте використання вводу-виводу процесом, виконавши:
iotop-p$MYPID
Вихідні дані відображатимуть швидкість читання/запису вводу/виводу для процесу io_stress.sh, яка не повинна перевищувати 1 МБ/с відповідно до обмеження.
CPU affinity прив’язує конкретні процеси або потоки до певних ядер ЦП у багатоядерній системі. Ця вправа демонструє використання taskset для встановлення або отримання спорідненості ЦП процесу в Linux.
Отримайте поточну спорідненість для процесу dd. Впишіть:
taskset-p$MYPID
Вихід
pid1211483'scurrentaffinitymask:f
Вихідні дані показують маску спорідненості ЦП процесу з PID 1211483 ($MYPID), представленим у шістнадцятковому форматі. У нашому прикладі системи відображається маска спорідненості «f», що зазвичай означає, що процес може виконуватися на будь-якому ядрі ЦП.
!!! note "Примітка"
Маска спорідненості ЦП "f" представляє конфігурацію, у якій увімкнено всі ядра ЦП. У шістнадцятковій системі числення «f» відповідає двійковому значенню «1111». Кожен біт у двійковому представленні відповідає ядру ЦП, причому «1» означає, що ядро ввімкнено та доступне для виконання процесу.
Тому на чотириядерному процесорі з маскою "f":
Core 0: Enabled
Core 1: Enabled
Core 2: Enabled
Core 3: Enabled
Встановіть приналежність ЦП процесу dd до одного ЦП (ЦП 0). Впишіть:
taskset-p0x1$MYPID
Вихід
pid1211483's current affinity mask: fpid 1211483'snewaffinitymask:1
Перевірте зміни, виконавши:
taskset-p$MYPID
Вихідні дані вказують на маску спорідненості ЦП процесу з PID $MYPID. Маска спорідненості дорівнює «1» у десятковій системі, що перекладається як «1» у двійковій системі. Це означає, що процес наразі прив’язаний до ядра ЦП 0.
Тепер встановіть приналежність ЦП процесу dd до кількох ЦП (ЦП 0 і 1). Впишіть:
taskset-p0x3$MYPID
Видайте правильну команду tasksel, щоб перевірити останню зміну.
taskset-p$MYPID
На нашому демонстраційному 4-ядерному сервері ЦП результат показує, що маска спорідненості ЦП процесу дорівнює «3» (у десятковому вигляді). Це означає «11» у двійковій системі.
!!! tip "Підказка"
Десятковий "3" дорівнює "11" (або 0011) у двійковій системі.
Кожна двійкова цифра відповідає ядру ЦП: ядро 0, ядро 1, ядро 2, ядро 3 (справа наліво).
Цифра «1» на четвертій і третій позиціях (справа) означає, що процес може працювати на ядрах 0 і 1.
Тому «3» означає, що процес прив’язаний до ядер ЦП 0 і 1.
Запустіть утиліту top або htop в окремому терміналі та спостерігайте, якщо ви бачите щось цікаве, експериментуючи з різними конфігураціями taskset для процесу.
Все готово. Використовуйте його PID ($MYPID), щоб припинити процес dd.
Команда systemd-run створює та запускає тимчасові службові блоки для виконання команд або процесів. Вона також може запускати програми в блоках тимчасової області дії, блоках обслуговування, що запускаються шляхом, сокетом або таймером.
У цій вправі показано, як використовувати systemd-run для створення тимчасових службових одиниць у systemd.
`systemd.resource-control` — це конфігурація або керуюча сутність (концепція) у рамках `systemd`, призначена для керування та розподілу системних ресурсів для процесів і служб. А `systemd.exec` — це компонент `systemd`, який відповідає за визначення середовища виконання, у якому виконуються команди. Щоб переглянути різні параметри (властивості), які ви можете налаштувати під час використання systemd-run, зверніться до сторінок посібника `systemd.resource-control` і `systemd.exec`. Тут ви знайдете документацію для таких властивостей, як MemoryMax, CPUAccounting, IOWeight тощо.
Щоб установити обмеження на ресурс ЦП для тимчасової служби¶
Давайте створимо тимчасовий блок systemd під назвою "myrealtime.service". Запустіть myrealtime.service із спеціальною політикою планування циклічного (rr) і пріоритетом. Впишіть:
Створіть простий таймер, який виконує просту команду echo. Параметр --on-active=2m встановлює таймер на спрацьовування через 2 хвилини після того, як блок таймера стане активним. Впишіть:
Введіть наступні команди, щоб переконатися, що різні тимчасові служби/процеси, запущені для цієї вправи, належним чином зупинені та видалені з вашої системи. Впишіть:
Ця вправа демонструє використання schedtool для розуміння та керування плануванням процесів у Rocky Linux. Ми також створимо сценарій для моделювання процесу для цієї мети.