Zabbix: мониторим всё подряд (на примере redis’а)

Содержание:

Known Issues

To be able to measure temperature on macOS I created a little additional package. Due to some difficulties
in NPM with I unfortunately was getting unexpected warnings on other platforms.
So I decided to drop this optional dependency for macOS — so by default, you will not get correct values.

But if you need to detect macOS temperature just run the following additional
installation command:

$ npm install osx-temperature-sensor --save

will then detect this additional library and return the temperature when calling systeminformations standard function

— which is used to determine temperature and battery sometimes needs to be run with admin
privileges. So if you do not get any values, try to run it again with according
privileges. If you still do not get any values, your system might not support this feature.
In some cases we also discovered that returned incorrect temperature values.

In some cases you need to install the linux package to be able to measure temperature
e.g. on DEBIAN based systems by running

To be able to detect S.M.A.R.T. status on Linux you need to install . On DEBIAN based linux distributions you can install it by running

atop

Основным преимуществом утилиты atop является функция ведения логов. Благодаря этому можно не только контролировать нагрузку в текущий момент, но и отслеживать работу процессов за прошедшие дни, чтобы диагностировать плавающие ошибки, которые сложно «поймать» при мониторинге в реальном времени.

Утилиту необходимо установить на сервер:

Ubuntu / Debian:

apt-get install atop -y

CentOS:

yum install atop -y

Также рекомендуем добавить atop в автозагрузку:

Ubuntu / Debian / CentOS 7:

systemctl enable atop

CentOS 6:

chkconfig atop on

Ubuntu 14.04:

rm /etc/init/atop.override

Запустите утилиту:

atop

Вывод выглядит примерно следующим образом:

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

Для управления выводом можно использовать:

m — сортировка по используемой памяти

d — сортировка по нагрузке на диск

u — нагрузка по пользователям

v — подробная информация по процессам

i — изменение интервала обновления данных (по умолчанию 10 секунд)

g — вернуть вывод по умолчанию

n — сортировка процессов по нагрузке на сеть (доступна при наличии установленного патча ядра)

Сочетания клавиш с Shift выстроят текущий список процессов по соответствующим параметрам:

  • Shift + m — сортировка процессов памяти
  • Shift + с — сортировка по потреблению CPU (по умолчанию)
  • Shift + d — сортировка по использованию диска
  • Shift + n — сортировка по использованию сети

Логи atop

По умолчанию atop собирает сведения о состоянии системы каждые 10 минут и сохраняет их в файл лога, располагающийся в директории

Чтобы просмотреть лог за сегодня, выполните:

atop -r

Полезные клавиши:

  • t — перейти вперед по времени
  • Shift + t — перейти назад по времени

Файл за конкретный день имеет имя . Чтобы просмотреть лог за нужный день, используйте команду atop -r и укажите путь к файлу, например:

atop -r /var/log/atop/atop_20200227

Изменить настройки ведения лога можно в конфигурационном файле atop, который размещается по пути  или — в CentOS.

# Интервал создания снимка нагрузки сервера, в секундах:
INTERVAL=600
 
# Путь к директории с логами:
LOGPATH="/var/log/atop"
 
# Имя файла логов
OUTFILE="$LOGPATH/daily.log"

Например, для того, чтобы atop делал снимок нагрузки раз в минуту, а не раз в 10 минут, укажите интервал 60. 

После внесения изменений перезапустите atop:

systemctl restart atop.service

Параметры мониторинга

Плагин, который я анализировал, предполагал выполнение отдельной команды для получения отдельного параметра (элемента данных, item’а):

Т.е., для получения данных по 12 параметрам агент должен будет 12 раз выполнить различные наборы команд. А если мне нужно мониторить параметры, которые сложно извлечь цепочкой команд и нужно будет писать отдельный shell-скрипт или полноценную программу? Для таких «хотелок» Zabbix предлагает вариант с зависимыми элементами данных. Суть его в том, что на стороне агента скриптом формируется набор данных (например, в формате JSON), который передаётся на сервер в виде строкового параметра. Затем на стороне сервера происходит разбор полученных данных и вычленение из них отдельных элементарных параметров.

Основной элемент данных

Я описал основной элемент данных строкового типа с периодом обновления в 1 мин., без сохранения истории изменений:

Предположительно, на стороне агента должен генерироваться такой JSON:

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

Зависимый элемент данных

Тестовый параметр зависит от и сохраняет свои значения в базе в течение 90 дней. Периодичность мониторинга параметра зависит от базового элемента ():

Значение параметра извлекается из значения при помощи инструкций JSONPath:

По аналогичной схеме описываются остальные зависимые элементы данных (параметры мониторинга), которые передаются в виде JSON’а. Вот пример описания числового параметра :

Формула для извлечения значения из JSON’а:

Вычисляемый элемент данных

Для вычисления фрагментации памяти используется отношение / и на его базе определяется триггер, срабатывающий при превышении отношением значения 1.5. В Zabbix’е есть вычисляемый тип элементов данных:

Значение для параметра вычисляется каждую минуту на основании последних значений двух других параметров ( и ), сохраняется в базе в течение 90 дней и т.д.

Important Warning about All Stress Tests

Before we begin, we have to warn you about the inherent dangers of running stress tests. The software that we’re presenting might not just produce a full load, but also potentially push beyond manufacturer-defined power limits. Using these so-called «power viruses» can result in damage to the system, especially if they’re used for extended periods of time. Those who want to use these applications assume all responsibility for the outcome. Be sure to continuously monitor relevant parameters, including temperatures, with accurate and up-to-date utilities. At least you’ll be able to abort your testing immediately if it becomes necessary.

Что такое proc?

На самом деле папка proc — это совсем необычная папка. Ее не существует на диске или даже в оперативной памяти, как это делается в /tmp. Все поддиректории, файлы и хранящаяся в них информация генерируется ядром на лету, как только вы ее запрашиваете. Но работает все настолько прозрачно, что вы не заметите никакой разницы между обычной файловой системой и proc, если откроете ее с помощью файлового менеджера.

Только папка proc linux содержит файлы нулевого размера. А также у каждого файла будет текущая дата создания. Например файл /proc/meminfo будет содержать разные данные при каждом открытии, поскольку использование памяти постоянно колеблется.

С помощью такой системы разработчики придерживаются главной концепции Unix — все есть файл. Все файлы доступны для редактирования любым редактором, и все они в простом текстовом формате, но для того чтобы проанализировать весь каталог вам понадобятся права суперпользователя. Почти все файлы доступны только для чтения, с них мы можем только получать информацию. Но есть и доступные для записи, в частности это /proc/sys с помощью которого вы можете настраивать различные параметры ядра.

Загрузка системы

Загрузка системы

top - 10:12:16 up 1 day, 57 min,  3 users,  load average: 0.48, 0.94, 1.19
  • текущее время;
  • up time — время работы системы после включения питания;
  • user — количество пользователей, которые в данный момент работают в системе;
  • load average — общая средняя загрузка системы (измеряется каждые 1, 5 и 15 минут). Общей средней загрузкой системы называется среднее число процессов, находящихся в состоянии выполнения (R) или в состоянии ожидания (D), эту информацию можно увидеть в колонке S вывода команды top, она может принимать 5 значений:

           'D' = uninterruptible sleep (состояние ожидания)
           'R' = running (состояние выполнения)
           'S' = sleeping
           'T' = traced or stopped
           'Z' = zombie

Copyright Information

Linux is a registered trademark of Linus Torvalds. Apple, macOS, OS X are registered trademarks of Apple Inc.,
Windows is a registered trademark of Microsoft Corporation. Node.js is a trademark of Joyent Inc.,
Intel is a trademark of Intel Corporation, AMD is a trademark of Advanced Micro Devices Inc.,
Raspberry Pi is a trademark of the Raspberry Pi Foundation, Debian is a trademark of the Debian Project,
Ubuntu is a trademark of Canonical Ltd., FreeBSD is a registered trademark of The FreeBSD Foundation,
NetBSD is a registered trademark of The NetBSD Foundation, Docker is a trademark of Docker, Inc., Sun,
Solaris, OpenSolaris and registered trademarks of Sun Microsystems.

All other trademarks are the property of their respective owners.

Scaling governors

Governor Description
performance Run the CPU at the maximum frequency.
powersave Run the CPU at the minimum frequency.
userspace Run the CPU at user specified frequencies.
ondemand Scales the frequency dynamically according to current load. Jumps to the highest frequency and then possibly back off as the idle time increases.
conservative Scales the frequency dynamically according to current load. Scales the frequency more gradually than ondemand.
schedutil

Depending on the scaling driver, one of these governors will be loaded by default:

  • for AMD and older Intel CPU.
  • for Intel CPUs using the driver (Sandy Bridge and newer).

Warning: Use CPU monitoring tools (for temperatures, voltage, etc.) when changing the default governor.

To activate a particular governor, run:

# cpupower frequency-set -g governor

Note:

  • To adjust for only a single CPU core, append to the command above.
  • Activating a governor requires that specific kernel module (named ) is loaded. As of kernel 3.4, these modules are loaded automatically.

Alternatively, you can activate a governor on every available CPU manually:

# echo governor > /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

where is the name of the governor, mentioned in the above table, that you want to activate.

Tip: To monitor cpu speed in real time, run:

$ watch grep \"cpu MHz\" /proc/cpuinfo

Switching threshold

To set the threshold for stepping up to another frequency:

# echo -n percent > /sys/devices/system/cpu/cpufreq/<governor>/up_threshold

To set the threshold for stepping down to another frequency:

# echo -n percent > /sys/devices/system/cpu/cpufreq/<governor>/down_threshold

Sampling rate

The sampling rate determines how frequently the governor checks to tune the CPU. is a tunable that multiplies the sampling rate when the CPU is at its highest clock frequency thereby delaying load evaluation and improving performance. Allowed values for are 1 to 100000. This tunable has no effect on behavior at lower CPU frequencies/loads.

To read the value (default = 1), run:

$ cat /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor

To set the value, run:

# echo -n value > /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor

Make changes permanent

To have the desired scaling enabled at boot, and systemd-tmpfiles are regular methods.

For example, changing the up_threshold to 10:

/etc/tmpfiles.d/ondemand.conf
w- /sys/devices/system/cpu/cpufreq/ondemand/up_threshold - - - - 10

However, as noted in systemd-tmpfiles, in some cases race conditions may exist and one can use udev to avoid them.

For example, to set the scaling governor of the CPU core to performance while the scaling driver is , create the following udev rule:

/etc/udev/rules.d/50-scaling-governor.rules
SUBSYSTEM=="module", ACTION=="add", KERNEL=="acpi_cpufreq", RUN+="/bin/sh -c 'echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor'"

To have the rule already applied in the initramfs, follow the example at .

Tip: Alternatively, configure the utility and enable its systemd service.

*: Additional Notes

In , and the results / sec. values (rx_sec, IOPS, …) are calculated correctly beginning
with the second call of the function. It is determined by calculating the difference of transferred bytes / IOs
divided by the time between two calls of the function.

The first time you are calling one of this functions, you will get for transfer rates. The second time, you should then get statistics based on the time between the two calls …

So basically, if you e.g. need a values for network stats every second, your code should look like this:

constsi=require('systeminformation');setInterval(function(){si.networkStats().then(data=>{console.log(data);})},1000)

Beginning with the second call, you get network transfer values per second.

Более подходящие метрики

Рост средних нагрузок в Linux означает повышение потребности в ресурсах (процессоры, диски, некоторые блокировки), но вы не уверены, в каких. Чтобы пролить на это свет, можно использовать другие метрики. Например, для процессора:

  • использование каждого процессора (per-CPU utilization): например, используя .
  • использование процессора для каждого процесса (per-process CPU utilization): например, и так далее.
  • задержка очереди выполнения (диспетчера) для каждого потока (per-thread run queue (scheduler) latency): например, в /proc/PID/schedstats, delaystats, perf sched
  • задержка очереди выполнения процессора (CPU run queue latency): например, в , , моём инструменте runqlat bcc.
  • длина очереди выполнения процессора (CPU run queue length): например, используя vmstat 1 и колонку ‘r’, или мой инструмент .

Первые две — метрики использования, последние три — метрики насыщения (saturation metrics). Метрики использования полезны для оценки рабочей нагрузки, а метрик насыщения — для идентификации проблем с производительностью. Лучшая метрика насыщения для процессора — измерение задержки очереди выполнения (или диспетчера): это время, проведённое задачей/потоком в состоянии готовности к выполнению, но вынужденным ждать своей очереди. Это позволяет вычислить тяжесть проблем с производительностью. Например, какая часть времени тратится потоком на задержки диспетчера. А измерение длины очереди позволяет предположить лишь наличие проблемы, а её серьёзность оценить сложнее.

В Linux 4.6 функция () стала настраиваться ядром, и по умолчанию выключена. Подсчёт задержек (delay accounting) отражает ту же метрику задержки диспетчера из cpustat, и я предложил добавить её также в htop, чтобы людям было проще ею пользоваться. Проще, чем, к примеру, собирать метрику длительности ожидания (задержка диспетчера) из недокументированных выходных данных /proc/sched_debug:

Помимо процессорных метрик, можете анализировать метрики использования и насыщения для дисковых устройств. Я анализирую их в методе USE, у меня есть Linux-чеклист.

Хотя существуют более явные метрики, это не означает, что средние значения нагрузки бесполезны. Они успешно используются в политиках масштабирования облачных микросервисов наряду с другими метриками. Это помогает микросервисам реагировать на увеличение разных типов нагрузки, на процессор или диски. Благодаря таким политикам безопаснее ошибиться при масштабировании (теряем деньги), чем вообще не масштабироваться (теряем клиентов), так что желательно учитывать больше сигналов. Если масштабироваться слишком сильно, то на следующий день можно будет найти причину.

Одна из причин, по которой я продолжаю использовать средние нагрузки, — это их историческая информация

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

Другие связки из простых команд для загрузки ЦПУ

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

Кроме того, можно поэкспериментировать и с другими командами и программами, которые по умолчанию доступны почти в каждом дистрибутиве GNU Linux.

Суть построения подобных связок из команд следующая:

  1. Что-то откуда-то беспрерывно считываем и перенаправляем в /dev/null;
  2. Выполняем бесконечный анализ данных какой-то программой или утилитой.

Следующая связка позволяет загрузить одно ядро под самый потолок:

Рис. 4. Нагружаем одно ядро CPU по максимуму на 100% командой cat в GNU Linux.

Суть команды: при помощи команды «cat» выполняем вывод бесконечного потока дынных из псевдо-устройства «/dev/zero» (генерирует нули, 000) в пустоту «/dev/null«;

Как видим процесс у нас выполняется с высоким приоритетом (приоритет ядра ОС) и требует для выполнения всю вычислительную мощность одного процессорного ядра.

Для считывания данных из файла псевдо-устройства можно использовать программу «dd».

Суть команды: с помощью программы «dd» (if — input file, of — output file) читаем поток случайных данных из /dev/urandom и отправляем их в «никуда» — /dev/null.

Результат мониторинга загрузки ядер в HTOP получим такой же как и на рисунке 4.

А теперь загрузим процессор подсчетом контрольной суммы бесконечного файла с нулями:

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

Грузим CPU просчитывая MD5-сумму бесконечного потока случайных данных:

График загрузки будет идентичен тому что на рисунке 4, микропроцессор загружен процессом, который работает на уровне ядра ОС, очень высокий приоритет.

Наблюдаем за нагрузкой отдельных ядер CPU

Для удобного наблюдения за нагрузкой на каждое из ядер микропроцессора можно использовать программу «System Monitor», которая входит в состав рабочего окружения KDE. Программа с похожим функционалом и таким же названием есть и в среде GNOME.

Рис. 1. Мониторим загрузку двух ядер CPU в GNU Linux используя System Monitor из KDE.

На рисунке результат загрузки двух ядер связкой из двух команд которая были рассмотрена выше. Одно ядро — оранжевй график (70%), другое ядро — желтый график (40%).

С такой же задачей, только в консоли, отлично справляется утилита «htop», которая должна быть знакома почти каждому системному администратору. Если у вас она не установлена то исправить ситуацию можно командой:

Для запуска этого консольного монитора ресурсов используем одноименную команду:

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

Рис. 2. Мониторинг нагрузки двух ядер CPU в GNU Linux используя HTOP.

Что же означают в HTOP красные и зеленые отметки в прогресс-барах для ядер CPU? — все проще простого:

  • зеленый цвет — количество ресурсов процессора, выделенные под процессы с нормальным приоритетом;
  • красный цвет — ресурсы CPU, выделяемые процессам с приоритетом ядра.

О том как узнать частоту установленного микропроцессора(ров), режимы работы ядер и другую полезную информацию я писал в одной их предыдущих статей о CPU в GNU Linux.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *