Blog

Prechod na väčšie pracovné priestory bez čakania pre niekoho

Každý projekt Mythex dostáva vlastný pracovný priestor: malý cloudový počítač, kde agent píše kód a beží náhľad vašej aplikácie. Nové pracovné priestory sme zvýšili z 1 GB pamäte na 2 GB, ale staršie zostali na 1 GB — v deň kontroly to bola asi štvrtina z nich. Naša prvá oprava presunula projekt do väčšieho priestoru pri jeho ďalšom otvorení. Na prvý deň v produkcii to jednému človeku spôsobilo sedem minút čakania. Nasadili sme preto pevný časový limit a potom sme presun úplne odstránili z otvárania projektu.

Prečo staré priestory zostali malé

Náš poskytovateľ sandboxov nastaví veľkosť pracovného priestoru pri jeho vytvorení a zachová ju pri každom pozastavení a obnovení. Zmena šablóny — receptu, podľa ktorého sa nové priestory vytvárajú — ovplyvní len priestory vytvorené po zmene. Existujúce nijako nezmení.

Toto bolo dôležité. Jeden z malých priestorov pri git push vyčerpal pamäť, kým sa spúšťal jeho náhľad, a 11 minút neodpovedal. Kvôli tomu zlyhalo jedno publikovanie.

Prvý pokus: presun pri prebudení

Pracovné priestory sa pozastavia, keď ich nikto nepoužíva, a prebudia, keď sa projekt otvorí. Prebudenie sa zdalo ako správny okamih na presun projektu, pretože v ňom ešte nikto nepracuje.

Presun fungoval takto:

  1. Skontrolovať veľkosť. Ak je priestor menší ako 2 GB, presuň ho. Ak jeho veľkosť nie je známa, nerob nič.
  2. Nerušiť publikovanie. Publikovanie číta súbory pracovného priestoru, takže ak beží, presun preskoč.
  3. Zabaliť projekt. Zaarchivuj všetko v projekte — vrátane jeho histórie gitu, teda každého checkpointu projektu, a súboru .env aplikácie, ktorý patrí vlastníkovi — ale vynechaj nainštalované závislosti (node_modules), ktoré sa dajú znovu nainštalovať.
  4. Preniesť priamo. Archív prenes prúdovo zo starého priestoru do nového 2 GB priestoru, aby sa nikdy nemusel zmestiť do pamäte nášho vlastného servera.
  5. Porovnať pred prepnutím. V oboch priestoroch spočítaj súbory, načítaj posledný checkpoint a spočítaj checkpointy. Prepni len vtedy, keď sa všetky tri zhodujú.
  6. Pri akejkoľvek chybe ponechať starý. Každá chyba alebo nesúlad zahodí nový priestor a projekt sa otvorí v starom, ako predtým.

Jeden detail v porovnaní bol dôležitejší, než sa zdá. Kontrola beží pod administrátorským účtom a git odmietne čítať repozitár, ktorý vlastní iný používateľ. Na oboch stranách nevypísal nič — a „nič“ sa zhodovalo s „niečím“, takže kontrola prešla bez porovnania akejkoľvek histórie. Povedali sme gitu, aby adresáru dôveroval, a pridali sme test, aby sa to už nezopakovalo.

Čo sa pokazilo prvý deň

Na prvý deň v produkcii zabalenie jedného projektu narazilo na päťminútový časový limit príkazu — vnútri prebúdzania. Vlastník čakal sedem minút, kým sa jeho pracovný priestor otvoril. A keďže presun zlyhal, projekt zostal malý, takže ďalšie otvorenie by to skúsilo znova a človeka by to znova zdržalo.

Migrácia, ktorá necháva človeka čakať pri otváraní vlastného projektu, je zlý obchod. Celý zmysel robiť ju pri prebudení bol v tom, že si ju nikto nevšimne.

Druhý pokus: pevný rozpočet

Ten istý deň sme zmenili štyri veci:

  • Jedna minúta na celý presun. Každý krok — kontrola veľkosti, balenie, vytvorenie nového priestoru, kopírovanie, rozbalenie, porovnanie — zdieľa jeden rozpočet 60 sekúnd. Keď sa minie, projekt sa otvorí v starom priestore.
  • Zastaviť prácu, nie len čakanie. Vzdať sa na našej strane nestačí, ak archivácia stále beží vnútri pracovného priestoru, ktorý chce vlastník práve použiť. Každý archivačný príkaz sa teraz ukončí priamo vo vnútri pracovného priestoru tesne pred koncom rozpočtu. Ak nový priestor príde potom, čo sme sa vzdali, zahodí sa.
  • Nečakať na upratovanie. Mazanie dočasného archívu teraz prebieha na pozadí.
  • Neskúšať znova pri každom otvorení. Projekt, ktorý sa nedal presunúť, zostane 24 hodín nedotknutý, takže zlyhanie stojí najviac jedno zdržanie denne, nie jedno pri každom otvorení.

Tretí pokus: vybrať to z prebudenia

To znížilo najhorší prípad na jednu minútu. Minúta je však stále minúta a uvedomili sme si, že presun vôbec nemusí byť na ničej ceste.

Žiaden pracovný priestor sa už nevytvára s 1 GB. Nejde teda o priebežný proces, ale o jednorazovú úlohu s pevným zoznamom priestorov. Robiť ju vnútri prebudenia znamenalo, že skutočný človek platil za každý pomalý presun a jediný spôsob, ako sme zistili, že priestor sa nepresunie, bolo, že na to práve niekto čakal.

Preto sme presun z prebúdzania úplne odstránili. Otvorenie projektu funguje ako predtým. Zvyšné malé priestory sa spracujú ako riadená dávka: nikto na ňu nečaká a priestor, ktorý sa nepresunie, sa objaví v správe z dávky, kde sa naň môžeme pozrieť, namiesto toho, aby sa objavil pred očami človeka, ktorému patrí.

Čo sme si z toho odniesli

  • Zväčšenie nie je vždy možné. Keď platforma veľkosť pri vytvorení pevne určí, zvýšenie predvolenej hodnoty pomôže len novým veciam. Počítaj so staršími.
  • „Ešte to nikto nepoužíva“ stále znamená, že niekto čaká. Práca vykonaná na ceste do produktu je práca, ktorú človek sleduje.
  • Daj rozpočet každému kroku na ceste používateľa a pri jeho vyčerpaní prácu zastav. Vypršanie časového limitu na našej strane, zatiaľ čo príkaz beží ďalej inde, problém len presunie.
  • Jednorazová migrácia patrí do jednorazovej úlohy. Skrývanie v každodenných akciách ju síce ľahšie napíšete, ale draho sa spúšťa.
  • Testujte svoje bezpečnostné kontroly. Porovnanie, ktoré nič neporovnáva, vyzerá presne ako to, ktoré prešlo.

Ak na Mythex budujete, nemusíte robiť nič: cieľom je jednoducho menej pracovných priestorov, ktorým dochádza pamäť, a otváranie projektu rovnako rýchle ako doteraz. Ako sa pracovné priestory pozastavujú a prebúdzajú, je popísané v dokumentácii v časti súkromný pracovný priestor. Ďalší príbeh o nedostatku pamäte nájdete v článku pád pre nedostatok pamäte skrytý v popisku priebehu.

Mythex · Pricing · Vytvorte čokoľvek s AI · Šablóny webov a aplikácií · Mythex v porovnaní · Slovník pojmov tvorby aplikácií s AI · Bezplatné nástroje na tvorbu aplikácií s AI · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)