Администрирование сервера. Настройка производительности с помощью команд управления процессом в Linux

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Привет, хабровчане. Для будущих студентов курса "Administrator Linux.Basic" подготовили перевод материала.

Приглашаем также всех желающих на демо-занятие «Iptables». На этом вебинаре рассмотрим:
— Что такое iptables. Понятие сетевого фильтра, принцип работы
— Как устроен iptables
— Как обрабатываются пакеты и как применяются правила
— Пример работы с утилитой


При администрировании сервера очень важно понимать, как работают выполняемые процессы в подробностях — от высокой нагрузки до замедленного времени отклика. В случае, когда ваш сервер становится слишком медленным или не реагирует, вы должны разбираться в управлении процессами или в управлении процессами Linux.

Когда наступает время убить (kill) процесс или изменить (renice) его — как тогда осуществлять мониторинг (monitor) текущих процессов,  как эти процессы влияют на загрузку системы. Давайте посмотрим, как управление процессами в Linux поможет нам настроить систему.

Содержание

  1. Виды процессов

  2. Управление памятью

  3. Управление виртуальной памятью с помощью утилиты vmstat

  4. Нагрузка системы и команда top

  5. Мониторинг ввода/вывода диска (Disk I/O) с помощью консольной утилиты iotop

  6. Команда ps

  7. Мониторинг “здоровья” системы (Monitoring System Health) с помощью команд iostat и lsof

  8. Расчет нагрузки системы

  9. Утилиты pgrep и systemctl

  10. Управление сервисами с помощью функции systemd

  11. Nice и Renice процессы

  12. Отправка сигнала kill

Виды процессов

Прежде чем мы начнем говорить об управлении процессами в Linux, рассмотрим типы процессов. 

Существуют следующие типы процессов:

  • Родительский процесс (Parent process)

  • Дочерний процесс (Child process)

  • Процесс-сирота (Orphan Process)

  • Демон-процесс (Daemon Process)

  • Зомби-процесс (Zombie Process)

Родительский процесс — это процесс, который выполняет системный вызов fork(). Все процессы, кроме процесса 0, имеют один родительский процесс.

Дочерний процесс создается родительским процессом.

Процесс-сирота, который продолжается в то время, как его родительский процесс остановлен или завершен.

Демон-процесс всегда создается из дочернего процесса, а затем выходит из него.

Зомби-процесс существует в таблице процессов, хотя и завершился.

Процесс-сирота — это процесс, который все еще выполняется, когда его родительский процесс «умер». При этом процессы-сироты не становятся зомби-процессами.

Управление памятью

В администрировании сервера управление памятью является одной из ваших обязанностей, о которой вы должны заботиться как системный администратор.

Одной из наиболее часто используемых команд в управлении процессами Linux является команда free:

$ free –m

Опция -m для используется для отображения значений в мегабайтах.

Наша главная забота в buff/cache памяти.

Отображение вывода команды free здесь означает, что мы используем 536 мегабайт, в то время как 1221 мегабайт доступен.

Вторая строка — своп (swap). Подкачка (swapping) происходит, когда память становится переполненной.

Первое значение — общий размер подкачки, который составляет 3070 мегабайт.

Второе значение — использованный объем подкачки, который равен 0.

Третье значение — доступный для использования своп, равный 3070.

Из приведённых выше результатов можно сказать, что состояние памяти хорошее, так как подкачка не используется. Раз уж мы заговорили о подкачке, давайте посмотрим, что же предоставляет нам каталог proc по этому поводу.

$ cat /proc/swaps

Эта команда показывает размер файла подкачки и сколько мы используем:

$ cat /proc/sys/vm/swappiness

Эта команда показывает значение от 0 до 100; данное значение означает, что система будет использовать своп, если память будет загружена на 70%.

Обратите внимание: значение по умолчанию для большинства дистрибутивов для этого параметра находится в диапазоне от 30 до 60, вы можете изменить его таким образом:

$ echo 50 > /proc/sys/vm/swappiness

Или используя команду sysctl как здесь:

$ sudo sysctl -w vm.swappiness=50

Изменение значения swappiness с помощью вышеуказанных команд не является постоянным, вы должны записать его в файл /etc/sysctl.conf вот так:

$ nano /etc/sysctl.conf

vm.swappiness=50

Уровень подкачки оценивает возможность переноса процесса из оперативной памяти в пространство подкачки.

Выбор точного значения swappiness для вашей системы предполагает определенные исследования, чтобы выбрать наилучшее значение для вашего сервера.

Управление виртуальной памятью с помощью vmstat

Другая важная команда, используемая в управлении процессами в Linux, это vmstat. Команда vmstat дает обобщенный отчет о памяти, процессах и подкачках.

$ vmstat -a

Мы используем опцию -a, чтобы отобразить все активные и неактивные процессы.

Вот основные колонки, выводимые с помощью этой команды:

si:

Сколько было загружено с диска.

so:

Сколько было выгружено на диск.

bi:

Сколько отправлено на блочные устройства.

bo:

Сколько получено от блочных устройств.

us:

Время пользователя.

sy:

Системное время.

id:

Время ожидания.

Нашей главной заботой являются столбцы (si) и (so), где (si) столбец показывает загрузку страниц, в то время как (so) столбец показывает выгрузку закачанных ранее страниц из оперативной памяти.

Лучший способ посмотреть на эти значения — просматривать вывод (output), используя такую опцию задержки:

$ vmstat 2 5

Где 2 — задержка в секундах и 5 — сколько раз мы будем вызывать vmstat. Он показывает пять обновлений команды, и все данные в килобайтах.

Page-in (загрузка страниц) (si) происходит при запуске приложения, и информация загружается в память. Page out (выгрузка страниц) (so) происходит, когда ядро освобождает память.

Нагрузка системы и команда top

В управлении процессами Linux команда top предоставляет список запущенных процессов и то, как они используют процессор и память; на выходе — это данные в реальном времени.

Если у вас двухъядерная система, в которой первое ядро может работать на уровне 40%, а второе — на 70%, то в этом случае команда top может показать суммарный результат на уровне 110%, но вы не будете знать индивидуальные показатели для каждого из них в отдельности.

$ top -c

Мы используем опцию -c, чтобы показать командную строку или исполняемый путь для этого процесса.

Вы можете нажать клавишу 1 во время просмотра статистики команды top, чтобы показать состояние отдельных процессоров.

Имейте в виду, что некоторые процессы возникают как дочерние; вы увидите несколько процессов для одной и той же программы, такие как httpd и PHP-fpm.

Вы не должны полагаться только на команду top; просмотрите другие ресурсы перед тем, как сделать окончательное действие.

Мониторинг ввода/вывода (I/O) диска с помощью iotop

В результате высокой интенсивности использования диска система начинает работать медленно, поэтому важно контролировать его состояние. Это предполагает необходимость выяснить, какие процессы или пользователи вызывают эту дисковую активность.

Команда iotop в управлении процессами Linux помогает нам следить за дисковым вводом/выводом в режиме реального времени. Вы можете ее установить, если она отсутствует:

$ yum install iotop

При запуске iotop без каких-либо опций появится список всех процессов.

Для просмотра процессов, вызывающих активность на диске, необходимо использовать опцию -o:

$ iotop -o

Вы можете легко узнать, какая программа воздействует на систему.

команда ps

Мы уже говорили о команде ps в предыдущем посте и о том, как упорядочить процессы по использованию памяти и процессора.

Monitoring System Health (Мониторинг "Здоровья" Системы) с помощью iostat и lsof

Команда iostat предоставляет отчет о загрузке процессора (CPU), его можно просматривать с помощью опции -c.

$ iostat -c

Результат вывода (output result) легко понять, но если система занята, вы увидите возрастание %iowait. Это означает, что сервер передает или копирует много файлов.

С помощью этой команды вы можете проверить операции чтения и записи, так что вы должны хорошо знать, что именно подвешивает ваш диск, и принять правильное решение.

Кроме того, мы используем команду lsof, чтобы перечислить открытые файлы:

Команда lsof показывает: какой исполнительный модуль использует файл, идентификатора процесса, пользователя и имя открываемого файла.

Расчет нагрузки системы

Расчет нагрузки системы очень важен для управления процессами в Linux. Нагрузка системы — это объем обрабатываемых данных для системы, которая в данный момент работает. Это не идеальный способ измерения производительности системы, но это дает вам некоторые сведения.

Вы можете рассчитать нагрузку таким образом:

Actual Load = Total Load (uptime) / No. of CPUs 

Фактическая нагрузка = Общая нагрузка (время бесперебойной работы) / Количество процессоров.

Вы можете рассчитать время бесперебойной работы выполнив команды "uptime" или "top":

$ uptime
$ to

Команда top показывает загрузку сервера через 1, 5 и 15 минут.

Как видно, средняя загрузка составляет 0.00 на первой минуте, 0.01 на пятой минуте и 0.05 на пятнадцатой минуте.

При увеличении нагрузки система ставит процессоры в очередь, а при большом количестве процессорных ядер система равномерно распределяет нагрузку по ядрам сервера, чтобы сбалансировать работу.

Можно сказать, что хорошее среднее значение нагрузки составляет около 1. Это не означает, что если загрузка превышает 1, то возникает проблема, но если вы начинаете видеть большие числа в течение долгого времени, то это означает высокую нагрузку, и тогда это будет проблемой.

pgrep и systemctl

Идентификатор процесса (process ID) можно узнать с помощью команды pgrep, за которой следует имя службы.

$ pgrep servicename

Эта команда показывает идентификатор процесса (process ID) или PID.

Обратите внимание, если эта команда показывает больше, чем идентификатор процесса, например, httpd или SSH, то наименьший идентификатор процесса — это идентификатор родительского процесса (parent process ID).

С другой стороны, вы можете использовать команду systemctl, чтобы получить основной PID, подобный этому:

$ systemctl status <service_name>.service

Существует больше способов получить требуемый ID процесса или ID родительского процесса, но этот способ прост и понятен.

Управление сервисами с помощью systemd

Если мы собираемся говорить об управлении процессами в Linux, нам следует взглянуть на systemd. Systemd управляет и контролирует сервисы на современных системах Linux, таких как CentOS 7.

Вы можете запускать, останавливать и проверять статус так:

$ systemctl status <service_name>.service

$ systemctl stop <service_name>.service

$ systemctl start <service_name>.service

Вместо того, чтобы использовать команду chkconfig для включения и отключения службы во время загрузки, вы можете применить команду systemctl:

$ systemctl enable <service_name>.service

$ systemctl disable <service_name>.service

Systemd также поставляется со своей версией команды top, и для того, чтобы показать процессы, принадлежащие определенной службе; вы можете использовать команду system-cgtop вот так:

$ systemd-cgtop

Как видите, все связанные с этим процессы, пути, количество задач, % используемого процессора, распределение памяти, а также входы и выходы связаны между собой.

Мы можем использовать эту команду для вывода рекурсивного списка служебного контента, подобного этому:

$ systemd-cgls

Эта команда дает нам очень полезную информацию, которую мы можем использовать для принятия решения.

Процессы nice и renice 

Значение процесса nice — это числовой показатель, который относится к процессу и как он “борется” за центральный процессор.

Высокое значение nice указывает на низкий приоритет вашего процесса, так что насколько хорошим вы собираетесь быть для других пользователей — отсюда и появилось это название.

Диапазон значений nice составляет от -20 до +19.

Команда nice устанавливает значение nice для процесса во время создания, в то время как команда renice корректирует это значение позже.

$ nice –n 5 ./myscript

Эта команда увеличивает значение nice, что означает понижение приоритета на 5.

$ sudo renice -5 2213

Эта команда уменьшает значение nice означающее повышенный приоритет, а число (2213) — это PID.

Вы можете увеличить значение nice (меньший приоритет), но не можете уменьшить его (высокий приоритет), в то время как пользователь с правами root может сделать и то, и другое.

Отправка сигнала kill

Для уничтожения (kill) службы или приложения, создающего проблему, можно подать сигнал завершения (SIGTERM). Вы можете просмотреть предыдущий пост о сигналах и заданиях.

$ kill process ID

Мы называем этот метод “безопасным убийством” (safe kill). Однако, в зависимости от вашей ситуации, может быть, нужно принудительно отключить услугу или приложение, как здесь:

$ kill -1 process ID

Иногда безопасное убийство (safe killing) и перезагрузка ничего не могут сделать. В таком случае вы можете послать kill-сигнал SIGKILL, используя опцию -9, которую мы называем “форсированным убийством” (forced kill).

$ kill -9 process ID

При использовании этой команды нет никаких операций по очистке или безопасному выходу, поэтому она не рекомендуется. Тем не менее, вы можете предпринять более правильные действия с помощью команды pkill.

$ pkill -9 serviceName

И вы можете использовать команду pgrep, чтобы убедиться, что все процессы этого сервиса “убиты” (killed).

$ pgrep serviceName

Я надеюсь, что у Вас есть хорошие идеи об управлении процессами Linux и о том, какие эффективные меры следует предпринять для того, чтобы сделать систему жизнеспособной.


Узнать подробнее о курсе "Administrator Linux.Basic". Также приглашаем посетить День открытых дверей курса. На онлайн встрече преподаватель расскажет о программе курса, формате обучения и перспективах для выпускников.

Смотреть вебинар «Iptables».

Источник: https://habr.com/ru/company/otus/blog/550776/


Интересные статьи

Интересные статьи

В поле нашего зрения попала матрица Shield от MITRE, в которой приводятся тактики активной защиты от действий злоумышленников. В отличие от матрицы ATT&CK, которую мн...
Всем привет! Меня зовут Осип, я Android-разработчик в Redmadrobot и я люблю автоматизировать всё, что автоматизируется. В этом мне помогает консоль, поэтому решил поделит...
Первый квартал 2020 года я провел за подготовкой к экзамену OSCP. Поиск информации в Google и множество «слепых» попыток отнимали у меня все свободное время. Особенно непросто оказало...
Все статьи цикла: 1. DeepPavlov для разработчиков: #1 инструменты NLP и создания чат-ботов 2. DeepPavlov для разработчиков: #2 настройка и деплоймент Всем привет! В первой статье из нашег...
Привет, Хабр! Сегодня мы построим систему, которая будет при помощи Spark Streaming обрабатывать потоки сообщений Apache Kafka и записывать результат обработки в облачную базу данных AWS RDS. ...