Nedostatok RAM pamäte na virtuálnom serveri

 

Množstvo pamäte RAM má pravdepodobne najväčší dopad na výkon vášho virtuálneho servera (VPS) a na počet návštevníkov, ktorý dokáže obslúžiť. Nedostatok pamäte RAM sa môže prejaviť viacerými spôsobmi, najčastejšie však nestabilitou bežiacich služieb ako FTP alebo MySQL server, alebo dlhými načítacími časmi stránok.

 

Má moje VPS problém s nedostatkom RAM?


Aktuálny stav pamäte RAM je možné skontrolovať po prihlásení na SSH: užívateľsky prívetivé zobrazenie poskytuje program htop:

 

Screenshot from 2014-11-13 15:32:17.png

V tomto prípade má server obsadených 2847MB RAM z celkových 4096MB.

 

Možné príznaky nedostatku RAM


1. Načítanie stránok trvá omnoho dlhšie než obyčajne.

Zvýšená návštevnosť stránok na VPS môže mať za následok zvýšené pamäťové nároky. Pokiaľ VPS nedokáže držať všetky práve načítavané webstránky v RAM, začne používať tzv. virtuálnu pamäť (swap partíciu, obdoba stránkovacieho súboru Windows). Táto doplnková pamäť je však niekoľkonásobne pomalšia než RAM, a tak pri jej využití dochádza k drastickému zníženiu výkonu VPS.

 

Tomuto chovaniu môžeme zabrániť buď navýšením dostupnej pamäte RAM, alebo obmedzením množstva RAM, ktorú môže webserver spotrebovať.

 

Trochu matematiky

U každého načítania stránky sa na pozadí spustí PHP proces, ktorý zo zdrojových súborov vygeneruje výsledný HTML kód, ktorý môže odoslať prehliadaču. Počas behu tohto procesu spotrebuje PHP určité množstvo pamäte RAM, ktoré záleží na aplikácii - Wordpress v základnej instalácii vystačí s 48MB, kdežto Drupal s niekoľkými pozapínanými pluginmi si môže vyžiadat niekoľko stovák MB RAM. Toto množstvo sa násobí s každým ďalším návštevníkom stránky - pokiaľ si náš hypotetický Wordpress prezerajú naraz desiati návštevnící, spotrebujú spolu 10 x 48 = 480MB RAM.

 

Pokiaľ má naše VPS dostupných 512MB RAM, dokáže obslúžiť 10 návštevníkov, ale pri jedenástom sa mu minie dostupná RAM pamäť a začne swapovať na disk. Pre zachovanie optimálneho výkonu nám Apache webserver ponúka moznosť obmeziť počet návštevníkov (klientov) ktorých bude naraz obsluhovať. 

 

Návštevníci, ktorí prekročia tento limit pri pokuse o načítanie stránky dostanú okamžite chybovú hlášku. Toto môže znieť kontraproduktívne, avšak vo väčšine prípadov je ideálnejšie, pokiaľ server pracuje na plný výkon pre všetkých návštevníkov ktorých zvládne, než aby sa snažil obslúžiť všetkých a zasekol sa pri tom.

 

Limitujeme návštevníkov

Nastavenie, ktoré limituje počet súbežne bežiacich procesov sa nazýva MaxClients v Apache 2.2 (dodávaného s Ubuntu 12.04) a MaxRequestWorkers v Apache 2.4 (Ubuntu 14.04). Môžme ho upraviť v nasledovných konfiguračných súboroch:

 

Apache 2.2: /etc/apache2/apache2.conf:

 

<IfModule mpm_prefork_module>

    StartServers                5 

    MinSpareServers             5 

    MaxSpareServers             5

    MaxClients                  150

    ServerLimit                 150

    MaxRequestsPerChild         200 

</IfModule>

 

 

Apache 2.4: /etc/apache2/mods-enabled/mpm_prefork.conf

 

<IfModule mpm_prefork_module>

        StartServers             5

        MinSpareServers          5

        MaxSpareServers          10

        MaxRequestWorkers        150

        MaxConnectionsPerChild   0

</IfModule>

 

 

Aby webserver začal používať nové hodnoty, reštartujeme ho pomocou príkazu apache2ctl‌ restart.

 

2. Nemôžem sa pripojiť na FTP / stránky sa nevedia pripojiť na MySQL server.

K pádom náhodných služieb na virtuálnom serveri  môže tiež dôjsť kvôli nedostatku pamäte RAM. Operačný systém môže nedostatok pamäte vyhodnotiť ako problém brániaci v stabilnom behu serveru a ukončí tak procesy “s nízkou prioritou”, medzi ktoré patrí napríklad MySQL server alebo FTP server (proFTPd). Proces, ktorý sa o takéto recyklovanie systémových prostriedkov stará, je láskyplne nazývaný OOM (out-of-memory) killer.

 

Ako zistíme, že sme sa stali obeťou OOM killeru? Keď sa k VPS pripojíme cez SSH, môžeme skontrolovať niektoré systémové logy, v ktorých je jeho činnosť zaznamenávaná:

 

root@mojevps# dmesg | grep memory

[8274699.045685] Out of memory: Kill process 7793 (mysqld) score 579 or sacrifice child

 

root@mojevps# grep memory /var/log/syslog

Nov 11 14:57:01 mojevps kernel: [8274699.045685] Out of memory: Kill process 7793 (mysqld) score 579 or sacrifice child

 

Podľa uvedených záznamov bol kvôli nedostatku pamäte “zabitý” MySQL server.

 

Opätovné naštartovanie služieb

 

Služby, ktoré boli takto “zabité” je možné naštartovať dvoma spôsobmi. Pokial sme na serveri prihlásení cez SSH, služby môžme naštartovať pomocou:

 

/etc/init.d/mysql start # (v prípade pádu MySQL serveru)

/etc/init.d/proftpd start # (v prípade pádu FTP serveru)

 

Alternatívne môžme cez Webadmin reštartovať celé VPS, čo tiež spojazdní nefunkčné služby.

 

Navýšenie parametrov VPS


V prípade, že sa VPS rozhodlo spustiť OOM-killer, okrem pamäte RAM sa mu minula aj “virtuálna” pamäť (stránkovacia partícia, obdoba stránkovacieho súboru Windows).

Virtuálne servery VPS sú štandardne vytvárané so swap partíciou o veľkosti 1GB. Pokiaľ operačný systém spustil OOM killer, je vhodné pamäť RAM navýšiť minimálne o tento 1GB.

 

O navýšení parametrov VPS sa dozviete viac tu.