Miksi puhelias SQL-sovellus ryömii VPN:n yli ja mitä kannattaa niputtaa
Näyttö, joka lähettää sata riippuvaista kyselyä, maksaa edestakaisen matkan sata kertaa. Laske odotukset, niputa riippumattomat ja siirrä sitten suoritus.
Lomake, joka avautuu lähiverkossa alle sekunnissa, kestää VPN:n yli viisi sekuntia, kun taas tiedostokopio samalla yhteydellä kulkee täydellä nopeudella. Ero ei ole kaistanleveydessä. Lomake odottaa vastausten sarjaa ja maksaa täyden edestakaisen matkan joka vaiheessa, kun taas tiedostokopio pitää tavut liikkeessä yhtäjaksoisesti. Laske nämä odotukset ennen kuin kosket yhteyslinjaan.
Oire on näyttö, ei kysely
Jokainen kyseisen näytön kysely voi olla nopea ja näyttö voi silti olla hidas, koska kokonaisuus on odotusten summa eikä suoritusaikojen summa. Kahdessa millisekunnissa suoritettava lause maksaa silti kokonaisen edestakaisen matkan, kun asiakkaan on saatava sen tulos ennen seuraavan lähettämistä. Neljänkymmenen millisekunnin viiveisellä polulla sata riippuvaista kutsua kertyy noin neljäksi sekunniksi ennen kuin mitään piirtotyötä alkaa. Tämä aritmetiikka on odotuksen malli, ei yhteytesi mittaus.
Siksi nopeustesti näyttää viattomalta. Massasiirto mittaa läpäisyä, puhelias lomake mittaa viivettä, ja VPN voi olla yhdessä erinomainen ja toisessa tavallinen. Näytön diagnosointi tarkoittaa siis näytön mittaamista eikä yhteyden mittaamista.
Kirjaa yhden käyttäjän toiminnon päästä päähän -aika ennen kuin muutat mitään. Tämä luku on ainoa lähtötaso, joka voi kertoa, toimiko myöhempi korjaus.
Laske peräkkäiset odotukset yhdessä käyttäjän toiminnossa
Mittaa asiakkaassa sen sijaan että arvaisit. Psql:ssä \timing on tulostaa kunkin lauseen kuluneen ajan ja EXPLAIN (ANALYZE, BUFFERS) näyttää, kuinka paljon siitä ajasta palvelin todella käytti työhön.
Näiden kahden luvun ero on verkko- ja asiakaskulusi. Jos lause suoritetaan kahdessa millisekunnissa ja asiakas kirjaa kuusikymmentä, jäljellä olevat viisikymmentäkahdeksan ovat matkaa ja paikallista käsittelyä, eikä mikään indeksi poista niitä. Toista tämä vertailu jokaiselle lauseelle, jonka näyttö lähettää, ja laske yhteen erot eikä suoritusaikoja.
Kirjaa tulos peräkkäisten odotusten lukumääränä. Se on suure, jota kaksi seuraavaa osiota voivat vähentää, ja se on luku, josta voit väitellä todisteilla.
Niputa riippumattomat kutsut, pidä riippuvaiset
Kaksi lausetta, jotka eivät lue toistensa tuloksia, voivat matkustaa yhdessä ja tulla kerätyiksi kerran, mikä muuttaa kaksi odotusta yhdeksi. Kaksi lausetta, joissa toinen tarvitsee ensimmäisen arvon, eivät voi, koska riippuvuus on todellinen ja niputtaminen muuttaisi sitä, mitä ohjelma tekee. Lajittele kutsut näihin kahteen kasaan ennen kuin kirjoitat mitään uudelleen, ja kunkin kasan koko kertoo, mikä on mahdollista.
Joukkopohjainen työ poistaa odotuksia perusteellisemmin kuin niputtaminen. Yksi kysely, joka palauttaa rivit, jotka silmukka haki yksi kerrallaan, poistaa sekä silmukan että edestakaiset matkat. Etsi ensin silmukka, koska se on yleensä suurempi voitto ja helpompi muutos tarkastella.
Nipun on silti säilytettävä virheenkäsittely ja tapahtumarajat. Toisiinsa liittymättömien lauseiden ketjuttaminen yhdeksi merkkijonoksi ei ole turvallinen optimointi, ja nippu, joka piilottaa epäonnistuneen lauseen onnistuneen lähetyksen taakse, on pahempi kuin säästetyt odotukset.
Käytä yhteyksiä uudelleen ennen kuin ostat kaistanleveyttä
Uusi yhteys maksaa nimien selvityksen, TCP-kättelyn, TLS-neuvottelun ja todennuksen, ja suuren viiveen polulla jokainen niistä on vielä yksi edestakainen matka ennen kuin ensimmäinen kysely käynnistyy. Yhteysaltaat ovat olemassa, jotta tämä kustannus maksetaan kerran prosessia kohden eikä kerran kutsua kohden.
ADO.NET:ssä altaaseen kuuluvan yhteyden sulkeminen tai hävittäminen palauttaa sen uudelleenkäyttöön sen sijaan että avattaisiin uusi fyysinen yhteys, joten vuodolta näyttävä malli on usein oikea käyttötapa. Varmista, että allasta todella käytetään sen sijaan että oletat niin: kirjaa fyysisten yhteyksien luonti lokiin tai seuraa palvelimen istuntojen määrää näytön toimiessa. SQL:n suorituskykyohjeet sanovat saman edestakaisten matkojen vähentämisestä ja toistuvien ad hoc -kutsujen niputtamisesta, palvelukohtaisin esimerkein, jotka sinun kannattaa sovittaa omaan käyttöönottoosi.
Altaat poistavat asennuskustannuksen ja jättävät peräkkäiset kyselyodotukset ennalleen. Se on puhtaan mittauksen edellytys, ei korjaus itsessään.
Punnitse suorituksen siirtämistä lähemmäs dataa
Sovelluksen ajaminen lähellä tietokantaa korvaa monet etäiset tietokantavaihdot yhdellä etänäyttöistunnolla. Puheliaalle kuormitukselle se voi olla suuri muutos, ja se on yhtä lailla toiminnallinen muutos kuin suorituskykymuutos: istuntojen hallinta, käytön valvonta, ohjelmistojen jakelu ja käyttökokemus kaikki muuttavat sovelluksen mukana.
Mittaa todellinen rajapinta ja sen siirtämä data ennen kuin oletat kumman tahansa suunnan olevan nopeampi. Etätyöpöytäistunto siirtää pikseleitä, ja tiheägraafinen näyttö voi suoriutua samalla polulla huonommin kuin korvaamansa kyselyt, varsinkin kun asiakas piirtää jatkuvasti uudelleen.
Toista sitten alkuperäinen toiminto ja vertaa kolmea lukua: peräkkäiset odotukset, tuloksen määrä ja päästä päähän -valmistumisaika. Parannus, joka muuttaa mitattua käyttäjätehtävää säilyttäen datan oikeellisuuden ja käyttöoikeuskäytännön, on se, joka kannattaa pitää.