Монитор процессов
Монитор процессов — встроенный механизм платформы, показывающий состояние сервера приложений и сервера БД в текущий момент времени: активные потоки сервера приложений, активные SQL-запросы, цепочки блокировок, а также набор действий для прерывания и принудительного завершения этих процессов.
Содержимое монитора
Монитор открывается формой Администрирование > Система > Монитор процессов и состоит из трёх вкладок:
| Вкладка | Что показывает |
|---|---|
| Все процессы | Полный список активных серверных потоков и активных SQL-запросов, объединённых по логическим процессам |
| Блокирующие процессы | Процессы, удерживающие блокировки, которых ждут другие процессы |
| Блокируемые процессы | Процессы, ожидающие освобождения блокировок |
Колонки
Каждая запись монитора объединяет два аспекта одного логического процесса: серверный поток (Java) и связанный с ним SQL-запрос (если процесс в этот момент работает с БД). Часть колонок относится к java-потоку, часть — к запросу БД.
Идентификация процесса
| Колонка | Что показывает |
|---|---|
ID потока процесса | Идентификатор потока сервера приложений (для процессов БД без java-потока — s + pid backend'а) |
ID процесса (SQL) | Идентификатор backend-процесса на сервере БД |
Компьютер | Компьютер, с которого создано подключение |
Пользователь | Пользователь, которому принадлежит процесс |
Адрес пользователя (SQL) | Сетевой адрес клиента подключения к БД (это адрес сервера приложений, а не браузера конечного пользователя) |
Java-поток
| Колонка | Что показывает |
|---|---|
Имя java-потока | Имя потока сервера приложений |
Статус (Java) | Состояние java-потока: RUNNABLE, BLOCKED, WAITING, TIMED_WAITING |
LSF след потока | Стек выполнения на уровне lsFusion — цепочка действий/свойств/форм, исполняемых в потоке. Показывает логику приложения, а не кадры JVM; обычно самая полезная колонка, чтобы понять, что именно делает процесс |
След java-потока (Java) | Сырой стек вызовов JVM для потока на момент опроса |
След java-потока (SQL) | Java-стек потока, инициировавшего текущий SQL-запрос (снимок, привязанный к процессу БД) |
Выделенная память | Суммарный объём памяти, аллоцированной потоком за всё время жизни (счётчик только растёт и не уменьшается при сборке мусора). Это не текущее потребление, а совокупная нагрузка потока на кучу |
Память за последний интервал | Объём памяти, аллоцированной потоком за последний интервал измерения, — скорость аллокации |
Время начала вызова | Момент начала текущего вызова (задачи) на java-потоке |
Блокировка (Java) | Блокировка (монитор), которую поток сейчас удерживает или ожидает |
Колонки Выделенная память и Память за последний интервал заполняются только при включённой настройке readAllocatedBytes.
SQL-запрос
| Колонка | Что показывает |
|---|---|
Запрос (SQL) | Сокращённое представление текущего SQL-запроса |
Полный запрос (SQL) | Полный текст запроса; действие Копировать полный запрос в буфер кладёт его в буфер обмена |
Debug Info (SQL) | Расшифровка параметров и контекста выполняющегося запроса — значения, подставленные в SQL; помогает понять, над какими данными он работает. Формируется только для запросов дольше порога |
Время запуска (SQL) | Момент старта текущего запроса на сервере БД (используется для подсветки по возрасту) |
Статус (SQL) | Состояние сессии БД (active, idle, idle in transaction, …), берётся из pg_stat_activity |
Wait Event Type (SQL), Wait Event (SQL) | Категория (Lock, LWLock, IO, Client, …) и конкретное событие, которого ждёт backend БД. Показывают, на чём именно застрял запрос |
Status Message (SQL) | Внутреннее сообщение о ходе применения/обработки события — шаг вида event: 3/57 <свойство> |
Query Timeout | Таймаут (в секундах) для текущего выполняемого запроса |
Disabled nested loop | Для сессии выключен план nested loop (SET enable_nestloop=off) — оптимизация планировщика для тяжёлых запросов |
Запрос подсвечивается фоном по возрасту транзакции, в которой он выполняется: чем дольше транзакция удерживает изменения, тем агрессивнее фон, что позволяет визуально отделить кратковременные операции от долгих или зависших.
Транзакция
| Колонка | Что показывает |
|---|---|
Активный (SQL) | Выполняется ли сейчас запрос |
В транзакции (SQL) | Процесс находится внутри транзакции |
Время начала транзакции (SQL) | Момент старта транзакции; чем дольше она открыта, тем агрессивнее фон подсветки записи |
Номер попытки (SQL) | Сколько раз транзакция перезапускалась (deadlock, конфликт сериализации, «handled»-конфликты платформы). 0 — повторов не было; значение вида 2(...) — идёт 2-я и последующая попытка |
Блокировки
Для каждого процесса дополнительно показывается список блокируемых им процессов и список процессов, которые блокируют его самого. На вкладках Блокирующие и Блокируемые эта связь раскрывается в иерархию: можно перейти от удерживающего блокировку процесса к ожидающим его, и наоборот. Граф блокировок строится рекурсивно — циклические взаимные блокировки (deadlock) обнаруживаются и помечаются отдельно.
| Колонка | Что показывает |
|---|---|
Блокирующий поток, ID блокирующего потока | Поток, удерживающий блокировку, которую ожидает текущий процесс |
Кол-во заблокированных процессов | Сколько процессов (прямо и транзитивно) ожидают этот процесс |
Глубина блокировки | Глубина процесса в дереве ожидания блокировок |
Deadlock | Признак участия в цикле взаимных блокировок |
Прерывание и принудительное завершение
Для каждого процесса в мониторе доступны четыре действия:
| Действие | Что делает | Когда применять |
|---|---|---|
| Снять процесс | Отменяет SQL-запрос процесса, если он есть; иначе посылает java-потоку запрос на отмену через стандартный механизм прерывания — поток завершает текущую операцию и выходит при ближайшей проверке флага прерывания | Штатная отмена долгого или зависшего процесса |
| Убить процесс | Принудительно завершает процесс БД, если запрос активен; иначе принудительно завершает java-поток | Крайний случай: процесс не реагирует на отмену |
| Снять java-процесс | Посылает java-потоку запрос на отмену — даже когда строка относится к SQL-процессу | Отменить java-сторону SQL-процесса, не трогая сам запрос |
| Убить java-процесс | Принудительно завершает java-поток SQL-процесса | Крайний случай на java-стороне SQL-процесса |
Кнопки «Снять java-процесс» и «Убить java-процесс» показываются только для SQL-процессов, за которыми стоит java-поток.
«Убить» — операция последней инстанции: после неё состояние сервера приложений и сервера БД может потребовать перезапуска.
Фильтр по типу процессов
Монитор показывает процессы через один из четырёх фильтров: все процессы, все активные процессы, только активные SQL-запросы или только активные потоки сервера приложений. «Активные» фильтры отсеивают процессы, простаивающие вне транзакции или запроса, и оставляют только те, что действительно нагружают сервер на момент опроса. По умолчанию монитор открывается на активных SQL-запросах. Простаивающие системные потоки — поток событий, сетевой ввод-вывод, служебные потоки JVM — из списка отфильтровываются как неинформативные.