Prelazak na veće radne prostore bez čekanja za bilo koga
Svaki Mythex projekat dobija sopstveni radni prostor: mali računar u oblaku na kojem agent piše kod i na kojem radi pregled vaše aplikacije. Novim radnim prostorima povećali smo memoriju sa 1 GB na 2 GB, ali su stariji ostali na 1 GB — na dan kada smo proverili, oko četvrtine njih. Naša prva popravka premeštala je projekat na veći radni prostor kada bi bio sledeći put otvoren. Prvog dana u produkciji to je jednu osobu teralo da čeka sedam minuta. Zato smo postavili tvrdo vremensko ograničenje, a onda smo premeštanje uklonili iz otvaranja projekta uopšte.
Zašto su stari radni prostori ostali mali
Naš provajder sandbox-a postavlja veličinu radnog prostora kada se on napravi i zadržava je kroz svaku pauzu i nastavak rada. Promena šablona — recepta po kojoj se prave novi radni prostori — utiče samo na radne prostore napravljene posle promene. Ništa ne menja veličinu onih koji već postoje.
To je bilo važno. Jedan od malih radnih prostora ostao je bez memorije tokom git push-a dok je njegov pregled počinjao i 11 minuta nije odgovarao. Zbog toga objava nije uspela.
Prvi pokušaj: premestiti projekat kada se probudi
Radni prostori se pauziraju kada ih niko ne koristi, a bude se kada se projekat otvori. Buđenje je delovalo kao pravi trenutak za premeštanje, jer u projektu još niko ne radi.
Premeštanje je radilo ovako:
- Proveri veličinu. Ako je radni prostor manji od 2 GB, premesti ga. Ako veličina nije poznata, ne radi ništa.
- Ne ometaj objavu. Objava čita fajlove radnog prostora, pa ako je neka u toku, preskoči premeštanje.
- Spakuj projekat. Arhiviraj sve u projektu — uključujući njegovu git istoriju, odnosno svaki checkpoint koji projekat ima, i
.envfajl aplikacije, koji pripada vlasniku — ali izostavi instalirane zavisnosti (node_modules), koje je moguće ponovo instalirati. - Prebaci direktno. Protoči arhivu iz starog radnog prostora u novi od 2 GB, tako da nikad ne mora da stane u memoriju našeg servera.
- Uporedi pre prebacivanja. U oba radna prostora prebroj fajlove, pročitaj poslednji checkpoint i prebroj checkpoint-e. Prebaci samo ako se sva tri poklapaju.
- Zadrži stari ako nešto ne uspe. Svaka greška ili nepodudaranje odbacuje novi radni prostor i projekat se otvara u starom, kao i ranije.
Jedan detalj u poređenju bio je važniji nego što izgleda. Provera se izvodi kao administratorski nalog, a git odbija da čita repozitorijum čiji je vlasnik drugi korisnik. Na obe strane nije ispisao ništa — a „ništa” se poklopilo sa „ništa”, pa je provera prošla bez poređenja ikakve istorije. Rekli smo gitu da veruje direktorijumu i dodali test da se to ne bi ponovo dogodilo.
Šta je pošlo po zlu prvog dana
Prvog dana u produkciji pakovanje jednog projekta udarilo je u vremensko ograničenje komande od pet minuta — unutar buđenja. Vlasnik je čekao sedam minuta da se njegov radni prostor otvori. A pošto premeštanje nije uspelo, projekat je i dalje bio mali, pa bi sledeće otvaranje pokušalo ponovo i opet ga nateralo da čeka.
Migracija koja nekoga tera da čeka dok otvara sopstveni projekat je loša razmena. Cela ideja da se radi pri buđenju bila je u tome da niko ne primeti.
Drugi pokušaj: tvrdi budžet
Istog dana promenili smo četiri stvari:
- Jedan minut za ceo prelazak. Svaki korak — provera veličine, pakovanje, pravljenje novog radnog prostora, kopiranje, raspakivanje, poređenje — deli jedan budžet od 60 sekundi. Kada se on potroši, projekat se otvara u starom radnom prostoru.
- Zaustavi posao, ne samo čekanje. Odustajanje sa naše strane nije dovoljno ako arhiviranje i dalje radi unutar radnog prostora koji vlasnik upravo treba da koristi. Svaka komanda za arhiviranje sada se ubija unutar samog radnog prostora neposredno pre kraja budžeta. Ako novi radni prostor stigne posle našeg odustajanja, odbacuje se.
- Ne teraj vlasnika da čeka čišćenje. Brisanje privremene arhive sada se radi u pozadini.
- Ne pokušavaj ponovo pri svakom otvaranju. Projekat koji nije mogao da se premesti ostavlja se na miru 24 sata, tako da neuspeh košta najviše jedno kašnjenje dnevno, a ne jedno pri svakom otvaranju.
Treći pokušaj: izbaciti ga iz buđenja
To je najgori slučaj svelo na jedan minut. Ali minut je i dalje minut, pa smo shvatili da premeštanje uopšte ne mora da bude na ičijem putu.
Nijedan radni prostor se više ne pravi na 1 GB. Dakle, ovo nije stalan proces; to je jednokratan posao sa fiksnom listom radnih prostora. Kada je bilo unutar buđenja, pravi čovek je plaćao svako sporo premeštanje, a jedini način da saznamo da radni prostor neće da se premesti bio je da je neko upravo čekao na to.
Zato smo premeštanje potpuno uklonili iz buđenja. Otvaranje projekta radi kao i pre. Preostali mali radni prostori obrađuju se kao nadgledana serija: niko na njih ne čeka, a radni prostor koji se ne može premestiti pojavljuje se u izveštaju serije, gde ga možemo pogledati, umesto pred očima vlasnika.
Šta smo iz ovoga izvukli
- Promena veličine nije uvek moguća. Kada platforma fiksira veličinu pri pravljenju, povećanje podrazumevane vrednosti pomaže samo novim stvarima. Planirajte za stare.
- „Niko je još ne koristi” i dalje znači da neko čeka. Posao koji se radi na putu ka proizvodu je posao koji čovek posmatra.
- Stavite budžet na sve što je na putu korisnika i zaustavite posao kada se budžet potroši. Odustajanje na našoj strani dok komanda nastavlja da radi negde drugde samo pomera problem.
- Jednokratna migracija pripada jednokratnom poslu. Skrivanje u svakodnevnim radnjama čini je jeftinijom za pisanje, a skupljom za pokretanje.
- Testirajte svoje sigurnosne provere. Poređenje koje ništa ne poredi izgleda tačno kao ono koje je prošlo.
Ako gradite na Mythex-u, nema ništa što treba da uradite: cilj je jednostavno manje radnih prostora koji ostanu bez memorije, uz otvaranje projekta jednako brzo kao pre. Kako se radni prostori pauziraju i bude, opisano je u dokumentaciji pod privatni radni prostor. Za još jednu priču o nedostatku memorije pogledajte pad zbog nedostatka memorije skriven u oznaci napretka.