Selitykset · kaksi

Miksi vaurioituneilla postauksilla on väliä

Täydellisesti sujuva lataus on helppo tapaus, ja jokainen ohjelma hoitaa sen pätevästi. Kiinnostavat erot ilmaantuvat kun osa postauksesta puuttuu, ja niin käy paljon useammin kuin puhdas tapaus antaisi ymmärtää. Tässä kerrotaan mitä oikeasti tapahtuu ja miksi se maksaa niin paljon aikaa.

Ongelman muoto

Mikä puuttuva artikkeli on

Usenet-postaus ei ole yksi tiedosto. Se on tuhansia pieniä artikkeleita, joista kukin on tallennettu itsenäisesti kunkin palveluntarjoajan palvelimille, ja lataamasi NZB on luettelo niiden nimistä. 6.5 GB:n julkaisussa niitä on karkeasti 9,000.

Artikkelit katoavat tavanomaisista syistä. Palveluntarjoajat säilyttävät niitä kiinteän säilytysajan ja poistavat ne sitten. Jotkin palveluntarjoajat eivät koskaan saaneet tiettyä artikkelia alun perinkään, koska leviäminen palvelinten välillä on epätäydellistä. Toisinaan lähetys oli keskeneräinen kun se julkaistiin, eikä osa siitä koskaan ollut olemassa missään. Syystä riippumatta vaikutus on sama: ohjelmasi pyytää artikkelia, ja vastaus on kieltäytyminen eikä dataa.

Tämä on riittävän tavallista, että Usenetiin postaavat ihmiset varautuvat siihen. Lähes jokaisen julkaisun mukana tulee pariteettidataa, yleensä PAR2-tiedostoja, eli ylimääräistä alkuperäisestä laskettua toisteista tietoa. Jos osa sisällöstä puuttuu, pariteetti voi rakentaa sen uudelleen, kunhan sitä on tarpeeksi. Tyypillinen postaus kantaa noin 10% pariteettia, joten postaus voi menettää melkoisen osan itsestään ja olla silti täysin palautettavissa.

Vaurioitunut postaus ei siis yleensä ole rikkinäinen lataus. Se on lataus joka vaatii hieman laskentaa ennen valmistumista. Ainoa kysymys on kuinka kauan ohjelmalta kestää tajuta se, ja juuri siinä ne eroavat kaksinkertaisesti tai enemmän.

Kallis osa

Sellaisen pyytäminen mitä kellään ei ole

Kun palvelimella ei ole artikkelia, se palauttaa kieltäytymisen, ja ohjelma kokeilee sitten listasi seuraavaa palvelinta. Se on oikea toimintatapa, koska toisella palveluntarjoajalla se hyvin usein on. Hinta ilmaantuu kun sitä ei ole kenelläkään.

Siinä tapauksessa ohjelma käy läpi koko palveluntarjoajalistasi, yhden palvelimen kerrallaan, ja saa kieltäytymisen jokaiselta ennen kuin voi päätellä artikkelin olevan todella poissa. Läpikäynti on peräkkäinen, ja kieltäytymiset ovat hitaampia kuin oletetaan. Mittasimme ne suoraan, lepäävällä linjalla, ilman että sisältöä liikkui lainkaan:

palveluntarjoajaaika vastata tavalliseen pyyntöönaika kieltäytyä puuttuvasta artikkelista
Palveluntarjoaja A77.5 ms78.8 ms
Palveluntarjoaja B10.5 ms454 ms
Palveluntarjoaja C10.8 ms871 ms
Palveluntarjoaja D9.9 ms1,227 ms
Palveluntarjoaja E10.6 ms2,239 ms

Kaksi asiaa erottuu. Ensinnäkin hajonta on valtava: kieltäytyminen maksaa jotain 79 ms:n ja 2.2 sekunnin väliltä riippuen siitä kuka palveluntarjoaja vastaa, lähes kolmikymmenkertainen ero. Toiseksi yksi palveluntarjoaja kieltäytyy käytännössä siinä ajassa mikä kysymiseen menee, kun taas toinen käyttää yli kaksisataa kertaa oman normaalin vastausaikansa sanoakseen ei. Se ei ole verkkoviivettä, se on työtä joka tapahtuu heidän puolellaan, eikä harvemmilla edestakaisilla kysyminen juuri auta.

Laske yhteen: täysi läpikäynti viidellä palveluntarjoajalla maksaa yhdestä ainoasta enää olemattomasta artikkelista noin 5 sekuntia. Ajattele nyt että vaurioituneessa postauksessa on monta sellaista artikkelia, ja että peräkkäin niitä käsittelevä ohjelma maksaa sen hinnan yhä uudelleen samalla kun yhteytesi seisoo tyhjänä. Lataus ei ole hidas siksi että data saapuu hitaasti. Se on lakannut saapumasta kokonaan, ja ohjelma odottaa että sille kerrotaan se minkä päättelemiseen sillä on jo tarpeeksi tietoa.

Ratkaisu

Lakkaa kysymästä, ja korjaa sen sijaan

Oivallus ei ole tehdä kieltäytymisistä nopeampia, koska emme hallitse palveluntarjoajia. Se on huomata milloin vastauksella ei enää ole merkitystä.

Minä hetkenä hyvänsä latauksen aikana ohjelma tietää kaksi asiaa: kuinka monta palasta on yhä kateissa, ja kuinka paljon pariteettidataa sillä jo on. Jos kädessä oleva pariteetti riittää rakentamaan uudelleen kaiken yhä avoinna olevan, vastaus kysymykseen onko tämä artikkeli kenelläkään ei voi enää muuttaa lopputulosta. Oli se hidas kyllä tai hidas ei, tiedosto rakennetaan joka tapauksessa. Läpikäynnin jatkaminen ostaa vain viivettä.

Nykyinen koontiversio lakkaa siis kysymästä siinä kohtaa ja siirtyy suoraan korjaukseen. Itse uudelleenrakennus on nopea ja on aina ollut: noin 2.3 sekuntia 6.5 GB:n postauksella, ja tuo luku on sama jokaisessa mittaamassamme versiossa. Säästynyt aika on kokonaan odotusta jota ei enää tapahdu.

6.5 GB:n postaus, 60 puuttuvaa artikkeliaaika tarkistettuun tiedostoon
odottaa jokaisen palveluntarjoajan kieltäytymistä23 s
lopettaa heti kun pariteetti kattaa aukon13 s
josta varsinainen korjauslaskenta2.3 s

Sama muutos ei tee yhtään mitään vahingoittumattomalle postaukselle, mikä on selvin todiste siitä että se tekee sen mitä ajattelemme: ilman puuttuvia artikkeleita ei ole läpikäyntiä lyhennettäväksi, ja molemmat koontiversiot päättävät puhtaan 6.5 GB:n työn samoissa 7 sekunnissa.

Se on vaihtokauppa, ei ilmainen voitto. Aikainen korjaaminen tarkoittaa pariteettidatan pitämistä muistissa sen sijaan että se heitettäisiin pois ja haettaisiin lisää myöhemmin, joten muistin huippukäyttö (RSS) pahoin vaurioituneessa postauksessa nousee noin 0.8 GB:stä noin 1.3 GB:hen, ja vedämme palveluntarjoajilta suunnilleen 400 MB enemmän. Vahingoittumattomassa postauksessa muisti pysyy ennallaan 0.24 GB:ssä. Pidämme sitä useimmille oikeana vaihtokauppana, koska muistia kuluu vain siinä tapauksessa jossa se ostaa sinulle kymmenen sekuntia, mutta se on todellinen kustannus ja sille on asetus.

Palveluntarjoajien nimet jätetään kieltäytymistaulukosta pois tarkoituksella. Luvut ovat yhden mittauksen ominaisuus, yhtenä iltana, yhdestä paikasta, eikä palveluntarjoajaa joka indeksoi toisin, tai jonka satuimme tavoittamaan huonona iltana, pitäisi leimata hitaaksi yhden kierroksen perusteella. Argumentin kannalta merkitsee muoto: kieltäytymiset vaihtelevat valtavasti, ja summa on tarpeeksi suuri hallitakseen vaurioitunutta latausta. Palveluntarjoajakohtaiset luvut ja raaka mittaustuloste ovat sisäisissä muistiinpanoissamme, ja niiden selittämät päästä päähän -luvut ovat vertailusivulla.