Heim > Artikel > Computer-Tutorials > Leitfaden zur Redis-Optimierung: Netzwerk, Speicher, Festplatte, Blockierungspunkte
Da es sich bei Redis um einen speicherbasierten Vorgang handelt, ist die CPU nicht der Leistungsengpass. Im Gegenteil, die Speicherauslastung des Servers, Netzwerk-E/A sowie Lese- und Schreibvorgänge auf der Festplatte spielen eine Schlüsselrolle für die Leistung von Redis.
Daher konzentrieren wir uns auf die Optimierung von Aspekten wie Netzwerk, Speicher, Festplatte und Blockierungspunkten. Wenn eine Terminologie unklar ist, wird empfohlen, auf den Redis-Inhalt in früheren Ausgaben zu verweisen oder relevante Informationen zu konsultieren.
Netzwerkoptimierung
Wenn der Client den Server anfordert, also im „Anfrage-Antwort“-Modus, verwenden Sie so weit wie möglich die Stapelverarbeitung, um den Netzwerk-E/A-Overhead zu reduzieren.
Stapelverarbeitungstechnologie: Anweisungen zur atomaren M-Stapelverarbeitung, Pipeline-Technologie, Redis, Transaktionen, Lua-Skripte.
Stapelverarbeitung reduziert den Netzwerk-IO-Overhead
Atomic m Batch-Verarbeitungsanweisungen: String-Typ, es wird empfohlen, mget/mset anstelle von get/set zu verwenden. Hash-Typ wird empfohlen, hmget/hmset anstelle von hget/hset zu verwenden.
Pipline-Technologie: Die Pipeline-Technologie kann verwendet werden, wenn bei der Verwendung von list, set und zset Batch-Vorgänge vorliegen.
Redis-Transaktion: empfohlen, wenn besondere Geschäftsanforderungen mehrere Anweisungen erfordern.
Lua-Skript: Es wird empfohlen, Lua-Skript zu verwenden, wenn Sie die Atomizität mehrerer Anweisungen sicherstellen müssen. Konkrete Beispiele sind verteiltes Entsperren, Flash-Verkäufe und Bestandsreduzierung.
Netzwerkoptimierung zwischen Knoten
Bauen Sie einen Cluster im selben LAN auf;
Kontrollieren Sie die Anzahl der Knoten im Split-Cluster. Die auf der Redis-Instanz zugewiesenen Hash-Slots müssen zwischen verschiedenen Instanzen übertragen werden. Wenn die Schuldenausgleichsinstanz gelöscht wird, werden die Daten zwischen verschiedenen Instanzen übertragen. Aber die Hash-Slot-Informationen sind nicht groß und die Datenmigration erfolgt schrittweise, aber das ist nicht das Hauptproblem;
Speicheroptimierung
Kontrollieren Sie die Länge des Schlüssels: Es wird empfohlen, die Spezifikationen vor der Entwicklung zu definieren, um sicherzustellen, dass der Schlüssel einfach und klar ist, und den Schlüssel so weit wie möglich entsprechend dem Unternehmen abzukürzen.
Großschlüssel vermeiden: Die empfohlene Größe des Zeichenfolgentyps liegt innerhalb von 20 KB. Es wird empfohlen, den Schwellenwert von Hash, List, Set und Zset zu steuern, und es wird empfohlen, ihn innerhalb von 5000 zu steuern.
Schlüsseleinstellung läuft ab: Speicher voll ausnutzen.
Wählen Sie die richtige Datenstruktur
String-Typ, es wird empfohlen, den Integer-Typ zu verwenden. Die zugrunde liegende Codierung wählt eine Integer-Codierung, die einen geringen Speicheraufwand verursacht
Hash-Typ, es wird empfohlen, den Elementschwellenwert zu steuern. Wenn die unterste Ebene eine komprimierte Listendatenstruktur verwendet, wird empfohlen, den Elementschwellenwert zu steuern Wenn es nur wenige Elemente gibt, verwendet die unterste Ebene eine komprimierte Listendatenstruktur mit geringem Speicheraufwand. Es wird empfohlen, den Typ „Ganzzahl“ zu speichern. Die zugrunde liegende Kodierung wählt eine Ganzzahlkodierung und der Speicheraufwand ist geringzset-Typ: Es wird empfohlen, den Elementschwellenwert zu steuern. Wenn nur wenige Elemente vorhanden sind, verwendet die unterste Ebene eine komprimierte Listendatenstruktur, die einen geringen Speicheraufwand verursacht
Datenkomprimierung: Der Client kann Komprimierungsalgorithmen wie snappy und gzip verwenden, um Daten vor dem Schreiben auf Redis zu komprimieren, um die Speichernutzung zu reduzieren. Allerdings muss der Client die Daten nach dem Lesen dekomprimieren, was mehr CPU verbraucht.
Aktivieren Sie die Speicherbeseitigungsstrategie
Machen Sie der standardmäßigen Speichereliminierungsstrategie ein Ende. Wählen Sie bitte eine geeignete Eliminierungsstrategie basierend auf Ihrem tatsächlichen Unternehmen, um die Speichernutzung zu verbessern.
LRU: Konzentrieren Sie sich auf die Anzahl der Besuche, eliminieren Sie die zuletzt verwendeten Schlüssel und nutzen Sie eine breite Palette von Nutzungsszenarien. Die LRU von Redis verwendet einen LRU-ähnlichen Algorithmus und fügt dem Schlüssel ein zusätzliches Feld mit einer Länge von 24 Bit hinzu, das den Zeitstempel des letzten Zugriffs darstellt. Nehmen Sie eine verzögerte Verarbeitungsmethode an: Wenn beim Ausführen eines Schreibvorgangs der maximale Speicher überschritten wird, wird der LRU-Eliminierungsalgorithmus einmal ausgeführt, 5 (die Anzahl kann festgelegt werden) Schlüssel werden zufällig abgetastet und der älteste Schlüssel wird entfernt Wenn der maximale Speicher nach der Eliminierung immer noch überschritten wird, wird die Eliminierung fortgesetzt.
LFU: Konzentrieren Sie sich auf die Zugriffshäufigkeit, empfohlen bei Cache-Verschmutzung.
Problem bei der Optimierung der Speicherfragmentierung
Gründe: Einer wird durch die Zuweisungsstrategie des Speicherzuweisers verursacht, und nicht nach der tatsächlich angeforderten Größe. Wenn beispielsweise die angeforderten Bytes innerhalb der angeforderten Bytes liegen, sind es 32 Bytes tatsächlich zugewiesen; der andere wird durch Redis verursacht. Nachdem das Schlüssel-Wert-Paar gelöscht wurde, wird die durch einen Teil des Speicherplatzes verursachte Speicherfragmentierung freigegeben.
Positionierung: Beobachten Sie den Indikator für men_fragmentation_ratio über den INFO-Speicher. Wenn der Indikator zwischen 1 und 1,5 liegt, ist dies normal. Wenn der Indikator größer als 1,5 ist, hat die Speicherfragmentierung 50 % überschritten verarbeitet
Lösung: Starten Sie die Redis-Instanz neu
Aktivieren Sie die automatische Speicherfragmentierungs-Reinigungsfunktion von Redis.
Festplattenoptimierung
Erstellen Sie den Redis-Dienst physisch: Bei der Beibehaltung verwendet Redis die Methode zum Erstellen eines untergeordneten Prozesses (der das Fork-System des Betriebssystems aufruft), und die Ausführung des Forks in der Umgebung der virtuellen Maschine dauert länger als bei der physischen Maschine.
Mechanismus zur Persistenzoptimierung
Persistenz nicht aktivieren: Redis wird nur zum Caching verwendet, daher besteht keine Notwendigkeit, die Persistenz zu aktivieren, um den Festplatten-Overhead zu reduzieren
AOF-Optimierung: Verarbeiten Sie AOF im Hintergrund, konfigurieren Sie apenfsync everyec so, dass der Datenpersistenz-Pinselvorgang zur Ausführung in den Hintergrundthread gestellt wird, und versuchen Sie, die Auswirkungen des Redis-Schreibens auf die Festplatte auf die Leistung zu reduzieren
Erstellen Sie keine hochfrequente AOF-Persistenz. Es wird nicht empfohlen, diese Konfiguration zu ändern. Es kann bereits garantiert werden, dass Daten bis zu 1 Sekunde lang verloren gehen
Hybridpersistenz aktivieren, Redis4.0 unterstützt Hybridpersistenz RDB + inkrementelles AOF;Aktivieren Sie die Multithreading-Konfiguration. Vor Redis 6.0 wurde die Persistenz über den Haupt-Thread-Fork-Kindprozess abgewickelt, aber nach 6.0 werden mehrere Prozesse für die Verarbeitung von Persistenzvorgängen unterstützt
Clusteroptimierung
Slave führt Persistenzoptimierung durch: Der Master führt keine Persistenz durch und teilt den Druck der Master-Slave-Optimierung so weit wie möglich: Inkrementeller Modus, die Master-Slave-Synchronisationsmethode wird als inkrementeller Modus und als vollständiger RDB-Modus bezeichnet Der Vollmodus ist sehr leistungsintensiv. Wenn ein Master mehrere Slaves hat, kommen mehrere Slaves zum Master, um Daten zu synchronisieren, was die Leistung des Masters direkt beeinträchtigt.
Für dieses Problem unterstützt Redis die Kaskadensynchronisation, das heißt, der Master synchronisiert nur Daten mit einer Salve, und dann werden die Daten anderer Salven von dieser Salve aus synchronisiert, um den Druck auf den Master zu verringern.
Es wird empfohlen, dass die tatsächliche Größe 6G nicht überschreitet. Wenn die Instanz zu groß ist, bleibt die Master-Slave-Synchronisation hängen und führt in schwerwiegenden Fällen zum Ausfall des Masters.
AOF wird während eines abnormalen Neustarts wiederholt. Wenn die Instanz zu groß ist, erfolgt die Datenwiederherstellung ungewöhnlich langsam.
Choke-Point-Optimierung
Analyse: Da Redis bei der Verarbeitung von Anforderungen und Anweisungen Single-Threaded ist, ist sein Leistungsengpass das Problem der Synchronisationsblockierung.
großes Problem
Gefahren: Das Lesen und Schreiben von Bigkey kann zu einer Zeitüberschreitung führen und Redis verarbeitet Daten in einem einzelnen Thread, was den gesamten Redis-Dienst ernsthaft blockieren kann. Darüber hinaus wird ein Schlüssel nur in einen Knoten unterteilt, sodass der Druck des Skizzierens nicht geteilt werden kann. Bigkey-Erkennung: kommt mit dem Befehl bredis-cli-bigkeys. Redis enthält Anweisungen, mit denen nur der größte Schlüssel unter den fünf Datentypen gefunden werden kann. Dies ist nicht sehr nützlich und wird nicht empfohlen. Python-Scan-Skript. Es kann bestimmte Schlüssel lokalisieren, die Genauigkeit ist jedoch nicht hoch und wird nicht empfohlen.
rdb_bigkeys-Tool. Das in Go geschriebene Tool ist schnell und hochpräzise und kann zur einfachen Anzeige und Empfehlung auch direkt in eine CSV-Datei exportiert werden.
Optimierung: Für Bigkeys, die keine Zeichenfolgen sind, kann der Elementsatz in Vielfache aufgeteilt werden. Wenn ein Bigkey beispielsweise in 1000 Schlüssel aufgeteilt wird, wird das Suffix des Schlüssels modulo 1000 gehasht.
Verwenden Sie den lokalen Cache, speichern Sie beispielsweise die Geschäfts-ID + Versionsnummer in Redis, legen Sie den spezifischen Inhalt im lokalen Cache ab, überprüfen Sie zuerst den Redis-Cache für jede Abfrage und überprüfen Sie dann die Versionsnummer mit dem lokalen Cache.
Die Optimierung von Bigkey ist im Allgemeinen mühsam. Es wird empfohlen, Spezifikationen während der Entwicklung zu definieren, um Bigkey-Probleme zu vermeiden.
Ablaufrichtlinie
Geplantes Löschen: Jeder abgelaufene Schlüssel erhält einen geplanten Job und wird direkt gelöscht, wenn er abläuft. Er weist eine hohe Speicherauslastung und eine hohe CPU-Auslastung auf. Verzögertes Löschen: Bei der Abfrage des Schlüssels wird beurteilt, ob der Schlüssel abgelaufen ist. Dies führt zu einer geringen CPU-Auslastung und einer hohen Speicherauslastung. Regelmäßiges Löschen: Von Zeit zu Zeit scannen, abgelaufene Schlüssel werden direkt gelöscht und die CPU- und Speicherauslastung ist durchschnittlich.
1. Gierige Strategie. Redis legt den abgelaufenen Schlüssel in einem separaten Wörterbuch fest.
2. Scanvorgang. Wählen Sie 20 Schlüssel aus dem abgelaufenen Wörterbuch aus und löschen Sie die abgelaufenen Schlüssel aus den 20 Schlüsseln. Wenn der Anteil der gelöschten Schlüssel 1/4 überschreitet, wiederholen Sie Schritt 1.
Basierend auf der obigen Logik wird dem Algorithmus ein Timeout-Mechanismus hinzugefügt, um das Problem zu lösen, dass Threads aufgrund übermäßiger Schleifen hängen bleiben. Die Standardzeit beträgt 25 ms.
3. Scanfrequenz: Redis ist standardmäßig auf 10 Ablaufscans pro Sekunde eingestellt.
Redis aktiviert standardmäßig verzögertes Löschen und reguläres Löschen.
Optimierung: Aktivieren Sie Lazy-Free, und die zeitaufwändigen Vorgänge der Speicherfreigabe werden im Hintergrundthread ausgeführt, unterstützt von redis4.0+.
Multithreading-Modus aktivieren Vor Redis 6.0 war die Ablaufrichtlinie ein synchroner Vorgang des Hauptthreads. Nach 6.0 wird Multithreading für die Verarbeitung verwendet.
Anleitungen mit hoher Komplexität
Es wird empfohlen, Scans für stapelweise Abfragen zu verwenden und keine Schlüssel zu verwenden. Gilt nicht für Aggregationsvorgänge: Redis verwendet ein Single-Thread-Modell zur Verarbeitung von Anforderungen. Wenn Befehle ausgeführt werden, die zu komplex sind (mehr CPU-Ressourcen verbrauchen), werden nachfolgende Anforderungen in die Warteschlange gestellt und verursachen Verzögerungen, z. B. SINTER, SINTERSTORW, ZUNIONSTORE, ZINTERSTORE. usw. Es wird empfohlen, Scan zu verwenden, um die Elemente in der Sammlung stapelweise herauszufinden und Aggregationsberechnungen auf dem Client durchzuführen.
Containertyp-Datenvorgang: Wenn zu viele Containertypelemente vorhanden sind, führt die direkte Abfrage aufgrund des Netzwerks zu Verzögerungen. Es wird empfohlen, die Abfrage stapelweise durchzuführen.
Wenn zu viele Containerelemente vorhanden sind, kann das direkte Löschen von Schlüsseln dazu führen, dass Redis einfriert. Es wird empfohlen, sie stapelweise zu löschen.
Das obige ist der detaillierte Inhalt vonLeitfaden zur Redis-Optimierung: Netzwerk, Speicher, Festplatte, Blockierungspunkte. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!