DISCOURSE: Live-seurannan päivitysviive ruuhkahuipuissa

Pari pointtia jotka itselläni tulevat mieleen:

Kahlaamatta nyt koko ketjua läpi (en nähnyt alussa ainakaan puhuttavan), kuinka paljon noissa huipuissa on muistia vapaana? Ettei Redis swappaa ja aiheuta hitautta sitä kautta?

Mikä koko pannun load average on? Montako ydintä on yleensäkkin käytössä, onko tämä ihan topilla tämä 100%? Sehän ei sinällään vielä kerro sitä aiheuttaako tuo hitautta. Millaiset IO:t (waitit) on noilla ruuhkahuipuilla?

Esim jos Redis alkaa swapata ja kirjoittaa levylle muistin loppuessa → waitit kasvaa → Redis näyttää syövän enemmän tehoja ja tuo swappays muodostuu pullonkaulaksi.

1 tykkäys
  • Muisti ei ole ongelma. Sitä on aina ollut riittävästi ja juuri nyt reilusti ylikin. Discoursen muistin kulutus on ennakoitavaa – se ei nouse kuormissa.
  • Loadit ylittävät hetkellisesti maksimitason (6.00 / 6-core)
  • i/o waitit eivät nähdäkseni ole nousseet merkittävästi, mutta vaatisi kunnon logittamista että pystyisi ylipäätään paremmin havainnoimaan

Nyt ongelma tulee joksikin aikaa ratkeamaan sillä, että muutamme Discoursen omaan datacenteriin ja heidän ylläpitämälle alustalle.

Se mikä jatkon kannalta kiinnostaa, on kuinka tämä voitaisiin skaalata horisontaalisesti ja mieluummin VPS-purkkeja käyttäen, koska sekin on haastava polku, että parin-kolmen vuoden välein lätkitään isompaa dedikoitua palvelinta pystyyn. Dedit muutenkin vähän vikaherkempi ratkaisu, kuin VPS.

1 tykkäys

Scaleway voisi olla tuossa ihan järkevä ratkaisu. Hajauttaa toimintoja eri instansseille. Yhdelle perus webasto, yksi Redisille, yksi kannalle jne. Niitähän saa aika helposti myös skaalattua sen jälkeen palikka kerrallaan jos sille tulee tarvetta sen sijaan että täytyisi sitten vetää koko dedikoitu uusiksi.

Keskustelu on nyt vähän monessa ketjussa, mutta seuraillaan tässä edelleen tätä itse oiretta – eli liven jumittelua.

Koska pelit loppuivat ja infran uudistusta silmällä pitäen:

  • Skaalasin takaisin 80$ planiin (6-core, 16GB RAM)
  • Redis 6 mahdollistaa monisäikeisen ajon, joten threads: 3
  • Unicorns määrää laskin yhdellä: 11
  • db_work_mem vähän korkeammalla arvolla: 80MB (Jay Pfaffmanin ehdotus)
  • Performance headers päällä, ping @Spartak, @ozzi. Itselle uudehko juttu, johon pitää perehtyä.
4 tykkäystä

:+1: Nyt näkyy suorituskysytietoja. Silloin kun Discourse niitä palauttaa, niin nämä kannattaa ainakin panna merkille:

x-redis-time: 0.000339
x-sql-time: 0.010143
x-queue-time: 0.001423

Ikävästi Discourse ei niitä näyttäisi perus pollauksiin ja timingsiin palauttavan, mutta mm. etusivun latausesta ne näkyy palautuvan (löytyy network inspectorissa response-headereiden alta).

Näitä voi nyt vähän vilkuilla eri aikoihin niin saa vertailupohjaa siihen miltä ne sitten näyttävät kun taas pelataan.

Laitan tähän muistiin satunnaisen otoksen nyt uudesta palvelinympäristöstä:

x-redis-time: 0.001375
x-sql-time: 0.019680
x-queue-time: 0.000730

1 tykkäys

Ei kannata vielä, koska taustalla höylätään (rebake) 67489 viestiä uusiksi ja konvertoidaan täyslaatuisista kuvista esikatseluversioita.

Edit:

Eli suorituskykyyn vaikuttavat parametrit ovat nyt seuraavassa asennossa.

  • Mitään meidän kehittämiä ja kokeilema hackeja ei ole käytössä. Ihan defaultilla mennään niiden puolesta.
  • Tietokantapurkki on 4-vCore / 8GB RAM resursseilla varustettu.
    • db_shared_buffers: 4096MB
    • db_work_mem: 80MB
    • Redis_io_threads: 3
    • Arvot on vedetty ihan hatusta, mutta muistin ainakin kulutus on toistaiseksi hallinnassa. Redis on se mielenkiintoisin, koska threadeja nostamalla palvelukyky kasvaa, mutta CPU kuormitus nousee. Arvasin nyt 3 threadia (ennen 2.5 versiolla tämä oli aina 1), sillä idealla että täydellä kuormituksellakin 1 vCore jää tietokantaoperaatioille ja muille prosesseille.
  • Fronttia pyörittävä web purkki on samanlainen 4-core 8GB värkki
    • Unicorns: 12
    • Tämä on aika iso arvo (3x vCoret), mutta ajattelin että kyllähän purkin täytyy suoriutua, koska Postgres ja Redis eivät enää kilpaile samoista resursseista. Isoimmalla 8-core purkilla taisi olla 16 kpl Unicorneja parhaimmillaan.
    • Muistia ei näytä frontilla juuri kuluvan

Tutkimukset jäivät siihen tulokseen, että jos Unicornien määrää on riittävä, niin yhdellä säikeellä ajettava Redis on pullonkaula. Kun tuli mahdollisuus lisätä threadeja, nousi prosessorin kuorma liian lähelle 100% järjestelmä suojeli itseään näyttämällä sivuja read-only tilassa.

Todella mielenkiintoista nähdä miten kuorma jakaantuu jatkossa.

4 tykkäystä

Äkkiseltään tämä vaikuttaisi hyvältä arvaukselta. Meidän omissa järjestelmissä Google Cloudissa varataan aina kokonaan yksi core CPU-intensiivisimmille serviceille.

2 tykkäystä

Sitä mietin pitkään, että laittaisinko 2 koska sekin on tuplasti enemmän kuin ennen, samalla single thread suorituskyvyllä. Vanhat mittailut kuitenkin viittasivat siihen, että chat tilanteessa Redis olisi kuormitetumpi kuin Postgres.

2 tykkäystä

Hyvin tuntuu nyt pelittävän.

Minkälaista performance-dataa Discoursesta pystyy sitten liveseurannasta keräämään?

Otteluohjelman muutos tuli yllättäin ja huonolle päivälle - olen nimittäin tien päällä ehtoon ja vaikka ehtisinkin perille matsin aikana, niin on epävarmaa pystynkö seuraamaan kuormitusmittareita tai peliä. @ozzi:lla oli hänelläkin jotain menoa ainakin alkuillasta.

Kiinnostavaahan olisi, että hyytyykö meiltä frontti vai tietokanta ensimmäisenä. Prosessoreja on ihan saman verran käytössä kuin viime pelissä, nyt muodossa 2x4.

@a1r6 Performance headerit on päällä, eli Chromen Dev Toolsilla kuka tahansa voi tarkastella mm. Redis ja SQL viivettä, kuten @spartak tuossa jo harjoitteli.

2 tykkäystä

Haluatko nimipingejä otteluketjuun mahdollisista viiveistä lageista tms muista kupruista tyyliin:

[at]ljpp Palsta heivasi minut pihalle kello xx:xx kun erää x oli pelattu noin xx:xx.

Katselin tuossa requesteja, kun klikkaa jonkun threadin auki ja ilmeisesti nuo performance headerit löytyvät responseista requesteihin, joiden nimi alkaa numero.json, esim. 144.json?

Noiden lisäksi niitä tulee ainakin /poll?dlp=t päätteisten pyyntöjen vastauksissa. Harmi että Discourse ei pysty performance headereita toimittamaan kaikkiin pyyntöihin, mutta noillakin alkuun pääsee.

1 tykkäys

Näemmä oli myös tämän nimisessä requestissa, “866389”. Requesti oli “GET Tappara.co”.

1 tykkäys

Postasin testiviestin tuonne testiketjuun ja toisessa selaimessa avoimena olleen ketjun livepäivitykseen tuli request:

GET xhttps://tappara.co/t/37/posts.json?post_ids%5B%5D=866397&include_suggested=false

Edit: Millähän mä nyt saan tuon urlin niin ettei se näy linkkinä… Requestin nimi alkaa joka tapauksessa “posts.json”. No prefixasin protokollan x:llä.

Edit: Ja nyt kun ei ole kuormaa niin performance headerit näyttävät tältä:

x-queue-time: 0.001519
x-redis-calls: 4
x-redis-time: 0.002349
x-runtime: 0.062645
x-sql-calls: 24
x-sql-time: 0.029893

2 tykkäystä

Kahdessa selaimessa auki otteluseuranta, toisessa seuraan requestien performance headereita ja niissä ei ole ollut mitään erikoista.

Mutta, nimenomaan siinä debuggeri-selaimessa yhteen requestiin tuli responsena 429 ja se jäi joksikin aikaa jumiin, toinen jatkoi päivittymistä ihan normaalisti.

Edit: Tämä siis tapahtui Tapparan ekan maalin jälkimainingeissa, sama tapahtui TPS:n maalin yhteydessä.

Edit: Äsken hyytyi tämä toinen selain joksikin aikaa, oletettavasti samasta syystä.

Edit: TPS:n tokan maalin jälkeen debuggeri-selain jäi pitkäksi aikaa jumiin ilman tuota 429:ää, kaikki performance headereiden ajat ihan normaaleja samaten kuin tuo debuggerin “Time”-columni.

1 tykkäys

Joo, aika mielenkiintoista.

  • Virtuaalinen yleisömäärä on tänään aika pieni
  • Viestimäärä kuitenkin korkeahko, koska paljon maaleja
  • Olen jokseenkin yllättynyt että tietokantapurkki lähinnä idlaa, mutta frontti tekee paljon töitä kun aktiviteetti piikkaa
1 tykkäys

Jumi loppuu automaattisesti ilman että tarvitsee tehdä refreshiä. Perstuntumalta sanoisin, että jumi kestää n. viisi sekuntia ja sen jälkeen kaikki uudet viestit tulevat kerralla.

Edit: TPS:n kolmannen maalin jälkeen jälleen debuggeri-selain jumiin ja kaikki ajat ihan normaaleja. Nyt jumi kesti kauan, ehkä n. 45 sekuntia, mutta jälleen korjautui itsestään.

1 tykkäys

Tämä on kyllä ihan uutta, eikä tuollaista edes huomaisi? Kyllä 429 laittaa clientin pidemmälle jäähylle.