Volos erster Jahrestag von Open Source – Leistungsoptimierung und ökologisches Bauen

Dieser Artikel ist der dritte in der Reihe zur Feier zum zweiten Jubiläum von CloudWeGo.

Wenn wir auf die Arbeit des CloudWeGo Rust-Teams im vergangenen Jahr zurückblicken, sind es, wenn wir sie mit zwei Schlüsselwörtern zusammenfassen wollen, Leistungsoptimierung und ökologisches Bauen. Dieser Artikel ist hauptsächlich in drei Punkte unterteilt. Der erste Punkt besteht darin, die Entwicklung von Volo in diesem Jahr grob zusammenzufassen und zu überprüfen. Der zweite Punkt besteht darin, sich auf die Leistungsoptimierung in Volo zu konzentrieren Aspekte.

1. Volo dieses Jahr

Im August 2022 veröffentlichten wir eine offizielle Ankündigung mit dem Titel „ Das erste RPC-Framework in China basierend auf der Rust-Sprache – Volo ist offiziell Open Source Volo – Funktionsvervollständigung und Leistungsoptimierung, Pilota – Leistungsverbesserung, Motore – Stabilisierung und Metainfo – Benutzerfreundlichkeit.

Insbesondere möchten wir Sie dazu einladen, einige der wichtigsten Knoten und technischen Updates von Volo in diesem Jahr zu besprechen.

  • Kurz nach der Veröffentlichung von Open Source erhielten wir die erste PR von Community-Mitschüler @anwentec. Diese PR unterstützt hauptsächlich Benutzer bei der Verwendung von Volo für die Entwicklung unter Windows, was die Multiplattform-Unterstützung des Frameworks erheblich ergänzt.

  • Unmittelbar danach leiteten wir die erste große Leistungsoptimierung seit der Veröffentlichung ein – die Codierungs- und Decodierungsrekonstruktion. Diese Optimierung wurde ursprünglich von einem PR-Vorschlag von Community-Klassenkamerad @ii64 in Pilota zur Unterstützung des Thrift-Protokolls inspiriert. Wir haben festgestellt, dass die vorhandenen Funktionen von Volo Benutzern die Eingabe benutzerdefinierter Codecs nicht gut unterstützen können, daher verfügen wir über die aktuelle Rekonstruktion und Optimierung des Volo-Codecs.

  • Es ist erwähnenswert, dass wir während dieses Prozesses auch zwei Crates veröffentlicht haben, LinkedInedbytes und Faststr, die nicht nur bei der Optimierung helfen, sondern auch das zugehörige Rust-Open-Source-Ökosystem bereichern.

  • Schließlich haben wir in Bezug auf die Codierung und Decodierung auch einige Grenzprüfungen durch unsicheren Code umgangen, sodass der Hilfscompiler effizientere SIMD-Paralleloperationsanweisungen generieren kann, was die Leistung erheblich verbessert. Wenn Sie detailliertere Informationen zum Fortschritt von Volo erhalten möchten, können Sie unsere Versionshinweise auf der offiziellen CloudWeGo-Website lesen.

2. Leistungsoptimierung

Im RPC-Framework sind Serialisierung und Netzwerkkommunikation die leistungsintensivsten Aspekte . Unsere Leistungsoptimierung konzentriert sich hauptsächlich auf diese beiden Punkte. Die folgende Abbildung zeigt einen vollständigen RPC-Aufruf-Link. Unsere Optimierungsarbeit konzentriert sich im Wesentlichen auf diese CPU-intensiven und E/A-intensiven Aufgaben. Die Optimierung der Codierung und Decodierung sowie die Optimierung der unsicheren Codierung und Decodierung konzentrieren sich hauptsächlich auf In Der Serialisierungs-Kodierungs- und Dekodierungsteil. Wenn Sie an einer umfassenden Leistungsoptimierung teilnehmen möchten, ist dies eine gute Referenz.

2.1 Codec-Rekonstruktionsoptimierung

Die Optimierung dieses Bereichs besteht hauptsächlich im Nullkopiervorgang des Speichers. Wir wissen, dass bei einem RPC-Aufruf die Benutzeranforderungsstruktur in einen binären Bytestrom serialisiert und im Benutzermodusspeicher gespeichert und dann über den Schreibsystemaufruf zum Senden in den Kernelmodusspeicher geschrieben werden muss -Kopieren Sie den von uns optimierten Teil. Im ersten Schritt wird er im Benutzermodusspeicher gespeichert. In den meisten Implementierungen entsteht für Stringdiese Vec<u8>Art der Serialisierung ein Kopieraufwand, da das, was im Schreibsystemaufruf geschrieben wird, ein zusammenhängender Speicher sein muss. Die Frage ist also: Wenn kein kontinuierliches Schreiben in den Speicher erforderlich ist, kann die Kopie hier weggelassen werden? Die Antwort liegt auf der Hand, indem wir den Speicher in der Benutzeranforderungsstruktur wiederverwenden und ihn dann in Form einer verknüpften Liste zum Schreiben aneinanderreihen.

Wenn Sie Speicher wiederverwenden möchten, müssen Sie unbedingt eine Referenzzählung einführen, um zu bestimmen, wann dieser Speicher freigegeben werden kann. Daher erfüllen die ursprünglichen beiden Typen von Stringund Vec<u8>nicht die Anforderungen. Wir benötigen Typen wie Arc<String>und . Arc<Vec<u8>>Glücklicherweise Vec<u8>gibt es in der Open-Source-Community bereits BytesStrukturen in der Bytes-Bibliothek, die als Alternativen verwendet werden können. Es gibt jedoch Stringkeinen guten Ersatz, und dies ist einer der Gründe, warum die Faststr-Bibliothek geboren wurde.

Die Faststr-Bibliothek stellt hauptsächlich eine FastStrStruktur bereit, wie unten gezeigt. Tatsächlich handelt es sich um eine Sammlung verschiedener Zeichenfolgentypen. Zusätzlich zur Erfüllung der oben genannten Anforderungen für die Wiederverwendung von Speicher bietet es auch bestimmte Optimierungen für kleine Zeichenfolgen, z. B. die direkte Zuweisung von Speicher auf dem Stapel. Natürlich werden einige Leute hier Fragen haben. &strWenn es die Anforderungen erfüllen kann, warum wird Faststr noch benötigt? Tatsächlich ist dies nicht der Fall. In einigen Szenarien können wir den Lebenszyklus nicht ausdrücken. Eine detaillierte Erklärung dieses Teils finden Sie in der Faststr-Dokumentation.

StringDie Linkedbytes-Bibliothek basiert hauptsächlich auf der Idee verknüpfter Listen und Vec<u8>schreibt den Speicher, den wir oben wiederverwendet haben, über den Systemaufruf writev. Es gibt zwei Hauptteile in LinkedBytes: Der eine ist ein Feld, das vorübergehend Nichtsummenspeicher speichert String, Vec<u8>und bytesder andere ist ein Feld, das Speicher aneinanderreiht list. Sie können sich kurz die Logik des Einfügens ansehen, indem Sie Byteszuerst den aktuell temporär gespeicherten kontinuierlichen Speicher aufteilen listund dann den eingehenden einfügen Bytes.

2.2 Unsichere Codec-Optimierung

Die Optimierung in diesem Bereich dient hauptsächlich dazu, den Compiler dabei zu unterstützen, effizienten Assemblercode zu generieren. Am Beispiel der Codierung Vec<i64>ist es unter normalen Umständen beim Schreiben in den Speicher einfach, den Code wie unten gezeigt zu schreiben, dh ihn direkt zu durchlaufen Vecund dann put_i64()die Methode zum Schreiben aufzurufen.

Wenn wir uns jedoch die Implementierung der Methode genauer ansehen put_i64(), werden wir feststellen, dass bei jedem Schreibvorgang zunächst festgestellt wird, ob der Speicher ausreicht. Wenn dieser nicht ausreicht, wird der Speicher vor dem Schreiben erweitert. Wenn wir also von Anfang an genügend Speicher zugewiesen haben, können wir die Grenzprüfung hier vollständig weglassen, sodass wir eine geringfügige Änderung vornehmen und den Code wie unten gezeigt schreiben können.

Nach dem Schreiben des Codes besteht der nächste Schritt darin, einen Leistungstest zu schreiben und ihn auszuführen. Wenn Sie ihn nicht ausführen, werden Sie schockiert sein. Vielleicht denken Sie genauso wie wir zuvor: Wenn Sie nur die Grenzprüfung entfernen, sollte die Leistungsverbesserung nicht groß sein, aber wenn Sie sich die Abbildung unten ansehen, hat sie tatsächlich einen 7- bis 8-fachen Nutzen.

Wir müssen uns also genauer ansehen, warum? Wie das Sprichwort sagt: Wenn Sie tiefgreifend optimieren möchten, kann der Assembler-Code nicht ausgeführt werden. Lassen Sie uns beides in Assembler-Code umwandeln und noch einmal betrachten. Die folgenden beiden Bilder zeigen einen Teil des Assembler-Codes während des Schreibvorgangs.

Nachdem ich dies gelesen habe, bin ich davon überzeugt, dass Schüler, die mit SIMD-Anweisungen vertraut sind, plötzlich aufgewacht sind. Im Assembler-Code werden SIMD-Anweisungen verwendet, um das Schreiben in den Speicher zu beschleunigen Leistungsvorteile sind ebenfalls sinnvoll.

3. Zukunftsaussichten

Abschließend gebe ich Ihnen einen Spoiler zu einigen der Projekte, die wir derzeit ausprobieren, und zu den Teilen, auf deren Optimierung wir uns in Zukunft konzentrieren werden.

1. Neue Projekte

Das erste ist das Shmipc-rs-Projekt. Studenten, die mit CloudWeGo vertraut sind, wissen vielleicht, dass Shmipc jetzt ein Open-Source-Projekt ist, aber es ist nur die Implementierung der Spec- und Go-Sprachversionen , die bis dahin ebenfalls in Volo integriert wird, um die Leistung zu verbessern. Shmipc ist eine prozessübergreifende Kommunikation, die auf gemeinsam genutztem Speicher basiert und hauptsächlich für Szenarien mit großen Paketen und hohem Durchsatz geeignet ist.

Das zweite ist das Volo-http-Projekt, das eine Entwicklungserfahrung bietet, die mit dem in der Community weit verbreiteten Axum-Framework übereinstimmt. Der Middleware-Teil basiert auf unserem eigenen Open-Source-Motore, was in Zukunft einige Leistungsverbesserungen bringen wird Es wird auch erwartet, dass es mit dem Volo-gRPC-Projekt kombiniert wird, um Gateway und andere Funktionen bereitzustellen. Es ist ab sofort verfügbar und jeder ist herzlich eingeladen, es gemeinsam zu erleben und zu bauen.

2. Optimierung der Benutzerfreundlichkeit

Der erste ist der Dokumentationsteil. Derzeit gibt es in Volo viele funktionale Funktionen, aber den meisten davon fehlt es an Dokumentation, sodass Benutzer sie nicht gut nutzen und erleben können. In Zukunft werden wir die Arbeit der Dokumentergänzung einbeziehen Verfolgen Sie die Ausgabe weiter und jeder ist herzlich willkommen, sich zu beteiligen.

Der zweite Teil ist der Best-Practice-Teil. Derzeit gibt es in Volo nur einige einfache Beispieldemos, die Benutzer erlernen und verwenden können, aber es gibt keine kleinen und mittleren Projekte, aus denen Benutzer lernen und das Volo-Framework verstehen können Ein Teil, der in Zukunft gestärkt werden muss. Wenn es Projekte gibt, die Sie zur Umsetzung empfehlen, können Sie gerne ein Thema eröffnen und diese gemeinsam besprechen.

Das Obige ist ein Rückblick und Ausblick auf das erste Jubiläum von Volo Open Source anlässlich des zweiten Jubiläums von CloudWeGo. Ich hoffe, es wird für alle hilfreich sein.

Projektadresse

GitHub: https://github.com/cloudwego Offizielle Website: www.cloudwego.io

Die Raubkopien von „Celebrating More Than Years 2“ wurden auf npm hochgeladen, was dazu führte, dass npmmirror den Unpkg-Dienst einstellen musste und sich gemeinsam mit Hunderten von Menschen in die USA begab Front-End-Visualisierungsbibliothek und Baidus bekanntes Open-Source-Projekt ECharts – „Going to the Sea“ zur Unterstützung Fischbetrüger nutzten TeamViewer, um 3,98 Millionen zu überweisen! Was sollten Remote-Desktop-Anbieter tun? Zhou Hongyi: Für Google bleibt nicht mehr viel Zeit. Es wird empfohlen, dass alle Produkte Open Source sind. Ein ehemaliger Mitarbeiter eines bekannten Open-Source-Unternehmens brachte die Nachricht: Nachdem er von seinen Untergebenen herausgefordert wurde, wurde der technische Leiter wütend hat die schwangere Mitarbeiterin entlassen. Google hat gezeigt, wie man ChromeOS in einer virtuellen Android-Maschine ausführt. Bitte geben Sie mir einen Rat, welche Rolle time.sleep(6) hier spielt. Microsoft reagiert auf Gerüchte, dass Chinas KI-Team „für die USA packt“. People's Daily Online kommentiert die matroschkaartige Aufladung von Bürosoftware: Nur durch das aktive Lösen von „Sets“ können wir eine Zukunft haben
{{o.name}}
{{m.name}}

Ich denke du magst

Origin my.oschina.net/u/4843764/blog/11043974
Empfohlen
Rangfolge