Das QUIC-Protokoll in der Praxis: Wie es von Uber implementiert wurde, um die Leistung zu optimieren

Es ist Ă€ußerst interessant, das QUIC-Protokoll zu beobachten, weshalb wir gerne darĂŒber schreiben. WĂ€hrend frĂŒhere Veröffentlichungen ĂŒber QUIC eher historischer (regionalhistorischer, wenn Sie so möchten) und materietechnischer Natur waren, freuen wir uns heute, eine Übersetzung anderer Art zu veröffentlichen – es geht um die tatsĂ€chliche Anwendung des Protokolls im Jahr 2019. Und es geht nicht um kleine Infrastrukturen, die in einer hypothetischen Garage basieren, sondern um Uber, das nahezu weltweit tĂ€tig ist. Wie die Ingenieure des Unternehmens zu der Entscheidung kamen, QUIC in der Produktion zu verwenden, wie sie Tests durchfĂŒhrten und was sie nach der Rollout in die Produktion sahen – mehr dazu im Folgenden.

Die Bilder sind anklickbar. Viel Spaß beim Lesen!

Das QUIC-Protokoll in der Praxis: Wie es von Uber implementiert wurde, um die Leistung zu optimieren

Uber ist von globaler Dimension, mit 600 StĂ€dten, in denen die App verfĂŒgbar ist, und in jeder dieser StĂ€dte verlĂ€sst sich die App vollstĂ€ndig auf drahtloses Internet von mehr als 4500 Mobilfunkanbietern. Die Benutzer erwarten, dass die App nicht nur schnell, sondern in Echtzeit funktioniert – um dies zu gewĂ€hrleisten, benötigt die Uber-App niedrige Latenzen und eine sehr zuverlĂ€ssige Verbindung. Leider verhĂ€lt sich der Stack HTTP/2 schlecht in dynamischen und verlustanfĂ€lligen drahtlosen Netzwerken. Wir haben erkannt, dass in diesem Fall die geringe Leistung direkt mit den TCP-Implementierungen im Betriebssystemkern verbunden ist.

Um das Problem zu lösen, haben wir QUIC, ein modernes Protokoll mit Kanal-Multiplexing verwendet, das uns mehr Kontrolle ĂŒber die Leistung des Transportprotokolls gibt. Derzeit standardisiert die Arbeitsgruppe IETF QUIC als HTTP/3.

Nach eingehenden Tests sind wir zu dem Schluss gekommen, dass die Implementierung von QUIC in unsere App die "Tail-Latenzen" im Vergleich zu TCP reduzieren wird. Wir haben eine Verringerung im Bereich von 10-30 % fĂŒr HTTPS-Verkehr anhand der Fahrer- und Passagieranwendungen beobachtet. Außerdem gab uns QUIC eine durchgĂ€ngige Kontrolle ĂŒber die Benutzerdatenpakete.

In diesem Artikel teilen wir unsere Erfahrungen bei der Optimierung von TCP fĂŒr Uber-Anwendungen mithilfe eines Stacks, der QUIC unterstĂŒtzt.

Das letzte Wort der Technik: TCP

Heute ist TCP das am hĂ€ufigsten verwendete Transportprotokoll fĂŒr die Lieferung von HTTPS-Traffic im Internet. TCP gewĂ€hrleistet einen zuverlĂ€ssigen Byte-Stream, wodurch es mit NetzwerkĂŒberlastungen und Verlusten auf der Kanalschicht fertig wird. Die weitreichende Anwendung von TCP fĂŒr HTTPS-Traffic ist auf die Allgegenwart des Protokolls zurĂŒckzufĂŒhren (so gut wie jedes Betriebssystem enthĂ€lt TCP), auf die VerfĂŒgbarkeit im Großteil der Infrastruktur (zum Beispiel auf Lastverteilern, HTTPS-Proxys und CDN) und auf die „Out-of-the-Box“-FunktionalitĂ€t, die fast auf den meisten Plattformen und Netzwerken verfĂŒgbar ist.

Die meisten Benutzer verwenden unsere Anwendung unterwegs, und die „Schwanz“-Latenzen von TCP entsprachen nicht den Anforderungen unseres Echtzeit-HTTPS-Verkehrs. Einfach gesagt, dies war ein Problem, mit dem Benutzer weltweit konfrontiert waren – in Abbildung 1 sind die Latenzen in großen StĂ€dten dargestellt:

Das QUIC-Protokoll in der Praxis: Wie es von Uber implementiert wurde, um die Leistung zu optimieren
Abbildung 1. Die GrĂ¶ĂŸe der „Schwanz“-Latenzen variiert in den wichtigen StĂ€dten, in denen Uber tĂ€tig ist.

Obwohl die Latenzen in indischen und brasilianischen Netzen höher waren als in den USA und Großbritannien, sind die Schwanzlatenzen deutlich höher als die durchschnittlichen Latenzen. Das gilt sogar fĂŒr die USA und Großbritannien.

Die Leistung von TCP ĂŒber Funk

TCP wurde fĂŒr kabelgebundene Netzwerke entwickelt, also mit einem Fokus auf gut vorhersagbaren Verbindungen. Allerdings haben drahtlose Netze ihre eigenen Eigenschaften und Schwierigkeiten. Erstens sind drahtlose Netzwerke empfindlich gegenĂŒber Verlusten durch Störungen und SignalabschwĂ€chung. Zum Beispiel sind Wi-Fi-Netze anfĂ€llig fĂŒr Mikrowellen, Bluetooth und andere Radiofrequenzen. Mobilfunknetze leiden unter Signalverlust (Pfadverluste) durch Reflexion/Absorption des Signals durch Objekte und GebĂ€ude sowie durch Interferenzen von benachbarten Mobilfunkmasten.Dies fĂŒhrt zu bedeutenderen (4-10 mal) und vielfĂ€ltigeren Round-Trip-Latenzen (RTT) und Packetverlusten im Vergleich zu kabelgebundenen Verbindungen.

Um mit den Schwankungen der Bandbreite und Verlusten umzugehen, nutzen Mobilfunknetze normalerweise große Puffer fĂŒr Verkehrsspitzen. Dies kann zu ĂŒbermĂ€ĂŸigen Warteschlangen fĂŒhren, was grĂ¶ĂŸere Latenzen bedeutet. Sehr oft interpretiert TCP eine solche Warteschlange als Verlust aufgrund des erhöhten Timeouts, weshalb TCP zum Retransmitieren neigt und dadurch den Puffer fĂŒllt. Dieses Problem ist bekannt als Bufferbloat (ĂŒbermĂ€ĂŸige NetzwerkkapazitĂ€t, PufferaufblĂ€hung), und das ist ein sehr ernstes Problem modernen Internets.

Die Leistung des Mobilfunknetzes Ă€ndert sich je nach Betreiber, Region und Zeitpunkt. In Abbildung 2 haben wir die medialen Latenzen des HTTPS-Verkehrs ĂŒber Zellen im Umkreis von 2 Kilometer erfasst. Die Daten wurden fĂŒr die beiden grĂ¶ĂŸten Mobilfunkanbieter in Delhi, Indien, gesammelt. Wie man feststellen kann, variiert die Leistung von Zelle zu Zelle. Auch die Leistung eines Anbieters unterscheidet sich von der des anderen. Dies wird durch Faktoren wie die Zugangsbedingungen zur Netzzeit und den Standort, die MobilitĂ€t der Nutzer und die Netzwerkinfrastruktur in Bezug auf die Dichte der Sendemasten und das VerhĂ€ltnis der Netztypen (LTE, 3G etc.) beeinflusst.

Das QUIC-Protokoll in der Praxis: Wie es von Uber implementiert wurde, um die Leistung zu optimieren
Abbildung 2. Latenzen im Beispiel eines 2-Kilometer-Radius. Delhi, Indien.

Auch die Leistung von Mobilfunknetzen Ă€ndert sich im Laufe der Zeit. In Abbildung 3 ist die mediane Latenz nach Wochentagen dargestellt. Wir haben auch Unterschiede im kleineren Maßstab – im Zusammenhang mit einem Tag und einer Stunde – beobachtet.

Das QUIC-Protokoll in der Praxis: Wie es von Uber implementiert wurde, um die Leistung zu optimieren
Abbildung 3. Tail-Latenzen können zwischen verschiedenen Tagen erheblich variieren, aber beim gleichen Anbieter.

All dies fĂŒhrt dazu, dass die TCP-Leistung in drahtlosen Netzwerken ineffektiv ist. Bevor wir jedoch nach Alternativen zu TCP suchen, wollten wir ein genaues VerstĂ€ndnis fĂŒr die folgenden Punkte entwickeln:

  • Ist TCP der Hauptverursacher der Tail-Latenzen in unseren Anwendungen?
  • Haben moderne Netzwerke signifikante und vielfĂ€ltige Round-Trip-Latenzen (RTT)?
  • Wie wirken sich RTT und Verluste auf die TCP-Leistung aus?

Analyse der TCP-Leistung

Um zu verstehen, wie wir die TCP-Leistung analysiert haben, lassen Sie uns kurz daran erinnern, wie TCP Daten vom Sender zum EmpfĂ€nger ĂŒbertrĂ€gt. Zuerst stellt der Sender eine TCP-Verbindung her, indem er einen Drei-Wege- Handshake: der Sender sendet ein SYN-Paket, wartet auf ein SYN-ACK-Paket vom EmpfĂ€nger und sendet dann ein ACK-Paket. ZusĂ€tzliche zweite und dritte DurchgĂ€nge werden zur Herstellung der TCP-Verbindung benötigt. Der EmpfĂ€nger bestĂ€tigt den Erhalt jedes Pakets (ACK), um eine zuverlĂ€ssige Lieferung zu gewĂ€hrleisten.

Wenn ein Paket oder ACK verloren geht, ĂŒbertrĂ€gt der Sender es nach einer ZeitĂŒberschreitung (RTO, Retransmission Timeout). RTO wird dynamisch basierend auf verschiedenen Faktoren berechnet, beispielsweise auf der erwarteten RTT zwischen Sender und EmpfĂ€nger.

Das QUIC-Protokoll in der Praxis: Wie es von Uber implementiert wurde, um die Leistung zu optimieren
Abbildung 4. Der Paketwechsel ĂŒber TCP/TLS umfasst Mechanismen zur Retransmission.

Um zu bestimmen, wie TCP in unseren Anwendungen funktionierte, haben wir TCP-Pakete mithilfe von tcpdump wĂ€hrend einer Woche im Echtverkehr von indischen Grenzservern verfolgt. Anschließend haben wir die TCP-Verbindungen mit tcptraceanalysiert. DarĂŒber hinaus haben wir eine Android-App entwickelt, die emulierten Verkehr an einen Testserver sendet und dabei dem echten Verkehr möglichst genau nachempfĂ€ngt. Smartphones mit dieser App wurden mehreren Mitarbeitern zur VerfĂŒgung gestellt, die ĂŒber mehrere Tage Protokolle sammelten.

Die Ergebnisse beider Experimente standen im Einklang miteinander. Wir beobachteten hohe RTT-Verzögerungen; die Tail-Werte waren fast sechsmal höher als der Median; der Mittelwert der Verzögerungen betrug ĂŒber 1 Sekunde. Viele Verbindungen hatten Paketverluste, was dazu fĂŒhrte, dass TCP 3,5% aller Pakete retransmittierte. In ĂŒberlasteten Bereichen, wie FlughĂ€fen und Bahnhöfen, beobachteten wir Verlustquoten von 7%. Solche Ergebnisse stellen die gĂ€ngige Meinung in Frage, dass die in Mobilfunknetzen fortgeschrittenen Retransmissionsschemata die Verluste auf Transportschichtniveau erheblich reduzieren. Nachfolgend die Testergebnisse aus der Simulations-App:

Netzwerkmetriken
Werte

RTT, Millisekunden [50%, 75%, 95%, 99%]
[350, 425, 725, 2300]

RTT-Abweichung, Sekunden
Im Durchschnitt ~1,2 s

Paketverlust in instabilen Verbindungen
Im Durchschnitt ~3,5% (7% in ĂŒberlasteten Bereichen)

In fast der HĂ€lfte dieser Verbindungen gab es mindestens einen Paketverlust, hauptsĂ€chlich bei SYN- und SYN-ACK-Paketen. Die meisten TCP-Implementierungen verwenden einen RTO-Wert von 1 Sekunde fĂŒr SYN-Pakete, der exponentiell fĂŒr nachfolgende Verluste erhöht wird. Die Ladezeiten der Anwendung können zunehmen, da TCP mehr Zeit fĂŒr die Einrichtung von Verbindungen benötigt.

Bei Datenpaketen verringern hohe RTO-Werte die nĂŒtzliche Netzwerkauslastung erheblich bei zeitweiligen Verlusten in drahtlosen Netzwerken. Wir haben festgestellt, dass die durchschnittliche Retransmissionszeit etwa 1 Sekunde betrĂ€gt, mit einer Tail-Verzögerung von fast 30 Sekunden. Solche hohen Verzögerungen auf TCP-Ebene fĂŒhrten zu HTTPS-Timeouts und Wiederholungsanfragen, was die Verzögerung und Ineffizienz des Netzwerks weiter erhöhte.

WĂ€hrend der 75. Perzentil der gemessenen RTT bei etwa 425 ms lag, betrug der 75. Perzentil fĂŒr TCP fast 3 Sekunden. Das deutet darauf hin, dass Verluste dazu fĂŒhrten, dass TCP 7-10 DurchlĂ€ufe benötigte, um Daten erfolgreich zu ĂŒbertragen. Dies könnte auf eine ineffiziente Berechnung des RTO und die UnfĂ€higkeit von TCP zurĂŒckzufĂŒhren sein, schnell auf Verluste zu reagieren. letzter Pakete im Fenster und der Ineffizienz des Staukontrollalgorithmus, der zwischen drahtlosen Verlusten und Verlusten aufgrund von NetzwerkĂŒberlastung nicht unterscheidet. Nachfolgend die Ergebnisse der TCP-Verlusttests:

Statistik der TCP-Paketverluste
Wert

Prozentsatz der Verbindungen mit mindestens 1 Paketverlust
45%

Prozentsatz der Verbindungen mit Verlusten wÀhrend der Verbindungsherstellung
30%

Prozentsatz der Verbindungen mit Verlusten wÀhrend des Datenaustauschs
76%

Verteilung der Verzögerungen bei der Retransmission, Sekunden [50%, 75%, 95%, 99%]
[1, 2.8, 15, 28]

Verteilung der Anzahl der Retransmissionen fĂŒr ein Paket oder TCP-Segment
[1,3,6,7]

Einsatz von QUIC

UrsprĂŒnglich von Google entworfen, ist QUIC ein moderner, mehrstrĂ€ngiger Transportprotokoll, das auf UDP basiert. Derzeit befindet sich QUIC im Standardisierungsprozess (wir haben bereits erwĂ€hnt, dass es sozusagen zwei Versionen von QUIC gibt, Neugierige können dem Link folgen – Anm. des Übersetzers). Wie in Abbildung 5 gezeigt, befindet sich QUIC unter HTTP/3 (tatsĂ€chlich ist HTTP/2 ĂŒber QUIC das, was jetzt intensiv standardisiert wird). Es ersetzt teilweise die Ebenen von HTTPS und TCP, indem es UDP zur Paketbildung verwendet. QUIC unterstĂŒtzt nur sichere DatenĂŒbertragungen, da TLS vollstĂ€ndig in QUIC integriert ist.

Das QUIC-Protokoll in der Praxis: Wie es von Uber implementiert wurde, um die Leistung zu optimieren
Abbildung 5: QUIC funktioniert unter HTTP/3 und ersetzt TLS, das zuvor unter HTTP/2 arbeitete.

Im Folgenden geben wir die GrĂŒnde an, die uns ĂŒberzeugt haben, QUIC zur Verbesserung von TCP zu verwenden:

  • 0-RTT-Verbindungsherstellung. QUIC ermöglicht die Wiederverwendung von Autorisierungen aus vorherigen Verbindungen, wodurch die Anzahl der Sicherheits-Handshakes reduziert wird. In Zukunft TLS 1.3 wird 0-RTT unterstĂŒtzen, jedoch wird das dreifache TCP-Handshake weiterhin obligatorisch sein.
  • Überwindung der HoL-Blockierung. HTTP/2 verwendet eine einzelne TCP-Verbindung fĂŒr jeden Client, um die Leistung zu verbessern, aber das kann zu HoL (head-of-line) Blockierung fĂŒhren. QUIC erleichtert das Multiplexing und liefert Anfragen unabhĂ€ngig voneinander an die Anwendung.
  • Staukontrolle. QUIC befindet sich auf der Anwendungsebene und ermöglicht eine vereinfachte Aktualisierung des Haupttransportalgorithmus, der die Übertragung basierend auf Netzwerkparametern (Verlustrate oder RTT) steuert. Die meisten TCP-Implementierungen verwenden den Algorithmus CUBIC, der nicht optimal fĂŒr latenzempfindlichen Verkehr ist. Neu entwickelte Algorithmen wie BBRmodellieren das Netzwerk genauer und optimieren die Latenzen. QUIC ermöglicht die Nutzung von BBR und die Aktualisierung dieses Algorithmus im Zuge seiner Verbesserungen.
  • beim Verlustausgleich. QUIC löst zwei TLP (tail loss probe) aus, bevor der RTO greift – selbst wenn die Verluste sehr spĂŒrbar sind. Dies unterscheidet sich von den TCP-Implementierungen. TLP ĂŒbertrĂ€gt in erster Linie das letzte Paket (oder ein neues, falls vorhanden), um eine schnelle Wiederherstellung zu initiieren. Die Verarbeitung von Verlusten am Ende ist besonders nĂŒtzlich fĂŒr die Art und Weise, wie Uber mit dem Netzwerk arbeitet, nĂ€mlich fĂŒr kurze, sporadische und latenzempfindliche DatenĂŒbertragungen.
  • optimiertes ACK. Da jedes Paket eine eindeutige Sequenznummer hat, gibt es keine Probleme bei der Unterscheidung von Paketen bei ihrer WiederĂŒbertragung. ACK-Pakete enthalten auch die Zeit fĂŒr die Verarbeitung des Pakets und die Generierung des ACKs auf der Client-Seite. Diese Eigenschaften sorgen dafĂŒr, dass QUIC RTT genauer berechnet. ACK in QUIC unterstĂŒtzt bis zu 256 Bereiche von NACK, wodurch der Sender widerstandsfĂ€higer gegen Paketumsortierung ist und weniger Bytes im Prozess verwendet. Selektives ACK (SACK) in TCP löst dieses Problem nicht in allen FĂ€llen.
  • Verbindungsmigration. QUIC-Verbindungen werden durch eine 64-Bit-ID identifiziert, sodass bei einer IP-AdressĂ€nderung des Clients die ID der alten Verbindung weiterhin ĂŒber die neue IP-Adresse verwendet werden kann, ohne Unterbrechungen. Dies ist eine sehr gĂ€ngige Praxis fĂŒr mobile Anwendungen, wenn der Nutzer zwischen Wi-Fi und mobilen Verbindungen wechselt.

Alternativen zu QUIC

Wir haben alternative AnsĂ€tze zur Lösung des Problems in Betracht gezogen, bevor wir uns fĂŒr QUIC entschieden haben.

ZunĂ€chst haben wir versucht, TPC PoPs (Points of Presence) einzurichten, um TCP-Verbindungen nĂ€her bei den Nutzern abzuschließen. Im Grunde schließt der PoP die TCP-Verbindung mit dem mobilen GerĂ€t nĂ€her am Mobilfunknetz ab und leitet den Verkehr zur ursprĂŒnglichen Infrastruktur weiter. Durch das Abschliessen von TCP nĂ€her können wir potenziell die RTT reduzieren und sicherstellen, dass TCP aktiver auf die dynamische drahtlose Umgebung reagiert. Unsere Experimente haben jedoch gezeigt, dass RTT und Verluste grĂ¶ĂŸtenteils aus Mobilfunknetzen resultieren und die Verwendung von PoPs keine signifikante Verbesserung der Leistung bietet.

Wir haben uns auch mit der Feinabstimmung der TCP-Parameter beschĂ€ftigt. Die Anpassung des TCP-Stacks auf unseren heterogenen Edge-Servern erwies sich als schwierig, da TCP in verschiedenen OS-Versionen inkonsistente Implementierungen aufweist. Es war herausfordernd, verschiedene Netzwerk-Konfigurationen umzusetzen und zu testen. Zudem war eine direkte Einstellung von TCP auf mobilen GerĂ€ten aufgrund fehlender Berechtigungen nicht möglich. Noch wichtiger ist, dass Funktionen wie 0-RTT-Verbindungen und verbesserte RTT-Vorhersage entscheidend fĂŒr die Protokollarchitektur sind, sodass erhebliche Vorteile allein durch TCP-Anpassungen nicht erreichbar sind.

Schließlich haben wir mehrere UDP-basierte Protokolle bewertet, die Probleme beim Video-Streaming beheben sollen – wir wollten herausfinden, ob diese Protokolle in unserem Fall hilfreich sind. Leider fehlten ihnen viele Sicherheitsanpassungen, und sie benötigten zudem eine zusĂ€tzliche TCP-Verbindung fĂŒr Metadaten und Steuerinformationen.

Unsere Forschungen haben ergeben, dass QUIC fast das einzige Protokoll ist, das zur Lösung des Internetverkehrsproblems beitragen kann und dabei sowohl Sicherheit als auch Leistung berĂŒcksichtigt.

Integration von QUIC in die Plattform

Um QUIC erfolgreich zu implementieren und die Leistung der Anwendung bei schlechten Verbindungen zu verbessern, haben wir den alten Stack (HTTP/2 ĂŒber TLS/TCP) durch das QUIC-Protokoll ersetzt. Wir haben die Netzwerkbibliothek Cronet aus Chromium Projects, die die originale Google-Version des Protokolls – gQUIC – enthĂ€lt, eingesetzt. Diese Implementierung wird auch kontinuierlich weiterentwickelt, um der neuesten IETF-Spezifikation zu folgen.

ZunĂ€chst haben wir Cronet in unsere Android-Anwendungen integriert, um UnterstĂŒtzung fĂŒr QUIC hinzuzufĂŒgen. Die Integration wurde so vorgenommen, dass die Migrationskosten minimiert werden. Anstatt den alten Netzwerk-Stack, der die Bibliothek OkHttp, vollstĂ€ndig zu ersetzen, haben wir Cronet UNTER dem OkHttp-API-Framework integriert. Durch diese Vorgehensweise haben wir Änderungen an unseren Netzwerkaufrufen (die verwenden Retrofit) auf der API-Ebene vermieden.

Ähnlich wie bei Android-GerĂ€ten haben wir Cronet in die Uber-Anwendungen auf iOS integriert, indem wir den HTTP-Verkehr ĂŒber die Netzwerke API, unter Verwendung von NSURLProtocolabgefangen haben. Diese Abstraktion, die von iOS Foundation bereitgestellt wird, verarbeitet protokollspezifische URL-Daten und gewĂ€hrleistet, dass wir Cronet in unsere iOS-Anwendungen ohne wesentliche Migrationskosten integrieren können.

QUIC-Terminierung auf Google Cloud Load Balancers

Auf der Backend-Seite wird die QUIC-Terminierung durch die Infrastruktur des Google Cloud Load Balancing bereitgestellt, die alt-svc Header in den Antworten verwendet, um QUIC zu unterstĂŒtzen. Im Allgemeinen fĂŒgt der Load Balancer jedem HTTP-Anfrageheader den alt-svc-Header hinzu und validiert damit die QUIC-UnterstĂŒtzung fĂŒr die DomĂ€ne. Wenn der Cronet-Client eine HTTP-Antwort mit diesem Header erhĂ€lt, verwendet er QUIC fĂŒr nachfolgende HTTP-Anfragen an diese DomĂ€ne. Sobald der Load Balancer QUIC beendet, sendet unsere Infrastruktur diese Aktion ausdrĂŒcklich ĂŒber HTTP2/TCP an unsere Rechenzentren.

Leistung: Ergebnisse

Die erbrachte Leistung ist der Hauptgrund fĂŒr unsere Suche nach dem besten Protokoll. Zu Beginn haben wir eine Testumgebung mit Netzwerkemulation, um herauszufinden, wie QUIC sich unter unterschiedlichen Netzwerkprofilen verhĂ€lt. Um die Funktionsweise von QUIC in realen Netzwerken zu ĂŒberprĂŒfen, fĂŒhrten wir Experimente durch, wĂ€hrend wir durch Neu-Delhi fuhren, wobei wir emulierten Netzwerkverkehr verwendeten, der sehr Ă€hnlich war wie HTTP-Anfragen in der Passagieranwendung.

Experiment 1

Inventar fĂŒr das Experiment:

  • TestgerĂ€te auf Android mit den Stacks OkHttp und Cronet, um sicherzustellen, dass wir HTTPS-Verkehr ĂŒber TCP und QUIC entsprechend leiten;
  • Java-basierter Emulationsserver, der identische HTTPS-Header in den Antworten sendet und die ClientgerĂ€te belastet, um Anfragen von ihnen zu erhalten;
  • Cloud-Proxys, die physisch in der NĂ€he von Indien positioniert sind, um TCP- und QUIC-Verbindungen zu terminieren. WĂ€hrend wir fĂŒr die TCP-Terminierung einen Reverse-Proxy verwendet haben NGINX, es war schwierig, einen Open-Source-RĂŒckwĂ€rtproxy fĂŒr QUIC zu finden. Wir haben selbst einen RĂŒckwĂ€rtproxy fĂŒr QUIC erstellt, unter Verwendung des QUIC-Grundstapels aus Chromium und haben ihn als Open-Source in Chromium integriert.

Das QUIC-Protokoll in der Praxis: Wie es von Uber implementiert wurde, um die Leistung zu optimierenDas QUIC-Protokoll in der Praxis: Wie es von Uber implementiert wurde, um die Leistung zu optimieren
Abbildung 6. Das Testset fĂŒr TCP vs. QUIC bestand aus Android-GerĂ€ten mit OkHttp und Cronet, Cloud-Proxys fĂŒr den Verbindungsabschluss und einem Emulationsserver.

Experiment 2

Als Google QUIC ĂŒber Google Cloud Load Balancing, zugĂ€nglich machte, verwendeten wir dasselbe Inventar, jedoch mit einer Modifikation: Statt NGINX nutzten wir Googles Lastausgleicher fĂŒr den Verbindungsabschluss von TCP und QUIC von den GerĂ€ten sowie zur Weiterleitung des HTTPS-Verkehrs an den Emulationsserver. Die Lastverteiler sind weltweit verteilt, verwenden aber den nĂ€chstgelegenen PoP-Server (danke Geolokalisierung).

Das QUIC-Protokoll in der Praxis: Wie es von Uber implementiert wurde, um die Leistung zu optimieren
Abbildung 7. Im zweiten Experiment wollten wir die Latenz des Verbindungsabschlusses von TCP und QUIC vergleichen: mithilfe von Google Cloud und unserem Cloud-Proxy.

Am Ende hatten wir einige EnthĂŒllungen:

  • der Abschluss ĂŒber PoP verbesserte die TCP-Leistung. Da die Lastverteiler die TCP-Verbindung nĂ€her an den Benutzern abschließen und hervorragend optimiert sind, fĂŒhrt das zu geringeren RTT, was die TCP-Leistung verbessert. Und obwohl dies QUIC weniger beeinflusste, ĂŒbertraf es dennoch TCP in Bezug auf die Reduzierung der Tail-Latenzen (um 10–30 Prozent).
  • bei den Tails wirken sich NetzwerkĂŒbergĂ€nge (Hops). Obwohl unser QUIC-Proxy weiter von den GerĂ€ten entfernt war (etwa 50 ms höhere Latenz) als die Googleschen Lastverteiler, erzielte er eine Ă€hnliche Leistung – 15 % Reduzierung der Latenz im Vergleich zu 20 % Reduzierung im 99. Perzentil bei TCP. Dies deutet darauf hin, dass der Übergang auf der letzten Meile ein Engpass (Bottleneck) im Netzwerkbetrieb ist.

Das QUIC-Protokoll in der Praxis: Wie es von Uber implementiert wurde, um die Leistung zu optimierenDas QUIC-Protokoll in der Praxis: Wie es von Uber implementiert wurde, um die Leistung zu optimieren
Abbildung 8. Die Ergebnisse der beiden Experimente zeigen, dass QUIC TCP deutlich ĂŒbertrifft.

Echtverkehr

Inspiriert von den Experimenten haben wir die UnterstĂŒtzung von QUIC in unsere Android- und iOS-Anwendungen integriert. Wir fĂŒhrten A/B-Tests durch, um die Auswirkungen von QUIC in den StĂ€dten zu bestimmen, in denen Uber prĂ€sent ist. Insgesamt beobachteten wir eine erhebliche Verringerung der Tail-Latenzen sowohl regional als auch nach Mobilfunkanbietern und Netztypen.

In den folgenden Grafiken sind die prozentualen Verbesserungen der Tails (95. und 99. Perzentil) nach Makroregionen und verschiedenen Netztypologien – LTE, 3G, 2G – dargestellt.
Das QUIC-Protokoll in der Praxis: Wie es von Uber implementiert wurde, um die Leistung zu optimierenDas QUIC-Protokoll in der Praxis: Wie es von Uber implementiert wurde, um die Leistung zu optimieren
Abbildung 9. In den Echtzeittests ĂŒbertraf QUIC TCP in Bezug auf Latenzen.

Nur vorwÀrts

Vielleicht ist das erst der Anfang – die EinfĂŒhrung von QUIC in die Produktion hat erstaunliche Möglichkeiten zur Leistungssteigerung von Anwendungen sowohl in stabilen als auch in instabilen Netzwerken eröffnet, und zwar:

Erhöhung der Abdeckung

Durch die Analyse der Leistung des Protokolls im realen Datenverkehr haben wir festgestellt, dass etwa 80 % der Sessions erfolgreich QUIC fĂŒr Umgebungen und Clustern des Projekts verwendet wird. Dieses Prinzip bildet die Grundlage fĂŒr ein gutes Anfragen verwendet haben, wĂ€hrend 15 % der Sessions eine Kombination aus QUIC und TCP verwendet haben. Wir vermuten, dass diese Kombination entstanden ist, weil die Cronet-Bibliothek aufgrund von ZeitĂŒberschreitungen zurĂŒck auf TCP umschaltet, da sie echte UDP-Fehler und schlechte Netzwerkbedingungen nicht unterscheiden kann. Derzeit suchen wir nach einer Lösung fĂŒr dieses Problem, da wir an der weiteren Implementierung von QUIC arbeiten.

Optimierung von QUIC

Der Datenverkehr aus mobilen Anwendungen ist empfindlich gegenĂŒber Verzögerungen, nicht jedoch gegenĂŒber der Bandbreite. Zudem werden unsere Anwendungen hauptsĂ€chlich in Mobilfunknetzen genutzt. Basierend auf Experimenten sind die Warteschlangenverzögerungen weiterhin hoch, selbst wenn Proxys eingesetzt werden, um TCP und QUIC nahe an den Nutzern zu beenden. Wir suchen aktiv nach Möglichkeiten zur Verbesserung des Überlastungsmanagements und zur Steigerung der Effizienz von QUIC-Algorithmen zur Verlustkompensation.

Mit diesen und einigen anderen Verbesserungen planen wir, das Benutzererlebnis unabhÀngig vom Netzwerk und der Region zu verbessern und einen benutzerfreundlichen und nahtlosen Pakettransport weltweit zugÀnglicher zu machen.

Quelle: habr.com

60GB SSD 8Gb DDR4