Обзор — что делает этот экран
Сервисы ▸ Сессии (Redis) на одном экране показывают состояние хранилища сессий и кэша ваших зарегистрированных узлов Redis. Экран переносит на Redis повествование раздела Сервисы ▸ База данных и читает данные по двум осям:
- Потолок ёмкости и текущее состояние — кольцевой индикатор насыщения памяти (
used_memory÷ потолок ёмкости), клиентские подключения (connected / maxclients) и заблокированные клиенты. - Пропускная способность — операции в секунду (
instantaneous_ops_per_sec), доля попаданий за недавнее окно (Δhits / Δ(hits+misses)) и сетевой ввод-вывод (вход/выход, кбит/с).
Сворачиваемая панель подробностей добавляет временной ряд по управлению памятью (наложение потолка ёмкости и отметки эпизодов вытеснения), а также анализ keyspace и сессий.
Этот экран никогда не подключается к Redis напрямую. Представительный коллектор внутренней сети (
scripts/infr_redis_vts_collector.cjs, задание pm2 cron, запускаемое каждую минуту) выполняет на каждом узлеredis-cli INFOи загружает снимки в центральную таблицу MySQLinfr_redis_metric; приложение только читает её. Приложение не хранит учётных данных Redis и не запускает долгоживущих демонов (тем самым исключаются утечки соединений и жёстко зашитые учётные данные).
Когда применять
- Ёмкость хранилища сессий — заметьте приближение памяти Redis к потолку, когда под нагрузкой сессии вытесняются (теряются).
- Диагностика эффективности кэша — по доле попаданий, фрагментации и slowlog оцените, справляется ли кэш со своей задачей.
- Насыщение подключений — примите меры до того, как новые подключения начнут отклоняться, если
connected_clientsприближается кmaxclientsлибо растётrejected_connections. - Сбои персистентности и репликации — увидьте в виде значков неудачный bgsave RDB, перезапись AOF или разрыв связи с репликой.
- Срок жизни сессий — отличайте истечение срока (нормальная жизнь) от вытеснения (нехватка памяти), чтобы правильно читать оборот сессий.
Состав экрана
Верхние KPI
| KPI | Значение |
|---|---|
| Узлы | Карточки узлов Redis, по которым есть выборка в недавнем окне (30 минут) |
| Работают / Деградация / Недоступны | Количество узлов со статусом up / degraded / down |
| Всего опер./с | Сумма instantaneous_ops_per_sec по всем узлам |
| Всего ключей | Сумма keyspace_keys по всем узлам |
Карточки узлов (две оси)
Каждому узлу соответствует одна карточка. В заголовке — имя или псевдоним инстанса, версия Redis и роль (master/replica); в теле расположены обе оси.
① Ёмкость · свободно (левый кольцевой индикатор) — значение в центре равно used_pct (занято ÷ потолок ёмкости). Полоса показателей:
| Показатель | Поле | Примечания |
|---|---|---|
| Клиенты | connected_clients / maxclients |
Подключения относительно предела; у предела новые подключения отклоняются |
| Заблокировано | blocked_clients |
Клиенты, ожидающие на BLPOP·BRPOP·WAIT (0 — здоровое значение) |
② Пропускная способность (справа) — спарклайн и полоса:
| Показатель | Поле | Примечания |
|---|---|---|
| опер./с | instantaneous_ops_per_sec |
Команд, обработанных за секунду |
| Доля попаданий | Δhits / Δ(hits+misses) | Доля попаданий в кэш за недавнее окно (при малом числе выборок откатывается к значению с момента запуска) |
| Сетевой ввод-вывод | instantaneous_input_kbps + output_kbps |
Сетевой вход/выход за секунду |
Оценки эффективности (низ карточки)
- Градация доли попаданий — отлично ≥ 99% · хорошо ≥ 95% · удовлетворительно ≥ 80%.
- Градация эффективности памяти (фрагментации) — отлично 0,95–1,4 · хорошо ~1,6 · удовлетворительно ~2,5.
Оценка фрагментации (
frag_score) вычисляется только тогда, когдаused_memoryсоставляет не менее 64 MB. На небольших инстансах постоянные накладные расходы аллокатора преобладают в этом отношении и дают ложные тревоги, поэтому ниже указанного порога оценка исключается и из градации, и из статуса.
Полоса жизненного цикла сессий
Полоса во всю ширину внизу карточки отображает с истечением → поток → истекло накопительно. Слева — ключи, у которых сейчас действует TTL (keyspace_expires, вот-вот истекут естественным образом); справа — ключи, истекшие с момента запуска (expired_keys, то есть оборот сессий). Заливка около ≈100% означает чистое хранилище сессий.
Подробности (развернуть)
Два блока раскрываются по клику (при изменении высоты раскладка masonry перестраивается).
- Управление памятью — временной ряд
usedотносительно ёмкости, наложенная линия отсечения 100% потолка ёмкости и критические отметки эпизодов вытеснения. На карточке перечислены потолок ёмкости (cap), оценка свободного места (est_free), общий объём RAM, резерв базы данных, резерв операционной системы, пик, RSS, фрагментация, накопленные вытеснения и истечения, а также политика вытеснения. - Keyspace · сессии — всего ключей, ключи с TTL, полосы распределения по логическим базам (db0/db1…), выделенная база сессий, средний TTL и значки персистентности RDB/AOF/реплики.
Обучающие всплывающие подсказки (edu)
При наведении на значок рядом с показателем открывается специально оформленная подсказка с описанием причин и способов устранения (более глубокие понятия — в статье Тюнинг Redis: разбор):
| Подсказка | Содержание |
|---|---|
| SLOWLOG | 7 причин накопления медленных команд (команды O(N) · крупные ключи · нехватка памяти · задержки fork · Lua · конвейеры · массовый DEL) |
| Доля попаданий | Основание расчёта keyspace hit ratio и способы его поднять (держать рабочий набор в памяти · настроить TTL · смягчить лавины запросов) |
| Фрагментация | Здоровый диапазон RSS / used (1,0–1,5) · activedefrag · предупреждение о свопе (< 1,0) |
| Логические базы | Понятие нумерованных баз Redis (0–15) · разделение по назначению · переносимость в Cluster |
| Истечение · вытеснение | Истечение срока (нормальная жизнь) против вытеснения (нехватка памяти) · как это читать |
Как пользоваться
- Опрос — после загрузки страница каждые 30 секунд опрашивает
/service/session/live, обновляя KPI и карточки (сервер кэширует панель на 20 секунд). - Порядок карточек — перетаскивайте карточки, выстраивая их по приоритету (SortableJS; порядок сохраняется в localStorage).
- Развернуть подробности — кнопкой [Развернуть] на карточке откройте блоки управления памятью и keyspace.
- Учиться через edu — наведите указатель на значок показателя, чтобы увидеть подсказку о причинах и мерах.
- Полный экран — кнопка полноэкранного режима рядом с индикатором LIVE в заголовке скрывает верхнюю навигацию и переключает в режим панели (выход — ESC).
Если карточек нет, значит ни один узел Redis ещё не зарегистрирован и не опрошен. В разделе Администрирование ▸ Коллекторы зарегистрируйте узлы
redis_hostу коллектораredis_vtsи разверните коллектор через pm2 на представительном хосте.
Источники данных
Read-модель infr_redis_metric
Приложение отображает эту таблицу как модель только для чтения в стиле Legacy (App\Models\Infr\InfrRedisMetric, $timestamps=false). Миграции для неё намеренно нет — коллектор создаёт её сам командой CREATE TABLE IF NOT EXISTS, поэтому Schema::create на стороне приложения приводил бы к конфликту.
Правила построителя App\Services\Redis\RedisMetricService::dashboard():
- Он запрашивает недавнее 30-минутное окно (
WINDOW_MIN) одним пакетным запросом, а затем группирует поnode_alias(по одной карточке на узел). Если в окне нет выборок (сбор остановлен), он берёт не менее последних 180 строк, чтобы показать узлы какstale. - Временные ряды усекаются до последних 60 точек на карточку (
SERIES_MAX). Накопительные счётчики (evicted/expired) переводятся в скорости через разности соседних выборок; при сбросе (уменьшении значения) скорость равнаnull. - Результат панели кэшируется на 20 секунд (
infr:redism:dash:v1).
-- Концептуально (фактически используется Eloquent). Взять недавнее окно пакетом и сгруппировать в PHP.
SELECT * FROM infr_redis_metric
WHERE sampled_at >= (NOW() - INTERVAL 30 MINUTE)
ORDER BY sampled_at;
Коллектор — scripts/infr_redis_vts_collector.cjs
Единственный представительный хост внутренней сети работает по расписанию pm2 cron: за один проход он опрашивает Redis нескольких узлов (redis-cli -h {ip} INFO) и vts у nginx, напрямую загружает данные в центральный MySQL и завершается (не резидентный → на каждый запуск новый процесс, без утечек). Конфигурация находится только в блоке CONFIG в начале файла (без переменных окружения и без зашитых учётных данных).
# Развёртывание на представительном хосте (проход каждую минуту, не резидентно)
npm i mysql2 # единственная зависимость npm (для загрузки). redis-cli установите пакетом ОС.
pm2 start infr_redis_vts_collector.cjs --name infr-collector \
--no-autorestart --cron-restart "* * * * *"
pm2 save
Связь с инстансом (псевдоним / целочисленный внешний ключ)
При записи коллектор находит в infr_instance соответствие «псевдоним узла → id» и записывает instance_id (целое число) напрямую. Приложение соединяет данные прежде всего по metric.instance_id = infr_instance.id (сравнение целых чисел — не зависит от collation и опирается на индекс первичного ключа). Для незарегистрированных или зарегистрированных позже инстансов используется запасной путь node_alias (в нижнем регистре) → infr_instance.alias, а фоновое дозаполнение infr:link-metrics (с блокировкой лидера, каждые 5 минут) позже проставляет instance_id.
Расчёт потолка ёмкости (cap)
Базовая линия 100% для кольцевого индикатора и графика памяти определяется в следующем порядке.
| Вид cap | Условие | Потолок | Оценка свободного (est_free) |
|---|---|---|---|
maxmemory |
maxmemory > 0 |
Заданное значение maxmemory (жёсткий потолок) | maxmemory − used |
budget |
maxmemory не задан | Всего RAM − буферный пул базы данных − резерв ОС | budget − used |
- Всего RAM =
total_system_memory(собранное значение), при его отсутствии —infr_instance.mem_mb. - Резерв ОС = всего RAM ×
redis_reserve_pct(по умолчанию 20%). - Буферный пул базы данных = последнее значение
infr_db_metric.raw.bp_sizeу коллектораaccess=databaseтого же узла (суммируется, если на узле несколько баз). Вычитание даёт бюджет, который Redis реально может использовать в качестве потолка. - Для бюджета задан нижний предел, поэтому он никогда не опускается ниже текущего
used, что исключает отрицательные и перевёрнутые значения.
Определение статуса и пороги
statusOf() относит каждый узел к up / degraded / down.
| Статус | Условие |
|---|---|
down |
Сбор не удался (ok=0) либо данные stale (последняя выборка старше redis_stale_min) |
degraded |
Выполняется одна или несколько причин ниже |
up |
Причин нет |
Причины и пороги degraded (Администрирование ▸ Операционная политика, infr_setting group=ops):
| Причина | Условие | Ключ порога | По умолчанию |
|---|---|---|---|
| Насыщение памяти | used_pct ≥ |
redis_mem_pct |
85 |
| Фрагментация | frag_score ≥ |
redis_frag_ratio |
1.6 |
| Заблокированные клиенты | blocked_clients ≥ |
redis_blocked |
1 |
| Разрыв связи с репликой | master_link_status = down |
— | — |
| Ошибка сохранения RDB | rdb_last_bgsave_status = err |
— | — |
Доля попаданий НЕ является осью статуса. Хранилище сессий промахивается при каждом новом входе, каждом истечении срока и каждом выходе, поэтому доля попаданий 40–60% — это норма (например, 44,75% на совершенно здоровом узле сессий). Раньше доля попаданий ниже
redis_hit_rate_min(по умолчанию 50) давала ложно-красныйdegraded; теперь доля попаданий только отображается в KPI карточки, на индикаторе градации и в подсказке edu и никогда не окрашивает узел в красный. Настоящие проблемы кэша (насыщение памяти, вытеснение, фрагментация) улавливаются метрикамиmem_saturation/fragmentationнезависимо от характера нагрузки.
Доступ
- Чтение (этот экран) —
user_level ≥ 1(demo=1). Ролевая область «Сервисы» требует минимального уровня 1, а сам экран работает только на чтение (нет действий записи и удаления). - Регистрация и правка коллектора — раздел Администрирование ▸ Коллекторы требует
user_level ≥ 5(staff/admin), чтобы задать узлыredis_hostи пароли у коллектораredis_vts. - Изменение порогов — раздел Администрирование ▸ Операционная политика требует
user_level ≥ 5.
На этом экране нет разрушительных действий, поэтому собственный журнал аудита он не ведёт (изменения коллекторов и политики фиксируются на соответствующих административных экранах).
Устранение неполадок и часто задаваемые вопросы
Карточки не появляются («Узлы Redis не собраны»)
В infr_redis_metric нет свежих выборок. Проверьте, что (1) вы зарегистрировали узлы redis_host у коллектора redis_vts в разделе Администрирование ▸ Коллекторы, (2) infr_redis_vts_collector.cjs запущен под pm2 на представительном хосте и (3) с представительного хоста доступен порт Redis каждого узла через redis-cli.
Узел показан как «Недоступен (stale)»
Последняя выборка старше redis_stale_min (по умолчанию 5 минут). Скорее всего, процесс pm2 представительного коллектора завершился или остановилось его расписание cron. Проверьте это командами pm2 list / pm2 logs infr-collector.
Потолок кольцевого индикатора выглядит неверным, свободного места кажется слишком много
Узлы без maxmemory используют в качестве потолка бюджет (всего RAM − буферный пул базы данных − 20% резерва ОС). Если нужен жёсткий потолок, задайте maxmemory в Redis — тогда это значение станет потолком напрямую.
Блок keyspace и сессий пуст
Детализацию по базам (raw.keyspace) и метрики базы сессий наполняет расширенный коллектор. Если коллектор устаревший, разверните его заново (при этом идемпотентно добавляются total_system_memory, keyspace_keys и raw-колонки по базам) — и блок появится. Если данные не собраны, раздел аккуратно скрывается.
Доля попаданий низкая — это проблема?
Для сессионной нагрузки — нет (см. предупреждение выше). Если же это чистый кэш и доля попаданий низка, возможно, рабочий набор не помещается в памяти или TTL слишком короткий — см. раздел о доле попаданий в статье Тюнинг Redis: разбор.
Оценка фрагментации не показана
Когда used_memory меньше 64 MB, отношение фрагментации определяется постоянными накладными расходами и теряет смысл, поэтому оно исключается из градации и статуса.
Смежные разделы
- База данных (Сервисы ▸ База данных) — родственный экран, реализующий то же повествование (ёмкость · пропускная способность · схема) для MySQL
- Тюнинг Redis: разбор — подробнее о slowlog, доле попаданий, фрагментации, keyspace и вытеснении
- Коллекторы (Администрирование ▸ Коллекторы) — регистрация коллектора
redis_vtsи его узлов - Операционная политика (Администрирование ▸ Операционная политика) — настройка порогов статуса Redis и доли резерва
- Обзор сервисов (Сервисы ▸ Обзор) — закрепление карточек сессий на доске приоритетов
