Введение:springboot2 Услуги по мониторингу проектов , используя библиотеку метрик Micormeter, которая поможет нам отслеживать метрики приложения и отправлять их в Prometheus. Индикаторы мониторинга включают загрузку системы, использование памяти, время ответа приложения, пропускную способность, частоту ошибок и т. д.
Библиотека индикаторов микрометрических измерений собирает индикаторы мониторинга для приложений Springboot и в основном отражается в многочисленных элементах мониторинга JVM.
серийный номер | индекс | тип | значение | оригинальный |
---|---|---|---|---|
1 | logback_events_total | counter | Количество событий уровня ошибки, зарегистрированных в журнале. | Number of error level events that made it to the logs |
2 | system_cpu_usage | gauge | «Недавнее использование процессора» всей системы | The "recent cpu usage" for the whole system |
3 | system_load_average_1m | gauge | Загрузка системы | The sum of the number of runnable entities queued to available processors and the number of runnable entities running on the available processors averaged over a period of time |
4 | system_cpu_count | gauge | Количество процессоров, доступных виртуальной машине Java | The number of processors available to the Java virtual machine |
5 | process_start_time_seconds | gauge | Время запуска процесса (в секундах) с эпохи unix | Start time of the process since unix epoch. |
6 | process_cpu_usage | gauge | «Недавнее использование ЦП» процесса виртуальной машины Java | The "recent cpu usage" for the Java Virtual Machine process |
7 | process_uptime_seconds | gauge | Время работы виртуальной машины Java | The uptime of the Java virtual machine |
8 | process_files_open_files | gauge | Количество открытых файловых дескрипторов | The open file descriptor count |
9 | process_files_max_files | gauge | Максимальное количество файловых дескрипторов | The maximum file descriptor count |
10 | tomcat_sessions_expired_sessions_total | counter | Общее количество истекших сеансов в tomcat | |
11 | tomcat_sessions_rejected_sessions_total | counter | Общее количество отклоненных сеансов Tomcat | |
12 | tomcat_sessions_active_max_sessions | gauge | tomcat_maximum количество активных сессий | |
13 | tomcat_sessions_created_sessions_total | counter | Общее количество созданных сеансов Tomcat | |
14 | tomcat_sessions_active_current_sessions | gauge | Количество текущих активных сессий в tomcat | |
15 | tomcat_sessions_alive_max_seconds | gauge | Максимальное время выживания сеанса Tomcat | |
16 | jvm_classes_loaded_classes | gauge | Количество классов, загруженных в данный момент в виртуальную машину Java. | The number of classes that are currently loaded in the Java virtual machine |
17 | jvm_classes_unloaded_classes_total | counter | Количество не загруженных классов | The total number of classes unloaded since the Java virtual machine has started execution |
18 | jvm_memory_used_bytes | gauge | Использование памяти | The amount of used memory |
19 | jvm_memory_max_bytes | gauge | Максимальный объем памяти в байтах, доступный для управления памятью. | The maximum amount of memory in bytes that can be used for memory management |
20 | jvm_memory_committed_bytes | gauge | Объем памяти, предоставленный виртуальной машине Java для использования (в байтах). | The amount of memory in bytes that is committed for the Java virtual machine to use |
21 | jvm_buffer_memory_used_bytes | gauge | Буфер JVM использовал память | An estimate of the memory that the Java virtual machine is using for this buffer pool |
22 | jvm_buffer_total_capacity_bytes | gauge | Оценка общей емкости буфера | An estimate of the total capacity of the buffers in this pool |
23 | jvm_buffer_count_buffers | gauge | Текущее количество буферов | An estimate of the number of buffers in the pool |
24 | jvm_gc_pause_seconds | summary | Время паузы GC | Time spent in GC pause |
25 | jvm_gc_pause_seconds_max | gauge | Максимальное время паузы GC | Time spent in GC pause |
26 | jvm_gc_max_data_size_bytes | gauge | Максимальный размер пула памяти старого поколения | Max size of old generation memory pool |
27 | jvm_gc_memory_allocated_bytes_total | counter | Размер пула памяти молодого поколения увеличивается после одного GC и перед следующим GC. | Incremented for an increase in the size of the young generation memory pool after one GC to before the next |
28 | jvm_gc_live_data_size_bytes | gauge | Размер пула памяти старого поколения после полного GC | Size of old generation memory pool after a full GC |
29 | jvm_gc_memory_promoted_bytes_total | counter | Подсчет положительного роста размера пула памяти старого поколения от до GC до после GC | Count of positive increases in the size of the old generation memory pool before GC to after GC |
30 | jvm_threads_states_threads | gauge | Количество потоков, находящихся в настоящее время в состоянии НОВОЕ | The current number of threads having NEW state |
31 | jvm_threads_live_threads | gauge | Текущее количество активных потоков, включая потоки-демоны и потоки, не являющиеся демонами. | The current number of live threads including both daemon and non-daemon threads |
32 | jvm_threads_daemon_threads | gauge | Текущее количество потоков демона | The current number of live daemon threads |
33 | jvm_threads_peak_threads | gauge | Пиковое количество потоков JVM | The peak live thread count since the Java virtual machine started or peak was reset |
34 | http_server_requests_seconds | summary | Статус вызова HTTP-запроса | |
35 | http_server_requests_seconds_max | gauge |
Время запуска: Время запуска JVM — то есть: по этому индексу можно узнать время запуска текущей программы.
Uptime: выполнение среды JVM — то есть: по этому индексу можно узнать текущее время работы программы.
Операции ввода-вывода в JVM — очень важная часть приложения, поэтому необходимо отслеживать и измерять соответствующие операции, чтобы обеспечить нормальную работу системы.
На диаграмме скорости: QPS: частота запросов в секунду, которая представляет собой количество запросов, на которые сервер может ответить в секунду. Это мера объема трафика, который конкретный сервер запросов обрабатывает в течение определенного периода времени.
Проще говоря, QPS = req/sec = количество запросов в секунду. Он отражает производительность серверной машины и ее максимальную пропускную способность.
Продолжительность На рисунке: AVG: относится к среднему времени ожидания средней задержки, времени обработки запроса (мин: минимальное значение, макс: максимальное значение, среднее: среднее значение, текущее: в реальном времени).
Подробное объяснение измерения ввода-вывода в JVM и примеры сценариев обнаружения проблем:
Виртуальная машина Java делит кучу памяти на три области: молодое поколение, старое поколение и постоянное поколение. 1. Молодое поколение: Молодое поколение разделено на область Эдема и две области Выжившего (одну от Выжившего и одну до Выжившего). Каждый раз будут использоваться только Эдем и одна из областей Выжившего. Причина такого распределения заключается в том, что молодое поколение использует «. copy» для повторного использования. При создании нового объекта (в большинстве случаев) пространство, занимаемое объектом, будет выделено в области Eden. Если свободного места в области Eden недостаточно, виртуальная машина вызовет Minor. GC, чтобы отделить область Эдема от Объекты, которые все еще живы в области «Выживший», перемещаются в область «Выживший». Если после нескольких второстепенных GC объект все еще жив, он будет перемещен в старое поколение. 2. Старая эпоха (старая) Хранит долговременно сохранившиеся объекты в системе, например, некоторые одноэлементные объекты, размещенные в Spring, такие как объекты обслуживания, объекты dao и т. д. Есть также некоторые объекты, которые передаются из молодого поколения, когда пространство молодого поколения все еще недостаточно после незначительного GC. Эти объекты обычно являются основной причиной полного GC в системе. 3. Постоянная генерация (Пермь) Хранит такие данные, как информация о классе, константы, статические переменные, код, скомпилированный JIT-компилятором, и т. д., которые были загружены виртуальной машиной.
Используемая куча: использование памяти кучи; рассчитывается на основе: используемая память кучи (байты) / размер памяти кучи (байты).
Использовано без кучи: использование памяти вне кучи, рассчитанное на основе: используемой памяти вне кучи (байты) / размера памяти вне кучи (байты);
ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ:
Высокое использование памяти, достигающее более 70% в течение длительного времени;
Когда использование кучи памяти в приложении постоянно велико и не уменьшается. Это неизбежно приведет к исчерпанию ресурсов памяти программы и ее зависанию;
Его можно просмотреть на основе уровня использования старого поколения, если уровень использования превышает 90%;
другой ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ:
Сценарий 1: переполнение памяти, область кучи JVM или область методов не могут вместить сохранившиеся и ожидающие объекты. Например: исключения OOM (нехватка памяти) возникают в системе в периоды пиковой нагрузки, и для оптимизации необходимо обнаружить узкие места в памяти.
Сценарий 2: Утечка памяти: объекты, которые больше не будут использоваться, не могут быть переработаны сборщиком мусора. Например: Полный сбор мусора происходит после того, как система проработала в течение определенного периода времени, или даже периодически необходимо перезапускать OOM вручную, чтобы решить проблему.
Сценарий 3: Высокое использование памяти. Например, если система часто выполняет сборку мусора, необходимо определить причины, влияющие на производительность, стабильность и пропускную способность службы в реальном времени.
Анализ проблем (возникающие проблемы включают в себя):
1. Проблема с распределением памяти
2. Длительное хранение больших объектов supersql потребляет память.
3. Проблема тупика
4. Существует множество длинных связей в опросах или других причин, которые приводят к увеличению тредов Art of War.
Для анализа конкретной проблемы обратитесь к следующему индексу мониторинга.
JVM Подробное объяснение Memoryindex и пример того, как обнаружить проблемные сценарии в производственной среде: JVM Индекс памяти включает в себя следующие аспекты:
2. JVM Non-Heap Память. Память без кучи относится к области памяти в JVM, в которой хранится информация о классах, информация о методах, константы и другие данные. Не-куча Memoryиндекс Можно разделить на следующие размеры:
3. Общее использование памяти JVM JVM
Подводя итог, отслеживая JVM в Micrometer Memoryиндекс,Может обнаружить некоторые проблемы с памятью в производственной среде.,Затем примите соответствующие меры по оптимизации для улучшения производительности системы.
PS Eden Space: Новое поколение
PS Old Gen: старое поколение
Как правило, в новое поколение будут помещаться только те объекты, которые не были переработаны после определенного количества сборок мусора. Мы считаем, что эти объекты будут существовать в течение длительного времени, поэтому мы перенесем их в хранилище. район старого поколения.
PS Survivor Space: Новое поколение
Если сборщик мусора не отсортирует уцелевшие объекты после переработки объектов мусора, в памяти останется много прерывистого пространства, что мы часто называем фрагментацией пространства. Поскольку непрерывного распределения пространства не существует, это может вызвать у нас большую проблему. У нас нет соответствующего непрерывного распределения пространства для объектов, но на самом деле в памяти есть общее пространство, которое может вместить объекты.
Поэтому, чтобы уменьшить подобную фрагментацию пространства, мы использовали другой метод, чтобы разделить новое поколение на область Эдема и область Выжившего. При выполнении сбора мусора сначала скопируйте уцелевшие объекты в область Выжившего, а затем объедините область Эдема. . Очистите, чтобы область Эдема была сплошным пространством после каждого GC.
2. Индекс пула памяти можно разделить на следующие измерения:
Мониторинг индекса JVM Memory Pools(Heap) позволяет обнаружить следующие проблемы:
Подводя итог, Мониторинг JVM Memory Pools(Heap)индекс,Мы можем оперативно обнаружить и устранить проблемы с памятью в Java-приложениях.,Улучшите производительность системы.
JVM Memory Индекс Pools(Non-Heap) используется для мониторинга использования памяти без кучи приложениями Java, включая Metaspace, Code Cache、Compressed Class Spaceждать。Он обеспечивает несколько измеренийизиндекс,Может помочь нам глубже понять использование памяти Java без кучи.,Выявляйте проблемы и проводите целенаправленную оптимизацию.
Память без кучи также называется пространством PermGen (постоянное поколение), что соответствует концепциям нового поколения и старого поколения. Это постоянно сохраняемая область, используемая для хранения информации о классе и мета-классе, когда она помещается в эту область. оно загружено. Пространство GC PermGen очищать не следует.
Подводя итог, Мониторинг JVM Memory Pools(Non-Heap)индекс,Мы можем оперативно обнаружить и решить проблемы с памятью, не связанной с кучей, в Java-приложениях.,Улучшите производительность системы.
Идеи по устранению неполадок, объясняющих причины, по которым использование служебной памяти слишком велико:
Связанные команды:
1. free -m # Проверьте использование памяти. Добавьте после него m, чтобы отобразить его в единицах M.
2. Проверьте, какие процессы используют больше всего памяти: top -c, введите M в верхнем регистре и выполните сортировку по использованию памяти от большего к меньшему.
VSS — размер виртуального набора виртуальной потребляемой памяти (включая память, занимаемую разделяемыми библиотеками)
Размер резидентного набора RSS Фактическая используемая физическая память (включая память, занимаемую общими библиотеками)
PSS — размер пропорционального набора Фактически используемая физическая память (память, занятая разделяемой библиотекой с пропорциональным распределением)
USS — уникальный размер набора. Физическая память, занимаемая только процессом (исключая память, занимаемую разделяемыми библиотеками).
Вообще говоря, использование памяти имеет следующие правила: VSS >= RSS >= PSS >= USS
3、проходитьjmap -heap идентификатор процесса Исключение команды связано с проблемой выделения памяти в куче
jmap -heap 21114
4. Просмотр топ-20 объектов, занимающих больше всего ресурсов в процессе (в основном выполняется под пользователем, включившим соответствующую программу)
jmap -histo:live 19424 |head -20
5. jstat проверяет использование памяти процессом
jstat -gcutil 19424
Теперь: На основании вышеизложенного мониторинга можно сделать вывод, что с кодом позиционирования в журнале бывают необоснованные ситуации.
Посмотреть в журнале
Как правило, следующие исключения могут быть обнаружены непосредственно: Переполнение кучи: java.lang.OutOfMemoryError: Пространство кучи Java Переполнение стека: java.lang.StackOverflowError Переполнение области метода: java.lang.OutOfMemoryError: пространство PermGen
система: какую долю времени процессор проводит в пространстве ядра. Выделение памяти, операции ввода-вывода, создание дочерних процессов... все это операции ядра.
Загрузка ЦП: Нагрузка представляет собой «среднее количество ожидающих процессов». К процессу ожидания загрузки будут добавлены только рабочее состояние (работает) и непрерывное состояние (прерываемое), а именно следующие две ситуации:
НОВИНКА: поворотный стол для резьбы, которая еще не запущена.
RUNNABLE: состояние работоспособных потоков. Поток работает или получает интервалы времени ЦП.
BLOCKED: состояние потока заблокировано и ожидает блокировки монитора.
ОЖИДАНИЕ: состояние ожидающего потока.
TIMED_WAITING: состояние ожидающего потока с указанным временем ожидания. Состояние потока ожидания в течение указанного времени ожидания при вызове метода потока с указанным положительным временем ожидания.
TERMINATED: состояние завершенного потока.
Количество журналов, зарегистрированных в минуту
Дескрипторы файлов — это неотрицательное целое число, значение индекса, указывающее на таблицу записей файлов, открытых процессом, поддерживаемую ядром для каждого процесса.
Программа открывает существующий файл или создает новый файл, а ядро возвращает процессу дескриптор файла.
open: количество файловых дескрипторов, открытых в данный момент JVM;
max: максимальное количество файловых дескрипторов, которые может открыть процесс JVM;
ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ:
Приложения Java, частое чтение и запись операций ввода-вывода и создание слишком большого количества потоков приводят к высокой загрузке ЦП или бесконечному циклу, что в основном является причиной высокой загрузки ЦП.
Часто используемые команды в фоновом режиме:
jstack -1 pid # Распечатайте боевую информацию процесса и используйте код для поиска проблем, которые занимают процессор.
Индекс Garbage Collection используется для мониторинга сборки мусора Java-приложений.
диаграмма коллекций:
1、Metadata GC Порог относится к порогу GC пространства метаданных. В JVM пространство метаданных — это пространство, используемое для хранения метаданных, таких как информация о классах Java, пулы констант и информация о методах. Когда пространство метаданных заполнено, GC пространства метаданных будет запущен для переработки ненужной информации метаданных. Metadata GC пороговый индекс используется для мониторинга порога GC пространства метаданных. Когда использование пространства метаданных превышает пороговое значение, срабатывает сборщик мусора пространства метаданных. Метаданные GC пороговыйиндекс можно использовать для мониторинга использования пространства метаданных и влияния GC на пространство метаданных.
a)end of minor GC: представляет второстепенный Временная метка завершения сбора мусора, то есть временная отметка завершения сборки мусора нового поколения. В JVM количество сборщиков мусора в новом поколении намного больше, чем в старом, поэтому используется end of minor GCиндекс для описания ситуации с GC нового поколения. конец of minor GCиндекс можно использовать для мониторинга частоты и временного интервала работы ГХ нового поколения, а также эффективности и пропускной способности ГХ.
b) end of major GC: представляет основные Временная метка окончания GC, то есть временная отметка окончания сборки мусора в старом поколении. В JVM количество сборщиков мусора в старом поколении меньше, чем в новом поколении, но влияние сборщика мусора больше, поэтому используется end of major GCиндекс для описания ситуации с GC в старом поколении. конец of major GCиндекс Может использоваться для мониторинга старого поколенияGCизчастотаивременной интервал,И эффективность и пропускная способность GC.
2) ops/sec: операций в секунду.
3) allocation сбой: указывает количество ошибок выделения памяти во время процесса сборки мусора. распределение errorindex можно использовать для мониторинга использования памяти и влияния GC на использование памяти. если распределение индекс неудачи продолжает расти,значит не хватает памяти,Возможно, потребуется увеличить объем динамической памяти или оптимизировать схему использования памяти программой.
график длительности паузы:
Указывает время паузы ГХ. Пауза GC означает, что выполнение приложения прерывается во время GC, и приложение не может выполнять какие-либо операции в течение этого периода.
Индекс продолжительности паузы можно использовать для мониторинга эффективности и пропускной способности GC, а также влияния GC на приложение.
Выделено/повышено:
1) выделенный указывает размер объектов, выделенных новым поколением в текущем цикле сборки мусора;
2) «продвинутый» указывает размер объектов, продвигаемых в старом поколении в текущем цикле сборки мусора;
Выделенный/продвинутый индекс можно использовать для мониторинга использования памяти при сборке мусора и влияния GC на использование памяти.
Подводя итог, отслеживая Garbage Collectionиндекс,Мы можем вовремя обнаружить и решить проблемы со сборкой мусора в Java-приложениях.,Улучшите производительность системы.
Загруженный класс и Дельта класса — это два индекса виртуальной машины Java (JVM), используемые для измерения загрузки и выгрузки классов JVM.
Class loaded Индекс представляет общее количество классов, которые JVM загрузила с момента запуска. Этот индекс можно использовать, чтобы определить, есть ли в приложении проблемы с чрезмерной загрузкой классов. Если класс Если загруженный индекс растет слишком быстро, могут возникнуть такие проблемы, как утечки памяти или повторная загрузка классов.
Class delta Индекс представляет количество классов, динамически загруженных и выгруженных загрузчиком классов с момента последней сборки мусора. Этот индекс можно использовать для определения наличия дисбаланса в загрузке и выгрузке классов в приложении. Если класс deltaиндексизценить Слишком большой,Указывает, что слишком много классов загружается и выгружается.,Может привести к снижению производительности JVM.
В общем, Class loading иClass deltaindex можно использовать для мониторинга состояния загрузки и выгрузки классов JVM и помогать разработчикам обнаруживать и решать возможные проблемы с производительностью.
DirectBufferиMappedByteBufferдаJava NIO(New В IO есть два типа буферов), используемые для отображения памяти и прямого доступа к памяти. Эти два буфера имеют разные способы измерения проблем позиционирования в разных сценариях.
DirectBufferмераиндекс:
индекстрафарет:
https://grafana.com/search/?term=micrometer