Eine hĂ€ufige Frage von Nicht-Technikern zu verteilten Systemen lautet: âWie viele TPS hat Ihre Blockchain?â Allerdings hat die genannte Zahl hĂ€ufig wenig mit dem zu tun, was der Fragesteller tatsĂ€chlich hören möchte. In Wahrheit wollte er fragen: âEntspricht Ihre Blockchain meinen GeschĂ€ftsanforderungen?â Diese Anforderungen sind kein einzelner Wert, sondern eine Vielzahl von Bedingungen â dazu gehören die Ausfallsicherheit des Netzwerks, die Anforderungen an die EndgĂŒltigkeit, die GröĂe, die Art der Transaktionen und viele andere Parameter. Daher wird die Antwort auf die Frage âWie viele TPS?â wahrscheinlich nicht einfach sein und fast nie vollstĂ€ndig. Ein verteiltes System mit Dutzenden oder Hunderten von Knoten, die ziemlich komplexe Berechnungen durchfĂŒhren, kann sich in unzĂ€hligen verschiedenen ZustĂ€nden befinden, die mit dem Zustand des Netzwerks, dem Inhalt der Blockchain, technischen Störungen, wirtschaftlichen Problemen, Angriffen auf das Netzwerk und vielen anderen GrĂŒnden verbunden sind. Die Phasen, in denen Leistungsprobleme möglich sind, unterscheiden sich von traditionellen Diensten, wĂ€hrend ein Server des Blockchain-Netzwerks einen Netzwerkdienst darstellt, der die FunktionalitĂ€ten einer Datenbank, eines Webservers und eines Torrent-Clients kombiniert, was ihn in Bezug auf das Lastprofil fĂŒr alle Subsysteme â Prozessor, Arbeitsspeicher, Netzwerk, Speicher â Ă€uĂerst komplex macht.
Dezentralisierte Netzwerke und Blockchains sind fĂŒr Entwickler zentralisierter Software oft neu und speziell. Daher möchte ich wichtige Aspekte der Leistung und StabilitĂ€t dezentralisierter Netzwerke beleuchten, sowie AnsĂ€tze zu deren Messung und zur Identifizierung von EngpĂ€ssen. Wir werden verschiedene Leistungsprobleme behandeln, die die Geschwindigkeit der Servicebereitstellung fĂŒr Blockchain-Nutzer einschrĂ€nken, und die spezifischen Eigenschaften dieser Art von Software hervorheben.
Phasen der Serviceanfrage durch den Blockchain-Kunden
Um ehrlich ĂŒber die QualitĂ€t eines komplexen Dienstes zu sprechen, mĂŒssen nicht nur die Durchschnittswerte, sondern auch die maximalen/mindesten Werte, Mediane und Perzentile berĂŒcksichtigt werden. Theoretisch kann man von 1000 TPS in einer Blockchain sprechen, aber wenn 900 Transaktionen blitzschnell durchgefĂŒhrt werden und 100 Transaktionen mehrere Sekunden âhĂ€ngen bleibenâ, dann ist die Durchschnittszeit fĂŒr alle Transaktionen keine ehrliche Metrik fĂŒr den Kunden, der seine Transaktion innerhalb weniger Sekunden nicht abschlieĂen konnte. TemporĂ€re âLöcherâ, verursacht durch verpasste Konsensrunden oder Netzwerktrennungen, können den Dienst stark beeintrĂ€chtigen, der in Testumgebungen hervorragende Leistung gezeigt hat.
Um solche EngpĂ€sse zu identifizieren, ist es wichtig, die Phasen zu verstehen, in denen eine echte Blockchain Schwierigkeiten haben könnte, Benutzer zu bedienen. Lassen Sie uns den Liefervorgang und den Prozess der Verarbeitung von Transaktionen sowie den Erhalt des neuen Status der Blockchain beschreiben, aus dem der Kunde ersehen kann, dass seine Transaktion verarbeitet und berĂŒcksichtigt wurde.
- Die Transaktion wird auf dem Client erstellt
- Die Transaktion wird auf dem Client signiert
- Der Kunde wÀhlt einen der Nodes aus und sendet seine Transaktion dorthin.
- Der Kunde abonniert die Aktualisierungen der State-Datenbank des Nodes und wartet auf die Ergebnisse der AusfĂŒhrung seiner Transaktion.
- Der Node verbreitet die Transaktion im P2P-Netzwerk.
- Mehrere oder ein Blockproduzent (BP) verarbeiten die gesammelten Transaktionen und aktualisieren die State-Datenbank.
- Der BP bildet einen neuen Block, indem er die erforderliche Anzahl an Transaktionen verarbeitet.
- Der BP verbreitet den neuen Block im P2P-Netzwerk.
- Der neue Block wird dem Node zugestellt, mit dem der Kunde sich verbindet.
- Der Node aktualisiert die State-Datenbank.
- Der Node sieht das Update, das den Kunden betrifft, und sendet ihm eine Benachrichtigung ĂŒber die Transaktion.
Lassen Sie uns nun diese Schritte genauer betrachten und potenzielle Leistungsprobleme in jedem Schritt beschreiben. Im Gegensatz zu zentralisierten Systemen werden wir auch die AusfĂŒhrung von Code auf den Clients im Netzwerk betrachten. Oft wird bei der Messung der TPS die Verarbeitungszeit von Transaktionen von den Nodes erfasst und nicht vom Client â das ist nicht ganz fair. Den Clients ist es egal, wie schnell die Node ihre Transaktion verarbeitet hat; das Wichtigste fĂŒr sie ist der Moment, in dem die verlĂ€ssliche Information ĂŒber diese Transaktion, die im Blockchain enthalten ist, fĂŒr sie verfĂŒgbar wird. Genau diese Metrik ist im Grunde die AusfĂŒhrungszeit der Transaktion. Das bedeutet, dass verschiedene Clients, selbst wenn sie die gleiche Transaktion senden, völlig unterschiedliche Zeiten erhalten können, die von Faktoren wie dem Kanal, der Auslastung und der NĂ€he der Node abhĂ€ngen, usw. Daher ist es unerlĂ€sslich, diese Zeit auf den Clients zu messen, da genau dieses Parameter optimiert werden muss.
Vorbereitung der Transaktion auf der Client-Seite
Lassen Sie uns mit den ersten beiden Punkten beginnen: Die Transaktion wird vom Kunden erstellt und signiert. MerkwĂŒrdigerweise kann dies auch ein Engpass in der Leistung der Blockchain aus der Sicht des Kunden sein. Dies ist fĂŒr zentralisierte Dienste ungewohnt, die alle Berechnungen und Datenoperationen selbst ĂŒbernehmen, wĂ€hrend der Kunde nur eine kurze Anfrage vorbereitet, die groĂe Datenmengen oder Berechnungen anfordern kann und ein fertiges Ergebnis erhĂ€lt. In Blockchain-Systemen wird der Client-Code immer leistungsfĂ€higer, wĂ€hrend der Kern der Blockchain immer leichter wird. Massive Rechenaufgaben werden ĂŒblicherweise an die Client-Software delegiert. In Blockchains gibt es Clients, die eine einzelne Transaktion relativ lange vorbereiten können (ich spreche dabei von verschiedenen Merkle-Proofs, succinct proofs, threshold Signaturen und anderen komplexen Operationen auf der Client-Seite). Ein gutes Beispiel fĂŒr eine unkomplizierte On-Chain-Verifizierung und die aufwendige Vorbereitung einer Transaktion auf der Client-Seite ist der Nachweis der Zugehörigkeit zu einer Liste auf Basis von Merkle-BĂ€umen. .
Sie sollten auch bedenken, dass der Client-Code nicht einfach Transaktionen an die Blockchain sendet, sondern zunĂ€chst den Zustand der Blockchain abruft â und diese AktivitĂ€t kann die Netzwerkauslastung und die Blockchain-Knoten beeinflussen. Daher ist es sinnvoll, bei Messungen das Verhalten des Client-Codes so vollstĂ€ndig wie möglich zu emulieren. Selbst wenn in Ihrer Blockchain gewöhnliche leichte Clients vorhanden sind, die bei einfachsten Transaktionen eine digitale Signatur fĂŒr die Ăbertragung eines bestimmten Assets setzen, steigt die Anzahl der massiven Berechnungen auf dem Client mit jedem Jahr. Die Kryptographie wird robuster, und dieser Teil des Prozesses könnte in Zukunft zu einem signifikanten Engpass werden. Seien Sie also vorsichtig und ĂŒbersehen Sie nicht, dass bei einer Transaktion von 3,5 Sekunden, 2,5 Sekunden fĂŒr die Vorbereitung und Signatur der Transaktion und 1,0 Sekunden fĂŒr die Ăbermittlung im Netzwerk und das Warten auf eine Antwort verwendet werden. Um die Risiken dieses Engpasses zu bewerten, mĂŒssen Sie Metriken von den Client-Maschinen sammeln, nicht nur von Blockchain-Knoten.
Transaktion senden und ihren Status ĂŒberwachen
Der nĂ€chste Schritt besteht darin, die Transaktion an den ausgewĂ€hlten Blockchain-Knoten zu senden und den Status ihrer Aufnahme in den Transaktionspool abzurufen. Dieser Schritt Ă€hnelt einem herkömmlichen Datenbankaufruf: Der Knoten muss die Transaktion im Pool speichern und beginnen, Informationen darĂŒber ĂŒber das P2P-Netzwerk zu verbreiten. Der Ansatz zur Leistungsbewertung hier Ă€hnelt der Bewertung der Leistung traditioneller Microservices im Web-API-Bereich, wobei die Transaktionen in Blockchain-Netzwerken aktualisiert und aktiv ihren Status Ă€ndern können. TatsĂ€chlich kann die Aktualisierung von Informationen zu einer Transaktion in bestimmten Blockchains mehrere Male stattfinden, z.B. beim Umschalten zwischen Forks der Kette oder wenn BPs (Block Producer) ihre Absicht mitteilen, die Transaktion in einen Block aufzunehmen. EinschrĂ€nkungen hinsichtlich des Volumens dieses Pools und der Anzahl der darin enthaltenen Transaktionen können sich auf die Leistung der Blockchain auswirken. Wenn der Transaktionspool auf die maximal mögliche GröĂe gefĂŒllt ist oder nicht im Arbeitsspeicher Platz findet, kann die Netzwerkleistung erheblich sinken. Blockchains haben keine zentralen Schutzmechanismen gegen den Fluss von Spam-Nachrichten, und wenn die Blockchain Transaktionen mit hohem Volumen und niedrigen GebĂŒhren unterstĂŒtzt, kann dies zu einer Ăberlastung des Transaktionspools fĂŒhren â dies ist ein weiterer potenzieller Engpass in der Performance.
In Blockchains sendet der Kunde eine Transaktion an einen beliebigen Knoten des Blockchain-Netzwerks. Der Hash der Transaktion ist dem Kunden in der Regel bereits vor der Ăbertragung bekannt, sodass er lediglich eine Verbindung herstellen und auf die BestĂ€tigung warten muss, wenn die Blockchain ihren Zustand Ă€ndert und seine Transaktion integriert. Es ist anzumerken, dass die Messung von 'tps' verschiedene Ergebnisse fĂŒr unterschiedliche Verbindungsarten zum Blockchain-Knoten liefern kann. Dies kann ĂŒber das herkömmliche HTTP RPC oder WebSocket erfolgen, das das 'subscribe'-Muster ermöglicht. Im zweiten Fall erhĂ€lt der Kunde die Benachrichtigung schneller, und der Knoten verbraucht weniger Ressourcen (hauptsĂ€chlich Speicher und Datenverkehr) fĂŒr Antworten zum Transaktionsstatus. Daher sollte beim Messen von 'tps' die Art der Verbindung der Kunden zu den Knoten berĂŒcksichtigt werden. Um die Risiken eines Bottlenecks zu bewerten, sollte das Blockchain-Benchmarking in der Lage sein, sowohl Clients ĂŒber WebSocket als auch ĂŒber HTTP RPC-Anfragen zu emulieren, entsprechend den Anteilen realer Netzwerke, sowie die Art und GröĂe der Transaktionen zu variieren.
Zur Bewertung der Risiken eines Bottlenecks sollten auch Metriken von den Client-Maschinen und nicht nur von den Blockchain-Knoten gesammelt werden.
Ăbertragung von Transaktionen und Blöcken ĂŒber das P2P-Netzwerk
In Blockchains wird fĂŒr die Ăbertragung von Transaktionen und Blöcken zwischen den Teilnehmern ein Peer-to-Peer (P2P) Netzwerk verwendet. Transaktionen breiten sich im Netzwerk aus, beginnend mit einem der Knoten, bis sie die Peer-Blockproduzenten erreichen, die die Transaktionen in Blöcke bĂŒndeln und die neuen Blöcke mit dem gleichen P2P-Protokoll an alle Knoten im Netzwerk verteilen. Die Grundlage der meisten modernen P2P-Netzwerke sind verschiedene Modifikationen des Kademlia-Protokolls. eine gute kurze Ăbersicht ĂŒber dieses Protokoll, sowie ein Artikel mit verschiedenen Messungen im BitTorrent-Netzwerk, der zeigt, dass dieser Netztyp komplexer und weniger vorhersehbar ist als ein starr konfiguriertes Netzwerk eines zentralisierten Dienstes. DarĂŒber hinaus ein Artikel ĂŒber die Messung verschiedener interessanter Metriken fĂŒr Ethereum-Knoten.
Kurz gesagt unterstĂŒtzt jeder Peer in solchen Netzwerken eine eigene dynamische Liste anderer Peers, von denen er Informationsblöcke anfordert, die nach Inhalt adressiert sind. Bei Erhalt einer Anfrage gibt der Peer entweder die benötigten Informationen weiter oder leitet die Anfrage an den nĂ€chsten pseudo-zufĂ€lligen Peer in der Liste weiter. Nach Erhalt der Antwort ĂŒbermittelt er diese an den Anfragenden und speichert sie eine Zeit lang im Cache, sodass er den Informationsblock beim nĂ€chsten Mal schneller bereitstellen kann. So gelangt populĂ€re Information in viele Caches ĂŒber zahlreiche Peers, wĂ€hrend weniger populĂ€re Inhalte allmĂ€hlich verdrĂ€ngt werden. Die Peers fĂŒhren Buch darĂŒber, wie viel Information sie wem ĂŒbermittelt haben, und das Netzwerk versucht, aktive Verteiler zu belohnen, indem es deren Rating erhöht und ihnen einen besseren Service-Level bietet, wĂ€hrend inaktive Teilnehmer automatisch aus den Peer-Listen entfernt werden.
Um die Transaktion nun zu verbreiten, muss sie im Netzwerk sichtbar gemacht werden, damit sie von den Blockproduzenten gesehen und in einen Block aufgenommen wird. Der Knoten "verteilt" die neue Transaktion aktiv an alle Interessierten und hört gleichzeitig im Netzwerk auf, um den Block zu erwarten, in dem die angeforderte Transaktion erscheinen wird, um den wartenden Kunden zu benachrichtigen. Die Zeit, die benötigt wird, damit das Netzwerk Informationen ĂŒber neue Transaktionen und Blöcke in P2P-Netzen austauscht, hĂ€ngt von einer Vielzahl von Faktoren ab: der Anzahl der ehrlichen, dabei aktiven Knoten in der NĂ€he (aus der Sicht des Netzwerks), der "WĂ€rmung" der Caches dieser Knoten, der GröĂe der Blöcke, der Transaktionen, der Art der Ănderungen, der Geographie des Netzwerks, der Anzahl der Knoten und vieler weiterer Faktoren. Komplexe Messungen der Leistungsmetriken in solchen Netzwerken sind eine Herausforderung, da gleichzeitig die Bearbeitungszeiten sowohl fĂŒr die Anfragen der Klienten als auch fĂŒr die Peers (Blockchain-Knoten) bewertet werden mĂŒssen. Probleme in einem der P2P-Mechanismen, falsches Aggressiv-Laden und Caching von Daten, ineffizientes Management der Listen aktiver Peers und viele andere Faktoren können zu Verzögerungen fĂŒhren, die die Effizienz des gesamten Netzwerks beeinflussen, und dieser Engpass ist der schwierigste zu analysieren, zu testen und die Ergebnisse zu interpretieren.
Die Verarbeitung von Blockchains und die Aktualisierung der Zustand-Datenbank
Der Algorithmus fĂŒr den Konsens ist das HerzstĂŒck der Blockchain-Arbeit. Er wird auf die neuen, aus dem Netzwerk erhaltenen Blöcke angewendet und verarbeitet Transaktionen, indem die Ergebnisse in die Zustand-Datenbank geschrieben werden. Das HinzufĂŒgen eines neuen Blocks zur Kette und die darauf folgende Auswahl der Hauptkette mĂŒssen so schnell wie möglich erfolgen. In der RealitĂ€t bedeutet jedoch "muss" nicht immer "funktioniert", und man kann sich zum Beispiel eine Situation vorstellen, in der zwei lange konkurrierende Ketten stĂ€ndig zwischen sich umschalten, wĂ€hrend sie die Metadaten von Tausenden von Transaktionen im Pool bei jedem Wechsel Ă€ndern und fortlaufend den Zustand der Zustand-Datenbank zurĂŒcksetzen. In Bezug auf die Ermittlung des Bottlenecks ist dieser Schritt einfacher als die Netzwerk-P2P-Schicht, da die DurchfĂŒhrung von Transaktionen und der Konsensalgorithmus strikt deterministisch sind, was die Messung hier erheblich erleichtert.
Das Wichtigste ist, die zufĂ€llige Leistungsverschlechterung dieses Schrittes nicht mit Netzwerkproblemen zu verwechseln â Nodes geben Blocks und Informationen zur Hauptkette langsamer weiter, und fĂŒr den externen Kunden kann dies wie ein langsames Netzwerk erscheinen, obwohl das Problem an einer ganz anderen Stelle liegt.
Zur Optimierung der Leistung ist es in diesem Stadium hilfreich, Metriken von den Knoten zu sammeln und zu ĂŒberwachen. Dabei sollten auch die Metriken zur Aktualisierung der State-Datenbank einbezogen werden: die Anzahl der auf dem Knoten verarbeiteten Blöcke, deren GröĂe, die Anzahl der Transaktionen, die HĂ€ufigkeit von Fork-Wechseln, die Anzahl ungĂŒltiger Blöcke, die Laufzeit der virtuellen Maschine, die Dauer der Datenspeicherung usw. Dies hilft, Netzwerkprobleme nicht mit Fehlern im Chain-Processing-Algorithmus zu verwechseln.
Eine virtuelle Maschine zur Verarbeitung von Transaktionen kann eine nĂŒtzliche Informationsquelle sein, die die Effizienz von Blockchain-Operationen optimiert. Die Menge der zugewiesenen SpeicherkapazitĂ€t, die Anzahl der Lese-/Schreibbefehle und andere Kennzahlen zur EffektivitĂ€t der AusfĂŒhrung von Vertragscodes können Entwicklern wertvolle Einblicke geben. Zugleich sind Smart Contracts Programme, was bedeutet, dass sie theoretisch jede Art von Ressourcen nutzen können: CPU, Speicher, Netzwerk und Speicherplatz. Daher ist die Verarbeitung von Transaktionen ein eher ungewisser Prozess, der zudem stark variieren kann, wenn zwischen Versionen gewechselt wird oder sich der Code der VertrĂ€ge Ă€ndert. Folglich sind Kennzahlen zur Verarbeitung von Transaktionen ebenfalls erforderlich, um die Leistung des Blockchain-Systems effektiv zu optimieren.
Der Kunde erhĂ€lt eine Benachrichtigung ĂŒber die Aufnahme der Transaktion in die Blockchain
Dies ist die endgĂŒltige Phase, in der der Kunde den Blockchain-Service erhĂ€lt. Im Vergleich zu anderen Phasen gibt es hier keine groĂen Overhead-Kosten, dennoch sollte die Möglichkeit berĂŒcksichtigt werden, dass der Kunde umfangreiche Antworten von der Node erhĂ€lt (zum Beispiel einen Smart Contract, der ein Datenarray zurĂŒckgibt). In jedem Fall ist dieser Moment der entscheidende Punkt fĂŒr alle, die die Frage stellen: âWie viele TPS hat Ihre Blockchain?â, da zu diesem Zeitpunkt die Service-Zeit erfasst wird.
An dieser Stelle ist es wichtig, die gesamte Zeit zu erfassen, die der Kunde mit dem Warten auf eine Antwort von der Blockchain verbracht hat. Genau diese Zeit wird der Benutzer in seiner Anwendung auf die BestÀtigung warten, und deren Optimierung ist die Hauptaufgabe der Entwickler.
Fazit
Infolgedessen können die Arten von Operationen, die in Blockchains ausgefĂŒhrt werden, beschrieben und in mehrere Kategorien eingeteilt werden:
- Kryptografische Transformationen, Erstellung von Beweisen
- Peer-to-Peer-Netzwerke, Replikation von Transaktionen und Blöcken
- Verarbeitung von Transaktionen, AusfĂŒhrung von Smart Contracts
- Anwendung von Ănderungen in der Blockchain auf die Statusdatenbank, Aktualisierung der Daten zu Transaktionen und Blöcken
- read-only Anfragen an die Zustandsdatenbank, API der Blockchain-Knoten, Abonnementdienste
Die technischen Anforderungen an moderne Blockchain-Knoten sind insgesamt sehr hoch â hier sind schnelle CPUs fĂŒr die Kryptografie erforderlich, viel Arbeitsspeicher, um die Zustandsdatenbank zu speichern und schnell darauf zuzugreifen, sowie ein Netzwerk, das eine groĂe Anzahl gleichzeitig geöffneter Verbindungen unterstĂŒtzt, und umfangreicher Speicher. Diese hohen Anforderungen und die Vielzahl verschiedener Operationstypen fĂŒhren zwangslĂ€ufig dazu, dass die Ressourcen der Knoten nicht ausreichen, und dann kann jeder der oben genannten Schritte zum nĂ€chsten Flaschenhals fĂŒr die Gesamtleistung des Netzwerks werden.
Bei der Entwicklung und Bewertung der Leistung von Blockchains mĂŒssen alle diese Aspekte berĂŒcksichtigt werden. Dazu gehört das gleichzeitige Sammeln und Analysieren von Metriken sowohl von Clients als auch von Knoten im Netzwerk, das Suchen nach Korrelationen zwischen ihnen, die Beurteilung der Bereitstellungszeit fĂŒr die Kunden, sowie das BerĂŒcksichtigen aller wesentlichen Ressourcen: CPU/Speicher/Netzwerk/Speicherplatz. Es ist wichtig zu verstehen, wie sie genutzt werden und wie sie sich gegenseitig beeinflussen. All dies macht den Vergleich der Geschwindigkeiten verschiedener Blockchains in Form von âwie viele TPSâ zu einer Ă€uĂerst undankbaren Aufgabe, da es eine riesige Anzahl verschiedener Konfigurationen und ZustĂ€nde gibt. In groĂen zentralisierten Systemen, die aus Hunderten von Servern bestehen, sind diese Probleme ebenfalls komplex und erfordern das Sammeln einer Vielzahl unterschiedlicher Metriken, jedoch in Blockchains aufgrund von P2P-Netzwerken, virtuellen Maschinen, die VertrĂ€ge verarbeiten, und einer internen Wirtschaft, gibt es weitaus mehr Freiheitsgrade. Dies macht Tests selbst auf mehreren Servern nicht aussagekrĂ€ftig und zeigt lediglich grobe Werte, die kaum mit der RealitĂ€t ĂŒbereinstimmen.
Daher verwenden wir bei der Entwicklung im Kern der Blockchain eine recht komplexe Software, die den Start der Blockchain mit Dutzenden von Knoten orchestriert, automatisierte Benchmarks durchfĂŒhrt und Metriken sammelt. Ohne diese Informationen ist es Ă€uĂerst schwierig, Protokolle, die mit mehreren Teilnehmern arbeiten, zu debuggen.
Wenn Sie also die Frage "Wie viel TPS hat Ihre Blockchain?" erhalten, bieten Sie Ihrem GesprĂ€chspartner einen Tee an und fragen Sie, ob er bereit ist, sich mit einem Dutzend Grafiken auseinanderzusetzen und allen drei Herausforderungen bezĂŒglich der Leistungsprobleme von Blockchains und Ihren VorschlĂ€gen zu deren Lösung zuzuhören...
Quelle: habr.com
