18.12.2020 - Kamil Valenta
Asi před 2 lety jsme na serverech udržovali weby zákazníků, každý v jiném prostředí. Díky mod_ITK každá doména běžela pod samostatným uživatelem v systému a byla tak dokonale izolovaná od ostatních domén.
Komplikace nastala ve chvíli, kdy jsme přešli na HTTP2 a multi-processing PHP. Modul ITK začal být v kolizi a bylo nutné jej opustit, což nakonec až tak nevadilo, protože Flexum neposkytuje hosting pro "cizí" projekty - držíme zázemí jen pro vlastní systémy, u kterých nám nevadí, že běží pod jedním uživatelem.
PHP nám na serverech tedy běží pod FastCGI Process Manager, s Apachem je multiprocesingově spojeno Eventem (protože Pre-fork je dost nenasytný s pamětí a tu jsme na vytížených serverech potřebovali optimalizovat).
Nedávno jsme pro BEA Channel spustili nový server, na kterém vysílají live streamy a odbavují archivy webinářů. Specifikem zde bylo, že zátež není moc rozprostřena v rámci dne, ale dosahuje velkých špiček (všichni návštěvníci se připojí +- 5 min před začátkem streamu). Server byl dimenzován na 6.000 přístupů.
Abychom měli srovnání, udělali jsme si zátěžový test ve výchozí konfiguraci:
ab -n 5000 -c 1000 https://localhost
Některé požadavky se začaly řadit do fronty, přestože v RAMkách a na jádrech byla ve výkonu rezerva. A tím i zbytečně rostl response time. Řešením je optimalizovat počet paralelních požadavků, což se dá udělat v /etc/apache2/mods-enabled/mpm-event.conf
Otázkou je, jaké počty zde nastavit, aby se prostředky serveru nevyčerpaly a server sám nešel k zemi?
Nejprve potřebujeme zjistit, kolik si v průměru z paměti vezme jeden Apache proces a kolik jeden PHP proces. Možností je více, nejrychlejší bude asi tato pythonová utilitka: https://raw.githubusercontent.com/pixelb/ps_mem/master/ps_mem.py
apache_proces = obsazená_paměť_apachem / počet_apache_procesů
php_proces = obsazená_paměť_php / počet_php_procesů
Osobně raději zaokrouhluji nahoru, ať vznikají rezervy.
Výpočet direktiv do mpm-event.conf:
MaxRequestWorkers = (velikost_RAM - 15%_rezerva) / apache_proces
maxclients = (velikost_RAM - 15%_rezerva) / php_proces
Výpočet direktiv do /etc/php/7.2/fpm/pool.d/www.conf:
pm.max_children maxclients
pm.start_servers počet_jader * 4
pm.min_spare_servers počet_jader * 2
pm.max_spare_servers počet_jader * 4
Na závěr už jen vše restartovat:
service apache2 restart
service php7.2-fpm restart
Response time se na serveru zkrátil o 30 %.
Řešíte optimalizace na svém serveru? Jaké? Podělte se v komentáři!