Http gyvas šiuolaikiniame amžiuje

Taigi, pagal haproxy, kažkas žino apie http:

Išliko gyvas, siekiant sumažinti procesoriaus našumą naudojant serverius, kai procesoriai buvo 100 kartų lėčiau. Bet kas nėra pasakyta, kad nuolatiniai ryšiai sunaudoja daug atminties, nors juos nenaudoja kitas nei klientas, kuris juos atidarė. Šiandien 2009 m. Perdirbėjai yra labai pigūs, o atmintis vis dar ribojama iki kelių gigabaitų pagal architektūrą ar kainą. Jei norite, kad svetainė išgelbėtų gyvybes, yra reali problema. Dažnai atsisiunčiamos svetainės dažnai uždaromos, kad būtų išlaikytas maksimalus vienalaikių klientų paramos lygis. realus trūkumas yra ne gyventi šiek tiek padidėjusį latentą, kol bus atrinkti objektai. Naršyklės padvigubina lygiagrečių jungčių su ne saugyklomis svetainių skaičių, kad tai kompensuotų.

(iš http://haproxy.1wt.eu/ )

Ar tai atitinka kitų tautų patirtį? t.y. neišgelbėję gyvybės - ar tai yra rezultatas, kuris vos pastebimas dabar? (tikriausiai verta pažymėti, kad naudojant internetinius kištukus ir tt, ryšys palaikomas „atviras“, neatsižvelgiant į išlaikymo būseną, taikomosioms programoms, kuriose taikomi labai jautrūs reikalavimai). Ar poveikis yra reikšmingesnis žmonėms, nutolusiems nuo serverio, arba jei yra daug artefaktų, kuriuos galima atsisiųsti iš to paties kompiuterio, kai puslapis įkeliamas? (Manau, kad tokie dalykai kaip CSS, vaizdai ir JS vis dažniau gaunami iš CDN su palaikymo palaikymo funkcija).

Mintys?

(Nežinau, ar tai yra serverfault.com, bet neišsiųsiu paštu, kol kas nors man pasiūlys, kad jis būtų perkeltas ten).

89
10 нояб. nustatė Michael Neale lapkričio 10 d 2010-11-10 01:32 '10 ne 1:32 2010-11-10 01:32
@ 4 atsakymai

Ei, nes esu šios citatos autorius, atsakysiu: -)

Didelėse svetainėse yra dvi didelės problemos: lygiagrečios jungtys ir vėlavimas. Lygiagretų ryšį sukelia lėtai veikiantys klientai, kurie laiko amžių įkelti turinį ir nepanaudotų ryšių būseną. Šios nepanaudotos prisijungimo būsenos yra susijusios su tuo, kad ryšys pakartotinai naudojamas keliems objektams, vadinamiems saugiais, atkurti, o tai dar labiau padidina dėl vėlavimo. Kai klientas yra labai arti serverio, jis gali intensyviai naudoti ryšį ir užtikrinti, kad jis beveik niekada neveiks. Tačiau, kai seka baigiasi, niekas nerūpina greitai uždaryti kanalą, o ryšys ilgą laiką išlieka atviras ir nenaudojamas. Dėl šios priežasties daugelis žmonių siūlo naudoti labai mažą budėjimo trukmę. Kai kuriuose serveriuose, pvz., „Apache“, mažiausias laikas, kurį galite nustatyti, yra viena sekundė ir dažnai per daug, kad būtų išlaikytos didelės apkrovos: jei prieš jus turite 20 000 klientų, o kiekvienas iš jų išskiria vieno objekto vidurkį antra, jums bus šie 20 000 ryšiai, sukurti nuolat. 20 000 vienalaikių jungčių bendrosios paskirties serveryje, pvz., „Apache“, yra didžiulės, tai trunka nuo 32 iki 64 GB RAM, priklausomai nuo to, kurie moduliai yra pakrauti, ir jūs tikriausiai negalite tikėtis daug didesnio padidėjimo net pridėjus RAM. Praktiškai, 20 000 klientų, netgi galite matyti 40000-60000 vienalaikių jungčių serveryje, nes naršyklės bandys konfigūruoti 2–3 jungtis, jei jie turi daug objektų, kuriuos reikia atkurti.

Jei uždarysite ryšį po kiekvieno objekto, tuo pačiu metu sumažės sinchroninių jungčių skaičius. Iš tiesų, jis sumažės koeficientu, atitinkančiu vidutinį laiką, per kurį objektas turi būti įkeltas į laiką tarp objektų. Jei jums reikia 50 ms įkelti objektą (miniatiūrą, mygtuką ir pan.) Ir įkeliate vidutiniškai 1 objektą per sekundę, kaip nurodyta pirmiau, tuomet jums bus tik 0,05 jungtys vienam klientui, kuris yra tik 1000 vienalaikių jungčių 20 000 klientų.

Dabar atėjo laikas sukurti naujus ryšius. Nuotoliniai klientai patiria nemalonių vėlavimų. Anksčiau naršyklės naudojo daugybę vienalaikių jungčių, kai išjungtas išlikimas. Prisimenu MSIE numerius 4 ir Netscape 8. Tai iš tiesų padalytų vidutinį vėlavimą vienu objektu tiek daug. Dabar, kai gyvas yra visur, mes daugiau nematome tokių didelių skaičių, nes jis dar labiau padidina nuotolinių serverių apkrovą, o naršyklės rūpinasi interneto infrastruktūros apsauga.

Tai reiškia, kad su šiandieninėmis naršyklėmis sunkiau gauti ne komunikacines paslaugas, taip pat reaguojančias kaip ir palaikomos. Be to, kai kurios naršyklės (pvz., „Opera“) naudoja heuristiką bandydamos naudoti vamzdynus. Vamzdynų tiesimas yra veiksmingas būdas naudoti gyvą, nes jis beveik pašalina vėlavimą siunčiant kelis prašymus, nelaukdamas atsakymo. Bandžiau jį puslapyje su 100 mažų nuotraukų, o pirmoji prieiga - apie du kartus greičiau nei be taupymo, bet kita prieiga yra apie 8 kartus greičiau, nes atsakymai yra tokie maži, kad skaičiuojama tik latencija (tik „304“ atsakymai).

Sakyčiau, kad idealiu atveju turėtume turėti tam tikrus nustatymus naršyklėse, kad jie palaikytų ryšį tarp pasirinktų objektų ir nedelsdami juos išmestų, kai puslapis bus baigtas. Bet mes to nematome.

Dėl šios priežasties kai kurios svetainės, kuriose reikia įdiegti universalius serverius, pvz., „Apache“ priekinėje pusėje ir kurios turi palaikyti didelį klientų skaičių, paprastai turi išjungti išlikimą. Ir norint priversti naršykles padidinti ryšių skaičių, jie naudoja keletą domenų vardų, kad parsisiųsti būtų galima lygiagrečiai. Tai ypač problemiška SSL naudojamose svetainėse, nes ryšio nustatymas yra dar didesnis, nes yra dar vienas turas.

Šiais laikais dažniau pastebima, kad tokios svetainės mėgsta įdiegti tokias lengvąsias sąsajas, kaip haproxy arba nginx, kurios neturi problemų su dešimčių iki šimtų tūkstančių vienalaikių jungčių apdorojimu, ir leidžia jums palaikyti kliento pusės funkcijas ir išjungti ją Apache pusėje. Iš šios pusės, ryšio užmezgimo sąnaudos yra beveik nulinės CPU požiūriu ir nėra pastebimos laiko požiūriu. Taigi, jis suteikia geriausias iš abiejų pasaulių: mažas latentinis laikotarpis dėl to, kad palaikoma veikla su labai mažais laiko tarpais kliento pusėje ir mažas ryšių skaičius serverio pusėje. Visi yra laimingi: -)

Kai kurie komerciniai produktai tai dar labiau pagerina, pakartotinai panaudodami ryšius tarp priekinio krovinio balansavimo įrenginio ir serverio ir visus kliento ryšius sujungdami. Kai serveriai yra arti LB, pelnas nėra daug didesnis nei ankstesnis sprendimas, tačiau dažnai reikia pritaikyti prie programos, kad būtų užtikrinta, jog nėra pavojaus, jog sesijos perėjimas tarp vartotojų dėl netikėto dalijimosi keliais naudotojais, teoriškai, tai niekada neturėtų įvykti. Realybė yra labai skirtinga: -)

134
10 нояб. Atsakymą pateikė Willy Tarreau lapkričio 10 d. 2010-11-10 09:49 '10 ne 9:49 2010-11-10 09:49

Per metus nuo to laiko, kai jis buvo parašytas (ir paskelbtas čia „stackoverflow“), dabar turime populiarėjančius serverius, tokius kaip „nginx“.

Pavyzdžiui, nginx gali turėti atvirus 10 000 palaikomų ryšių viename procese su 2,5 MB atmintimi (megabaitais). Tiesą sakant, lengva padaryti kelis tūkstančius jungčių su labai maža RAM, ir vieninteliai apribojimai, kuriuos gaunate, yra kiti apribojimai, pvz., Atvirų failų skaičius arba TCP ryšiai.

Išlaikymas nebuvo problema dėl bet kokios problemos, susijusios su pačia gyva versija, bet dėl ​​„Apache“ procesų pagrįsto mastelio modelio ir palaikymo, kad jis būtų įsilaužęs į serverį, kurio architektūra nebuvo sukurta.

border=0

Ypač problemiška yra „Apache Prefork + mod_php + keep-alives“. Tai modelis, kuriame kiekvienas ryšys vis dar užims visą atminties, kurią užima PHP procesas, net jei jis visiškai neveikia ir lieka atviras tik kaip palaikymas. Tai nėra keičiamo dydžio. Tačiau serveriai neturėtų būti suprojektuoti tokiu būdu - nėra jokios ypatingos priežasties, kodėl serveris turi palaikyti kiekvieną palaikomąjį ryšį atskirame procese (ypač jei kiekvienas toks procesas turi pilną PHP interpretatorių). PHP-FPM ir įvykių pagrindu veikiantis serverio apdorojimo modelis, pavyzdžiui, „nginx“, elegantiškai pašalina problemą.

Atnaujinimas 2015:

„SPDY“ ir „HTTP / 2“ pakeisti HTTP išsaugojimo funkciją dar geriau: gebėjimas ne tik išlaikyti ryšį ir atlikti kelis prašymus bei atsakymus, bet ir juos dauginti, todėl atsakymai gali būti siunčiami bet kokia tvarka ir lygiagrečiai, o ne tik tokia tvarka, kur jie buvo prašomi. Tai užkerta kelią lėtiems atsakymams užblokuoti spartesnius ir neleidžia naršyklėms palaikyti keleto vienu metu esančių ryšių su tuo pačiu serveriu. Šios technologijos dar labiau pabrėžia mod_php metodo nepakankamumą ir kažko panašaus į žiniatinklio serverio naudą, pagrįstą įvykiais (arba bent daugialypiais), kurie atskirai susieti su kažkuo panašiu į PHP-FPM.

21
26 дек. Atsakymą pateikė thomasrutter . 2013-12-26 09:27 '13, 9:27, 2013-12-26 09:27

Supratau, kad jis neturi nieko bendro su procesoriumi, bet vėluoja atidaryti pakartotines lizdas į kitą pasaulio pusę. net jei jūs turite begalinį pralaidumą, ryšio latentinis laikas sulėtins visą procesą. jei jūsų puslapyje yra daugybė objektų. net ir nuolatinis ryšys turi vėlavimą užklausai / atsakymui, bet sumažina jį, kai vidutiniškai turite 2 lizdus, ​​turite srautų duomenis, o kitas gali būti užblokuotas. Be to, maršrutizatorius niekada netaps prielaida, kad lizdas yra prijungtas prieš leidžiant jums rašyti. Jam reikia visiškos apvalios kelionės. dar kartą, aš nenoriu būti ekspertu, bet taip aš visada jį matiau. tai, kas tikrai būtų kieta, yra visiškai ASYNC protokolas (ne, ne visiškai nesveikas protokolas).

2
10 нояб. Atsakymas pateikiamas „ catchpolenet“ lapkričio 10 d. 2010-11-10 01:50 '10 - 1:50 2010-11-10 01:50

Labai ilgai laikomi gyvi gali būti naudingi, jei naudojate CDN „kilmę“, pvz., „CloudFront“ arba „CloudFlare“. Tiesą sakant, jis gali veikti greičiau nei nėra CDN, net jei naudojate visiškai dinamišką turinį.

Jei jau turite ilgų teisių, todėl kiekvienas „PoP“ iš esmės turi nuolatinį ryšį su jūsų serveriu, tada, kai vartotojai pirmą kartą aplankys jūsų svetainę, jie gali greitai atlikti TCP rankinį paspaudimą, naudodamiesi vietine „PoP“, o ne lėtai pasisveikindami. (Pačioje šviesoje užtrunka apie 100 ms, kad per pluoštą būtų pasiektas pusiaukelėje ir kad TCP ryšiui sukurti reikia, kad trys paketai būtų siunčiami pirmyn ir atgal. SSL reikalauja trys reisai .)

2
11 апр. atsakymas pateikiamas kovo 11 d. 2013-04-11 17:25 '13, 17:25, 2013-04-11 17:25