Wéi an
Enges Daags sinn ech mat enger onzefriddener E-Mail erwächt wéinst laange Verspéidungen mam Alvin, déi mir geplangt hunn an der nächster Zukunft ze lancéieren. Speziell huet de Client 99th percentile latency an der Regioun vun 50 ms erlieft, wäit iwwer eisem latency Budget. Dëst war iwwerraschend wéi ech de Service extensiv getest hunn, besonnesch op Latenz, wat eng gemeinsam Plainte ass.
Ier ech den Alvin an d'Test gesat hunn, hunn ech vill Experimenter mat 40k Ufroen pro Sekonn (QPS) gemaach, déi all latency vu manner wéi 10ms weisen. Ech war bereet ze erklären datt ech net mat hire Resultater averstane sinn. Awer nach eng Kéier op de Bréif gekuckt, hunn ech eppes Neies gemierkt: Ech hat d'Konditiounen net genau getest, déi se ernimmt hunn, hir QPS war vill méi niddereg wéi mäin. Ech getest op 40k QPS, mä si nëmmen op 1k. Ech hunn en anert Experiment gemaach, dës Kéier mat engem nidderegen QPS, just fir se ze berouegen.
Well ech iwwer dëst bloggen, hutt Dir wahrscheinlech schonn erausfonnt datt hir Zuelen richteg waren. Ech hunn mäi virtuelle Client ëmmer erëm getest, mam selwechte Resultat: eng kleng Unzuel vun Ufroen erhéicht net nëmmen d'Latenz, mee erhéicht d'Zuel vun Ufroen mat enger latency vu méi wéi 10 ms. An anere Wierder, wann bei 40k QPS ongeféier 50 Ufroe pro Sekonn 50 ms iwwerschratt hunn, da bei 1k QPS goufen et 100 Ufroen iwwer 50 ms all Sekonn. Paradox!
D'Sich schmuel
Wann Dir mat engem Latenzproblem an engem verdeelte System mat ville Komponenten konfrontéiert sidd, ass den éischte Schrëtt eng kuerz Lëscht vu Verdächtegen ze kreéieren. Loosst eis e bësse méi déif an dem Alvin seng Architektur gräifen:
E gudde Startpunkt ass eng Lëscht vun ofgeschlossen I/O Iwwergäng (Netzwierker/Disk Lookups, etc.). Loosst eis probéieren erauszefannen, wou d'Verspéidung ass. Nieft dem offensichtlechen I/O mam Client, mécht den Alvin en extra Schrëtt: hien huet Zougang zum Dategeschäft. Wéi och ëmmer, dës Späichere funktionnéiert am selwechte Cluster wéi Alvin, sou datt d'Latenz do manner sollt sinn wéi mam Client. Also, d'Lëscht vun de Verdächtegen:
- Reseau Uruff vum Client un Alvin.
- Reseau Uruff vum Alvin an den Dategeschäft.
- Sich op Disk am Dategeschäft.
- Reseau Uruff vum Datelager op Alvin.
- Reseau Uruff vun Alvin zu engem Client.
Loosst eis probéieren e puer Punkten erauszekréien.
Datespeicherung huet näischt domat ze dinn
Déi éischt Saach, déi ech gemaach hunn, war den Alvin op e Ping-Ping-Server konvertéieren deen d'Ufroe net veraarbecht. Wann et eng Ufro kritt, gëtt et eng eidel Äntwert zréck. Wann d'Latenz erofgeet, dann ass e Feeler an der Alvin- oder Datelagerimplementatioun näischt ongehéiert. Am éischten Experiment kréie mir déi folgend Grafik:
Wéi Dir kënnt gesinn, gëtt et keng Verbesserung wann Dir de Ping-Ping Server benotzt. Dëst bedeit datt d'Datelager d'Latenz net erhéicht, an d'Lëscht vun de Verdächtegen an der Halschent geschnidden:
- Reseau Uruff vum Client un Alvin.
- Reseau Uruff vun Alvin zu engem Client.
Super! D'Lëscht schrumpft séier. Ech hu geduecht datt ech de Grond bal erausfonnt hunn.
gRPC
Elo ass d'Zäit Iech en neie Spiller virzestellen: gRPC
gutt optimiséiert a wäit benotzt, dëst war meng éischte Kéier et op engem System vun dëser Gréisst benotzt an ech erwaart meng Ëmsetzung suboptimal gin - op d'mannst ze soen.
Disponibilitéit gRPC
am Stack huet eng nei Fro gestallt: vläicht ass et meng Ëmsetzung oder ech selwer gRPC
Ursaach latency Problem? En neie Verdächtegen op d'Lëscht bäidroen:
- De Client rifft d'Bibliothéik
gRPC
- Bibliothéik
gRPC
mécht en Netz Opruff un d'Bibliothéik op de ClientgRPC
op Server - Bibliothéik
gRPC
Kontakter Alvin (keng Operatioun am Fall vu Ping-Pong Server)
Fir Iech eng Iddi ze ginn wéi de Code ausgesäit, ass mäi Client / Alvin Implementatioun net vill anescht wéi de Client-Server
Notiz: Déi uewe genannte Lëscht ass e bësse vereinfacht well
gRPC
mécht et méiglech Ären eegene (Schabloun?) Threading-Modell ze benotzen, an deem den Ausféierungsstack matenee verbonnen assgRPC
an Benotzer Ëmsetzung. Fir d'Einfachheet wäerte mir un dësem Modell halen.
Profiling wäert alles fixéieren
Nodeems ech d'Dategeschäfter duerchgestrachen hunn, hunn ech geduecht datt ech bal fäerdeg wier: "Elo ass et einfach! Loosst eis de Profil uwenden an erausfannen wou d'Verspéidung geschitt. ech
Ech hunn véier Profiler geholl: mat héijer QPS (niddereg latency) a mat engem Ping-Pong-Server mat gerénger QPS (héich latency), souwuel op der Clientssäit wéi och op der Serversäit. A just am Fall, Ech hunn och e Prouf Prozessor Profil geholl. Wann Dir Profiler vergläicht, sichen ech normalerweis no engem anomalen Uruffstack. Zum Beispill, op der schlechter Säit mat héijer latency ginn et vill méi Kontextschalter (10 Mol oder méi). Awer a mengem Fall war d'Zuel vun de Kontextschalter bal d'selwecht. Zu menger Schrecken war do näischt Wichtegst.
Zousätzlech Debugging
Ech war verzweifelt. Ech wousst net wéi eng aner Tools ech benotze konnt, a mäi nächste Plang war am Fong d'Experimenter mat verschiddene Variatiounen ze widderhuelen anstatt de Problem kloer ze diagnostizéieren.
Wat wier wann
Vun Ufank u war ech besuergt iwwer déi spezifesch 50ms Latenz. Dëst ass eng ganz grouss Zäit. Ech hu beschloss datt ech Stécker aus dem Code schneiden bis ech genau erausfannen wéi en Deel dëse Feeler verursaacht huet. Dunn koum en Experiment dat geklappt huet.
Wéi gewinnt, am Réckbléck schéngt et datt alles evident war. Ech hunn de Client op déi selwecht Maschinn wéi Alvin gesat - an eng Demande geschéckt localhost
. An d'Erhéijung vun der latency ass fort!
Eppes war falsch mam Netz.
Léieren Reseau Ingenieur Kompetenzen
Ech muss zouginn: mäi Wëssen iwwer Netzwierktechnologien ass schrecklech, besonnesch wann Dir bedenkt datt ech all Dag mat hinnen schaffen. Awer d'Netzwierk war den Haaptverdächtegen, an ech muss léieren wéi ech et debuggen.
Glécklech, den Internet gär déi, déi léieren wëllen. D'Kombinatioun vu Ping an Tracert schénge wéi e gutt genuch Start fir Netzwierktransportproblemer ze Debuggéieren.
Als éischt hunn ech lancéiert
Dunn hunn ech probéiert
Also et war net mäi Code, d'gRPC Implementatioun oder d'Netzwierk déi d'Verzögerung verursaacht hunn. Ech war ugefaang ze Suergen, datt ech dat ni géif verstoen.
Elo wat OS si mir op
gRPC
vill op Linux benotzt, awer exotesch op Windows. Ech hu beschloss en Experiment ze probéieren, wat geschafft huet: Ech hunn eng virtuell Linux Maschinn erstallt, Alvin fir Linux kompiléiert an ofgesat.
An hei ass wat geschitt ass: de Linux Ping-Pong Server huet net déiselwecht Verzögerungen wéi en ähnlechen Windows Host, obwuel d'Datequell net anescht war. Et stellt sech eraus datt de Problem an der gRPC Implementatioun fir Windows ass.
Nagle's Algorithmus
All dës Kéier hunn ech geduecht datt ech e Fändel fehlen gRPC
. Elo verstinn ech wat et wierklech ass gRPC
Windows Fändel fehlt. Ech hunn eng intern RPC Bibliothéik fonnt, datt ech zouversiichtlech war gutt fir all Fändelen Formatioun Aarbecht
Bal Gemaach: Ech hunn ugefaang déi addéiert Fändelen een an enger Zäit ze läschen bis d'Regressioun zréckkoum sou datt ech d'Ursaach konnt feststellen. Et war berühmt
gRPC
dëse Fändel gouf an der Linux Implementatioun fir TCP Sockets gesat, awer net a Windows. Ech sinn dëst
Konklusioun
Déi méi héich Latenz bei niddereg QPS gouf duerch OS Optimisatioun verursaacht. Am Réckbléck huet d'Profiling keng latency erkannt well et am Kernelmodus gemaach gouf anstatt am
Wat de localhost Experiment ugeet, huet et wahrscheinlech net den aktuellen Netzwierkcode beréiert an dem Nagle säin Algorithmus huet net gelaf, sou datt d'Latenzprobleemer fortgaang sinn wann de Client den Alvin duerch localhost erreecht huet.
Déi nächst Kéier wann Dir eng Erhéijung vun der Latenz gesitt wéi d'Zuel vun den Ufroen pro Sekonn erofgeet, sollt dem Nagle säin Algorithmus op Ärer Lëscht vu Verdächtegen sinn!
Source: will.com