Zakaj se klepetava aplikacija SQL vleče čez VPN in kaj je vredno združevati
Zaslon, ki sproži sto odvisnih poizvedb, plača povratno pot stokrat. Preštejte čakanja, združite neodvisna in nato premaknite izvajanje.
Obrazec, ki se v lokalnem omrežju odpre v manj kot sekundi, čez VPN traja pet sekund, medtem ko kopija datoteke na isti povezavi teče s polno hitrostjo. Razlika ni pasovna širina. Obrazec čaka na zaporedje odgovorov in na vsakem koraku plača celotno povratno pot, medtem ko kopija datoteke nenehno drži bajte v letu. Preštejte ta čakanja, preden se dotaknete dostopne linije.
Simptom je zaslon, ne poizvedba
Vsaka poizvedba na tem zaslonu je lahko hitra, zaslon pa je lahko še vedno počasen, ker je vsota vsota čakanj in ne vsota časov izvajanja. Stavek, ki se izvede v dveh milisekundah, še vedno stane celotno povratno pot, ko mora odjemalec prejeti rezultat, preden pošlje naslednjega. Na poti s štiridesetimi milisekundami zakasnitve se sto odvisnih klicev sešteje na približno štiri sekunde, preden se začne kakršno koli delo upodabljanja. Ta aritmetika je model čakanja, ne meritev vaše povezave.
Zato je test hitrosti videti nedolžen. Množični prenos meri prepustnost, klepetav obrazec meri zakasnitev, VPN pa je lahko odličen v enem in ostane običajen v drugem. Diagnosticirati zaslon zato pomeni meriti zaslon in ne povezave.
Zabeležite čas od začetka do konca ene uporabniške akcije, preden karkoli spremenite. Ta številka je edino izhodišče, ki vam lahko pove, ali je poznejši popravek uspel.
Preštejte zaporedna čakanja v eni uporabniški akciji
Instrumentirajte odjemalca, namesto da ugibate. V psql \timing on izpiše pretečeni čas vsakega stavka, EXPLAIN (ANALYZE, BUFFERS) pa pokaže, koliko tega časa je strežnik res porabil za delo.
Razlika med tema dvema številoma so vaši omrežni in odjemalski stroški. Če se stavek izvede v dveh milisekundah, odjemalec pa zabeleži šestdeset, je preostalih oseminpetdeset pot in lokalna obdelava, in noben indeks jih ne bo odstranil. Ponovite primerjavo za vsak stavek, ki ga zaslon izda, in seštevajte razlike, ne časov izvajanja.
Rezultat zapišite kot število zaporednih čakanj. To je količina, ki jo lahko zmanjšata naslednja dva razdelka, in to je številka, o kateri se je mogoče prepirati z dokazi.
Združite neodvisne klice, obdržite odvisne
Dva stavka, ki ne bereta rezultata drug drugega, lahko potujeta skupaj in se pobereta enkrat, kar dve čakanji spremeni v eno. Dva stavka, kjer drugi potrebuje vrednost prvega, tega ne moreta, ker je odvisnost resnična in bi združitev spremenila, kaj program počne. Preden karkoli prepišete, razvrstite klice v ta dva kupa, velikost vsakega kupa pa vam pove, kaj je mogoče.
Delo na množicah odstranjuje čakanja temeljiteje kot združevanje. Ena poizvedba, ki vrne vrstice, ki jih je zanka jemala eno za drugo, odpravi zanko in povratne poti. Najprej poiščite zanko, ker običajno prinaša večji dobiček in je lažje pregledljiva sprememba.
Paket mora še vedno ohraniti obravnavo napak in meje transakcij. Lepljenje nepovezanih stavkov v en niz ni varna optimizacija, paket, ki skrije neuspel stavek za uspešno oddajo, pa je slabši od prihranjenih čakanj.
Povezave uporabite znova, preden kupite pasovno širino
Nova povezava stane razreševanje imena, rokovanje TCP, pogajanje TLS in preverjanje pristnosti, na poti z visoko zakasnitvijo pa je vsako od tega še ena povratna pot, preden se zažene prva poizvedba. Bazeni povezav obstajajo zato, da se ta strošek plača enkrat na proces in ne enkrat na klic.
V ADO.NET zaprtje ali dispose povezave iz bazena jo vrne za ponovno uporabo, namesto da bi odprl novo fizično, zato je vzorec, ki izgleda kot puščanje, pogosto pravilna uporaba. Preverite, ali se bazen res uporablja, namesto da domnevate: beležite ustvarjanje fizičnih povezav ali spremljajte število sej na strežniku, medtem ko zaslon teče. Smernice za zmogljivost SQL povedo isto o zmanjševanju povratnih poti in združevanju pogostih ad hoc klicev, s primeri, specifičnimi za storitev, ki jih morate preslikati na svojo uvedbo.
Združevanje v bazen odpravi stroške nastavitve in pusti zaporedna čakanja poizvedb nedotaknjena. To je predpogoj za čisto meritev, ne samostojen popravek.
Pretehtajte premik izvajanja bliže podatkom
Izvajanje aplikacije blizu zbirke podatkov nadomesti številne oddaljene izmenjave s podatkovno bazo z eno samo oddaljeno sejo prikaza. Za klepetavo obremenitev je to lahko velika sprememba in je operativna sprememba prav toliko kot zmogljivostna: upravljanje sej, nadzor dostopa, uvajanje programske opreme in uporabniška izkušnja se vse premaknejo skupaj z aplikacijo.
Izmerite dejanski vmesnik in podatke, ki jih prenaša, preden domnevate, da je katera smer hitrejša. Seja oddaljenega namizja prenaša piksle, zaslon z gosto grafiko pa lahko na isti poti deluje slabše od poizvedb, ki jih je nadomestil, zlasti ko odjemalec nenehno prerisuje.
Nato ponovite prvotno dejanje in primerjajte tri številke: zaporedna čakanja, obseg rezultatov in čas dokončanja od začetka do konca. Izboljšava, ki spremeni merjeno uporabniško nalogo ob ohranitvi pravilnosti podatkov in politike dostopa, je tista, ki jo velja obdržati.