Když se nedaří

Lidi si pořád stěžovali, že web Olomouckých špeků se načítá nějak pomalu. Vůbec se mi to nezdálo, protože tam nebylo nijak moc obsahu, pár obrázků a celé to běží na VPS, kde je 1GB RAM a kromě Špeků a mailserveru k nim, tam jedou asi dva projekty, na které chodí 0 lidí.

Zkoušel jsem nástroje od Googlu, které mi doporučily asynchronní načítání některých javascriptů, což jsem vylepšil, ale moc to nepomohlo. Pořád jsem si s tím lámal hlavu, až včera jsem přišel na bug ve svém kódu.

Nedávno jsem někde zahlídnul control, který generuje náhledy obrázků až ve chvíli, kdy jsou potřeba. Má to dvě výhody: nemusíte v adminu řešit resize při uploadu. Finální velikost obrázků a způsob jeho ořezu si řekne kodér zavoláním správného controlu až na frontendu. A jako bonus, když se redesignuje, nemusí se náhledy hromadně mazat a přegenerovávat, prostě se změní volání controlu v šablonách a časem se přegenerují samy (když je někdo poptá). Průšvih byl v tom, že jsem zapoměl v kódu naimplementovat větev, která zajistí použití již vygenerovaného náhledu, pokud existuje. Takže se všechny obrázky na webu při každém načtení resizovaly znova! Což při 10 obráucích na jedné stránce, které v originále mají třeba 1MB, který se musí načíst do paměti, a když přijde víc lidí najednou, není pro RAM serveru úplně příjemné. Takže to jsem opravil, ale server byl podezřele vytížený dál a mailové služby na něm pořád padaly.

Zjistil jsem, že virtuální server vůbec nemá swap, což je nepříjemné ve chvíli, kdy dojde RAM. Linuxový systém pak odstřelí některé procesy, takže vám potichu spadnou některé služby. Na podpoře mi napsali, že používání swapu zpomaluje server. To je sice pravda, ale jeho nepoužívání úplně odstřeluje služby. Řešením je samozřejmě přikoupit RAM, což se mi hned nechtělo. Navíc mám podobné řešení i na jiných virtuálech, které to zvládají.

Rozhodl jsem se přidat swap, což si tady popíšu, ať to někde mám poznamenané:).
Jsou dvě cesty: buď si přerozdělit partitions na disku a vytvořit místo pro swap, čehož jsem se trochu bál. Dnešní Linux kernel ale prý už pracuje stejně rychle se swapem v souboru

  1. pomocí dd vytvoříme soubor o požadované velikosti (v příkladu 512MB jako 1024*512) do umístění /swapfile1:
    # dd if=/dev/zero of=/swapfile1 bs=1024 count=524288
  2. řekneme, že to bude swap:
    # mkswap /swapfile1
  3. nastavíme práva, aby swap nemohl nikdo neoprávněný číst:
    # chown root:root /swapfile1
    # chmod 0600 /swapfile1
  4. a konečně řekneme systému, že swap může používat:
    # swapon /swapfile1
  5. dobré je si do /etc/fstab přidat záznam, který swap namountuje po startu systému:
    /swapfile1 swap swap defaults 0 0

Dál jsem si nainstaloval pěkný sledovací nástroj htop, který je přehlednější, než notoricky známý top a líp se ovládá. Swap začal pracovat (což se dá ověřit i pomocí free -m), ale objevil jsem jinou zajímavou věc. Na serveru běžel zapomenutý elasticsearch z nějakých pokusů. A protože je napsaný v jave, měl velké nároky na pamět. Protože už není potřeba, vypnul jsem ho a swap už není potřeba:).

Takže celé cvičení zakončím jednoduchým příkazem swapoff, který swap zase deaktivuje, chvíli na to budu koukat v htop, ale předpokládám, že vše už bude v pohodě.