Übersicht — was dieser Bildschirm leistet
Service ▸ Sitzungen (Redis) überwacht auf einem Bildschirm den Zustand des Sitzungs- und Cache-Speichers Ihrer registrierten Redis-Knoten. Er überträgt die Erzählung von Service ▸ Datenbank auf Redis und liest dabei entlang zweier Achsen:
- Kapazitätsgrenze und aktueller Zustand — eine Ringanzeige der Speichersättigung (
used_memory÷ Kapazitätsgrenze), die Client-Verbindungen (connected / maxclients) und die blockierten Clients. - Durchsatz — Operationen pro Sekunde (
instantaneous_ops_per_sec), Trefferquote im jüngsten Zeitfenster (Δhits / Δ(hits+misses)) und Netz-E/A (ein/aus in kbps).
Ein aufklappbares Detail-Panel ergänzt eine Zeitreihe zur Speicherverwaltung (Überlagerung der Kapazitätsgrenze und Markierungen für Verdrängungsereignisse) sowie die Keyspace- und Sitzungsanalyse.
Dieser Bildschirm verbindet sich nie direkt mit Redis. Ein repräsentativer Collector im internen Netz (
scripts/infr_redis_vts_collector.cjs, ein pm2-Cron, der jede Minute läuft) führt auf jedem Knotenredis-cli INFOaus und lädt Momentaufnahmen in die zentrale MySQL-Tabelleinfr_redis_metric; die Anwendung liest sie lediglich. Die Anwendung hält keine Redis-Zugangsdaten und betreibt keinen dauerhaft laufenden Daemon (so werden die Fallen von Verbindungslecks und fest einprogrammierten Zugangsdaten vermieden).
Wann Sie ihn nutzen
- Kapazität des Sitzungsspeichers — erkennen Sie, wenn der Redis-Speicher an die Grenze stößt und Sitzungen unter Druck verdrängt (verloren) werden.
- Diagnose der Cache-Effizienz — beurteilen Sie anhand von Trefferquote, Fragmentierung und slowlog, ob der Cache seine Aufgabe erfüllt.
- Verbindungssättigung — handeln Sie, bevor neue Verbindungen abgewiesen werden, wenn sich
connected_clientsanmaxclientsannähert oderrejected_connectionssteigt. - Fehler bei Persistenz oder Replikation — sehen Sie ein fehlgeschlagenes RDB-bgsave, ein AOF-Rewrite oder eine abgerissene Replikat-Verbindung als Badge.
- Sitzungslebensdauer — unterscheiden Sie Ablauf (normale Lebensdauer) von Verdrängung (Speicherdruck), um den Sitzungsumschlag zu lesen.
Aufbau
KPIs im Kopfbereich
| KPI | Bedeutung |
|---|---|
| Knoten | Redis-Knotenkarten mit einer Probe im jüngsten Zeitfenster (30 Min.) |
| Aktiv / Beeinträchtigt / Ausgefallen | Anzahl der Knoten mit up / degraded / down |
| Ops/s gesamt | Summe von instantaneous_ops_per_sec über alle Knoten |
| Schlüssel gesamt | Summe von keyspace_keys über alle Knoten |
Knotenkarten (zwei Achsen)
Jeder Knoten ist eine Karte. Die Kopfzeile zeigt Instanzname bzw. Alias, die Redis-Version und die Rolle (master/replica); der Rumpf trägt die beiden Achsen.
① Kapazität · frei (linke Ringanzeige) — der Wert in der Mitte ist used_pct (belegt ÷ Kapazitätsgrenze). Kennzahlenleiste:
| Kennzahl | Feld | Hinweise |
|---|---|---|
| Clients | connected_clients / maxclients |
Verbindungen gegenüber dem Limit; nahe am Limit werden neue Verbindungen abgewiesen |
| Blockiert | blocked_clients |
Clients, die auf BLPOP·BRPOP·WAIT warten (0 ist gesund) |
② Durchsatz (rechts) — Sparkline und Leiste:
| Kennzahl | Feld | Hinweise |
|---|---|---|
| Ops/s | instantaneous_ops_per_sec |
Pro Sekunde verarbeitete Befehle |
| Trefferquote | Δhits / Δ(hits+misses) | Cache-Trefferquote im jüngsten Zeitfenster (fällt bei dünner Datenlage auf den Wert seit Start zurück) |
| Netz-E/A | instantaneous_input_kbps + output_kbps |
Netzwerk ein/aus pro Sekunde |
Effizienzwerte (Kartenfuß)
- Stufe der Trefferquote — Hervorragend ≥ 99 % · Gut ≥ 95 % · Mäßig ≥ 80 %.
- Stufe der Speichereffizienz (Fragmentierung) — Hervorragend 0,95–1,4 · Gut ~1,6 · Mäßig ~2,5.
Der Fragmentierungswert (
frag_score) wird nur berechnet, wennused_memorymindestens 64 MB beträgt. Auf kleinen Instanzen dominiert der feste Overhead des Allokators das Verhältnis und erzeugt Fehlalarme; unterhalb dieser Schwelle bleibt er deshalb sowohl aus der Bewertung als auch aus dem Status ausgeschlossen.
Leiste zum Sitzungslebenszyklus
Eine Leiste über die volle Breite des Kartenfußes stellt mit Ablauf → Fluss → kumuliert abgelaufen dar. Links stehen Schlüssel, die aktuell eine laufende TTL tragen (keyspace_expires, kurz vor dem natürlichen Ablauf); rechts die seit dem Start abgelaufenen Schlüssel (expired_keys, der Sitzungsumschlag). Eine Füllung nahe ≈100 % bedeutet einen reinen Sitzungsspeicher.
Detail (aufklappen)
Zwei Blöcke öffnen sich aufklappbar (das Masonry-Layout ordnet sich bei Höhenänderungen neu).
- Speicherverwaltung — Zeitreihe von
usedgegenüber der Kapazität, ergänzt um eine Überlagerung der 100-%-Schnittlinie der Kapazitätsgrenze und kritische Markierungen für Verdrängungsereignisse. Die Karte führt Kapazitätsgrenze (cap), geschätzten freien Speicher (est_free), Gesamt-RAM, Datenbankreservierung, Betriebssystemreserve, Spitzenwert, RSS, Fragmentierung, kumulierte Verdrängungen und Abläufe sowie die Verdrängungsrichtlinie auf. - Keyspace · Sitzungen — Schlüssel gesamt, Schlüssel mit TTL, Verteilungsbalken über die logischen Datenbanken (db0/db1…), die hervorgehobene Sitzungsdatenbank, die durchschnittliche TTL sowie Persistenz-Badges für RDB/AOF/Replikat.
Erklärende Popover (edu)
Wenn Sie mit dem Zeiger über das Symbol neben einer Kennzahl fahren, öffnet sich ein eigens gestaltetes Popover, das Ursachen und Abhilfen erläutert (tiefer gehende Konzepte in Redis-Tuning erklärt):
| Popover | Inhalt |
|---|---|
| SLOWLOG | 7 Ursachen für sich anhäufende langsame Befehle (O(N)-Befehle · große Schlüssel · Speicherdruck · Fork-Stockungen · Lua · Pipelines · große DEL) |
| Trefferquote | Grundlage der Keyspace-Trefferquote und wie Sie sie anheben (Working Set resident halten · TTL abstimmen · Stampedes abfedern) |
| Fragmentierung | Gesunder Bereich von RSS / used (1,0–1,5) · activedefrag · Warnung bei Swapping (< 1,0) |
| Logische Datenbanken | Konzept der nummerierten Redis-Datenbanken (0–15) · Trennung nach Zweck · Portierbarkeit auf Cluster |
| Ablauf · Verdrängung | Ablauf (normale Lebensdauer) gegenüber Verdrängung (Speicherdruck) · wie Sie sie lesen |
So gehen Sie vor
- Polling — nach dem Laden ruft die Seite alle 30 Sekunden
/service/session/liveab, um KPIs und Karten zu aktualisieren (der Server hält das Dashboard 20 Sekunden im Cache). - Karten umsortieren — ziehen Sie die Karten in die gewünschte Reihenfolge (SortableJS; die Reihenfolge bleibt in localStorage erhalten).
- Detail aufklappen — öffnen Sie über [Aufklappen] auf der Karte die Blöcke zu Speicherverwaltung und Keyspace.
- Mit edu lernen — fahren Sie über das Symbol einer Kennzahl, um das Popover zu Ursache und Abhilfe zu sehen.
- Vollbild — die Vollbildschaltfläche neben der LIVE-Anzeige im Kopfbereich blendet die obere Navigation aus und wechselt in den Dashboard-Modus (ESC beendet ihn).
Erscheint keine Karte, wurden noch keine Redis-Knoten registriert oder erfasst. Registrieren Sie unter Verwaltung ▸ Collectors die
redis_host-Knoten am Collectorredis_vtsund rollen Sie den Collector per pm2 auf dem repräsentativen Host aus.
Datenquellen
Read-Model infr_redis_metric
Die Anwendung bildet diese Tabelle als schreibgeschütztes Modell im Legacy-Stil ab (App\Models\Infr\InfrRedisMetric, $timestamps=false). Es gibt dafür bewusst keine Migration — der Collector legt sie mit CREATE TABLE IF NOT EXISTS selbst an, sodass ein Schema::create auf Anwendungsseite kollidieren würde.
Disziplin des Builders App\Services\Redis\RedisMetricService::dashboard():
- Er fragt das jüngste 30-Minuten-Fenster (
WINDOW_MIN) in einer einzigen Sammelabfrage ab und gruppiert anschließend nachnode_alias(eine Karte je Knoten). Enthält das Fenster keine Proben (Erfassung gestoppt), holt er mindestens die letzten 180 Zeilen, um die Knoten alsstaleauszuweisen. - Zeitreihen werden je Karte auf die letzten 60 Punkte gekürzt (
SERIES_MAX). Kumulative Zähler (evicted/expired) werden über Differenzen benachbarter Proben in Raten umgerechnet; bei einem Reset (einem Rückgang) ist die Ratenull. - Das Ergebnis des Dashboards wird 20 Sekunden zwischengespeichert (
infr:redism:dash:v1).
-- Konzeptionell (tatsächlich Eloquent). Das jüngste Fenster gesammelt holen, in PHP gruppieren.
SELECT * FROM infr_redis_metric
WHERE sampled_at >= (NOW() - INTERVAL 30 MINUTE)
ORDER BY sampled_at;
Collector — scripts/infr_redis_vts_collector.cjs
Ein einzelner repräsentativer Host im internen Netz läuft als pm2-Cron, tastet je Durchlauf das Redis mehrerer Knoten (redis-cli -h {ip} INFO) sowie das nginx-vts ab, lädt die Daten direkt in das zentrale MySQL und beendet sich danach (nicht resident → je Durchlauf ein frischer Prozess, keine Lecks). Die Konfiguration steht ausschließlich im CONFIG-Block am Dateianfang (keine Umgebungsvariablen, keine fest einprogrammierten Zugangsdaten).
# Auf dem repräsentativen Host ausrollen (Durchlauf jede Minute, nicht resident)
npm i mysql2 # die einzige npm-Abhängigkeit (für das Laden). redis-cli über das Betriebssystempaket installieren.
pm2 start infr_redis_vts_collector.cjs --name infr-collector \
--no-autorestart --cron-restart "* * * * *"
pm2 save
Instanz-Join (Alias / Integer-Fremdschlüssel)
Beim Schreiben schlägt der Collector den Knoten-Alias in infr_instance nach und schreibt direkt eine instance_id (Integer). Die Anwendung verknüpft vorrangig über metric.instance_id = infr_instance.id (Integer-Vergleich — unabhängig von der Kollation und über den Primärschlüssel indiziert). Nicht oder erst später registrierte Instanzen fallen auf node_alias (kleingeschrieben) → infr_instance.alias zurück; das Nachfüllen durch infr:link-metrics (leader-gesteuert, alle 5 Minuten) trägt instance_id später nach.
Berechnung der Kapazitätsgrenze (cap)
Die 100-%-Basislinie von Ringanzeige und Speicherdiagramm wird in dieser Reihenfolge bestimmt.
| cap-Art | Bedingung | Grenze | Geschätzt frei (est_free) |
|---|---|---|---|
maxmemory |
maxmemory > 0 |
Der eingestellte maxmemory-Wert (harte Grenze) | maxmemory − used |
budget |
maxmemory nicht gesetzt | Gesamt-RAM − Datenbank-Buffer-Pool − Betriebssystemreserve | budget − used |
- Gesamt-RAM =
total_system_memory(erfasst), ersatzweiseinfr_instance.mem_mb. - Betriebssystemreserve = Gesamt-RAM ×
redis_reserve_pct(Standard 20 %). - Datenbank-Buffer-Pool = der jüngste
infr_db_metric.raw.bp_sizedesaccess=database-Collectors desselben Knotens (aufsummiert, wenn ein Knoten mehrere Datenbanken beherbergt). Zieht man ihn ab, ergibt sich das Budget, das Redis realistisch als Grenze nutzen kann. - Das Budget hat eine Untergrenze und fällt nie unter das aktuelle
used, was negative oder umgekehrte Werte verhindert.
Statusbestimmung und Schwellenwerte
statusOf() stuft jeden Knoten als up / degraded / down ein.
| Status | Bedingung |
|---|---|
down |
Erfassung fehlgeschlagen (ok=0) oder stale (letzte Probe älter als redis_stale_min) |
degraded |
Einer oder mehrere der unten genannten Gründe |
up |
Kein Grund |
Gründe und Schwellenwerte für degraded (Verwaltung ▸ Betriebsrichtlinie, infr_setting group=ops):
| Grund | Bedingung | Schwellenwert-Schlüssel | Standard |
|---|---|---|---|
| Speichersättigung | used_pct ≥ |
redis_mem_pct |
85 |
| Fragmentierung | frag_score ≥ |
redis_frag_ratio |
1.6 |
| Blockierte Clients | blocked_clients ≥ |
redis_blocked |
1 |
| Replikat-Verbindung getrennt | master_link_status = down |
— | — |
| RDB-Speichern fehlgeschlagen | rdb_last_bgsave_status = err |
— | — |
Die Trefferquote ist KEINE Statusachse. Ein Sitzungsspeicher verfehlt bei jeder neuen Anmeldung, jedem Ablauf und jeder Abmeldung, weshalb eine Trefferquote von 40–60 % normal ist (etwa 44,75 % auf einem völlig gesunden Sitzungsknoten). Früher erzeugte eine Trefferquote unter
redis_hit_rate_min(Standard 50) ein falsch-rotesdegraded; heute wird die Trefferquote nur noch auf dem Karten-KPI, der Stufenanzeige und im edu-Popover angezeigt und färbt niemals einen Knoten rot. Echte Cache-Probleme (Speichersättigung, Verdrängung, Fragmentierung) erfassenmem_saturation/fragmentationunabhängig von der Arbeitslast.
Zugriff
- Lesen (dieser Bildschirm) —
user_level ≥ 1(demo=1). Der Rollenbereich Service verlangt mindestens Stufe 1, und dieser Bildschirm ist schreibgeschützt (keine Schreib- oder Löschaktionen). - Collector registrieren/bearbeiten — Verwaltung ▸ Collectors verlangt
user_level ≥ 5(staff/admin), umredis_host-Knoten und Passwörter am Collectorredis_vtszu hinterlegen. - Schwellenwerte ändern — Verwaltung ▸ Betriebsrichtlinie verlangt
user_level ≥ 5.
Dieser Bildschirm kennt keine destruktive Aktion und schreibt daher kein eigenes Audit-Protokoll (Änderungen an Collectors und Richtlinien werden auf den jeweiligen Verwaltungsbildschirmen protokolliert).
Fehlersuche und FAQ
Es erscheinen keine Karten („Keine Redis-Knoten erfasst“)
infr_redis_metric enthält keine jüngeren Proben. Prüfen Sie, ob (1) Sie unter Verwaltung ▸ Collectors redis_host-Knoten am Collector redis_vts registriert haben, (2) infr_redis_vts_collector.cjs auf dem repräsentativen Host unter pm2 läuft und (3) der repräsentative Host den Redis-Port jedes Knotens über redis-cli erreicht.
Ein Knoten zeigt „Ausgefallen (stale)“
Die letzte Probe ist älter als redis_stale_min (Standard 5 Min.). Wahrscheinlich ist der pm2-Prozess des repräsentativen Collectors gestorben oder sein Cron steht still. Prüfen Sie das mit pm2 list / pm2 logs infr-collector.
Die Grenze der Ringanzeige wirkt falsch / der freie Speicher scheint riesig
Knoten ohne maxmemory nutzen ein Budget als Grenze (Gesamt-RAM − Datenbank-Buffer-Pool − 20 % Betriebssystemreserve). Für eine harte Grenze setzen Sie maxmemory in Redis — dieser Wert wird dann unmittelbar zur Grenze.
Der Block Keyspace / Sitzungen ist leer
Das Detail je Datenbank (raw.keyspace) und die Kennzahlen der Sitzungsdatenbank füllt der erweiterte Collector. Rollen Sie einen älteren Collector erneut aus (dabei werden total_system_memory, keyspace_keys und die raw-Spalten je Datenbank idempotent ergänzt), dann erscheint der Block. Fehlen die Daten, blendet sich der Abschnitt still aus.
Die Trefferquote ist niedrig — ist das ein Problem?
Bei einer Sitzungslast nicht (siehe die Warnung oben). Handelt es sich um einen reinen Cache und die Trefferquote ist niedrig, ist das Working Set möglicherweise nicht resident oder die TTL zu kurz — siehe das Thema Trefferquote in Redis-Tuning erklärt.
Der Fragmentierungswert wird nicht angezeigt
Liegt used_memory unter 64 MB, wird das Fragmentierungsverhältnis vom festen Overhead beherrscht und ist bedeutungslos; es bleibt daher aus Bewertung und Status ausgeschlossen.
Verwandte Themen
- Datenbank (Service ▸ Datenbank) — der Schwesterbildschirm, der dieselbe Erzählung (Kapazität · Durchsatz · Schema) für MySQL umsetzt
- Redis-Tuning erklärt — Vertiefung zu slowlog, Trefferquote, Fragmentierung, Keyspace und Verdrängung
- Collectors (Verwaltung ▸ Collectors) — den Collector
redis_vtsund seine Knoten registrieren - Betriebsrichtlinie (Verwaltung ▸ Betriebsrichtlinie) — Redis-Statusschwellen und den Reserveanteil festlegen
- Service-Übersicht (Service ▸ Übersicht) — Sitzungskarten an das Prioritäten-Board heften
