Jak optimalizovat Apache pro větší zátěž

18.12.2020 - Kamil Valenta

Ohlédnutí do historie - Apache + mod_php

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-FPM & MPM-Event

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).

Množství paralelních požadavků

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?

Kalkulačku do ruky a jdeme na to!

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!

Komentáře k článku

Čtěte dále...