Tuning wydajności Apache

Z Thomas-Krenn-Wiki
Przejdź do nawigacji Przejdź do wyszukiwania
Uwaga: Prosimy zwrócić uwagę, że ten artykuł / kategoria nie jest już aktualizowana, gdyż odnosi się do starszych komponentów oprogramowania / sprzętu.
Ta strona jest nadal dostępna jedynie w celach informacyjnych.

Ograniczenia serwera

Parametr MaxClients określa ilość procesów apache i w ten sposób dopuszczalną ilość połączonych klientów (warunek: prefork MPM). Jeżeli jest wykorzystywany worker MPM to ograniczona jest ilość threads, które są dostępne dla klientów. Domyślnie maxclients w apache to 256, przy czym należy zwrócić uwagę, że ta wartość domyślnie w różnych dystrybucjach może mieć inną wartość.

Jeżeli wartość maxclients ma wynosić więcej niż 256 to parametr ServerLimit musi również zostać odpowiednio zwiększony.

Jeżeli wartość maxclients zostanie osiągnięta w czasie pracy to zostanie to odnotowane w apache error.log.

[Thu Dec 18 11:00:28 2008] [error] server reached MaxClients setting, consider raising the MaxClients setting

Procesy spare

Korzystając z prefork MPM przez parametr MinSpareServers może zostać ustalona min. ilość dostępnych niewykorzystywanych (=spare) procesów apache. Jak tylko pojawi się zapytanie to jeden z tych procesów może zostać wykorzystany, przez co zapytanie może szybciej zostać przetworzone, gdyż nie musi zostać utworzony nowy proces. Parametr MaxSpareServers określa maks. ilość dostępnych procesów spare, aby nie zajmować niepotrzebnie pamięci RAM. Domyślne wartości apache to MinSpareServers 5 i MaxSpareServers 10.

Korzystając z worker MPM może zostać analogicznie do tego odpowiednio ustalona ilość threads, przez MinSpareThreads i MaxSpareThreads. Dodatkowo istotnym jest parametr ThreadsPerChild, przez który określona może być ilość threads na proces apache.

Parametr StartServers określa ile procesów apache ma zostać utworzonych podczas uruchomienia serwera.

Dobór sprzętu

Istotnym dla ilości procesów serwera jest wielkość pamięci RAM serwera. Każdy proces wymaga określonej ilości pamięci RAM. Dlatego należy się nad tym zastanowić podczas optymalizacji powyżej wspomnianych wartości. Więcej pamięci RAM oznacza w Linuksie również większy Page Cache, co ogólnie przyśpiesza system, wiele zapytań I/O może otrzymać odpowiedz z RAM-u.

W każdym wypadku należy uniknąć, żeby serwer www "swapt", to znaczy potrzebował swap space na dysku HDD.

Oczyścić moduły

Im mniej modułów jest załadowanych w serwerze www tym mniejszy jest Memory Footprint procesów apache. Dlatego uzasadnionym jest wyłączenie wszystkich niepotrzebnych modułów.

Przegląd aktualnie załadowanych modułów można otrzymać następującym poleceniem:

root@testserver:/# apache2ctl -M
Loaded Modules:
 core_module (static)
 log_config_module (static)
 logio_module (static)
 mpm_prefork_module (static)
 http_module (static)
 so_module (static)
 alias_module (shared)
 auth_basic_module (shared)
 authn_file_module (shared)
 authz_default_module (shared)
 authz_groupfile_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 cgi_module (shared)
 dir_module (shared)
 env_module (shared)
 mime_module (shared)
 negotiation_module (shared)
 setenvif_module (shared)
 status_module (shared)
Syntax OK

Rozróżniane są przy tym statycznie skompilowane moduły ("statically compiled") i dynamicznie ładowane moduły ("Dynamic Shared Objects", DSO). W powyższym wyniku statyczne moduły są oznaczone przez "static" a dynamiczne przez "shared".

Statyczne moduły mogą zostać wyłączone, przez nową binarną kompilację apache. Jest to raczej odradzane, gdyż przez to każda dostępna aktualizacja bezpieczeństwa serwera apache musi zostać ponownie skompilowana.

Dynamiczne moduły mogą łatwo zostać wyłączone lub włączone. Może zostać to przeprowadzone bezpośrednio w konfiguracji apache (vide Parametr "LoadModule") lub często łatwiej za pomocą własnych narzędzi, które są dostarczone z daną dystrybucją Linuksa.

W Debianie/Ubuntu dostępne jest narzędzie a2enmod do włączenia i a2dismod do wyłączenia.

W CentOS/RHEL nie jest dostępne własne narzędzie do zarządzania modułami. Struktura jest tak podzielona, że moduły domyślne w /etc/httpd/conf/httpd.conf są ładowane i tam też mogą zostać odpowiednio wykomentowane. Jeżeli moduły są dodatkowo instalowane to z reguły są zapisywane w /etc/httpd/conf.d. Dla przykładu dla PHP dostępny jest plik /etc/httpd/conf.d/php.conf.

Zapytania DNS

Parametr HostnameLookups powinien być koniecznie ustawiony na "off", inaczej każde zapytanie DNS o nazwę dostarcza adres IP, co ma negatywny wpływ na wydajność. Domyślnie od Apache 1.3 parametr ten jest ustawiony jako "off". Zmiana nazwy powinna być natomiast realizowana przez aplikacje takie jak np. Awstats lub Webalizer.

Wyłączyć niepotrzebne funkcjonalności apache

Jeżeli np. parametr AllowOverride jest ustalony jako "All" to podczas każdego dostępu apache musi zostać skontrolowane czy istnieje plik .htaccess. Jeżeli funkcjonalność .htaccess nie jest wykorzystywana na stronie www to AllowOverride powinien być skonfigurowany jako "None". Jeżeli funkcjonalność potrzebna jest jedynie dla kilku katalogów to powinna ona tylko tam być dozwolona przez dyrektywę "<Directory>".

KeepAlive Requests

Funkcjonalność HTTP KeepAlive pozwala na realizacje kilku zapytań jednego klienta przez to samo połączenie TCP. Jest to domyślnie włączone i może być zarządzane przez parametr KeepAlive. Parametr KeepAliveTimeout określa jak długo proces ma czekać na kolejne zapytania. (Default: 5 sekund)

Kompresja HTTP

Protokół HTTP pozwala na kompresje treści po stronie serwera i następnie dekompresję po stronie klienta. To pozwala na zmniejszenie ruchu w sieci i przez to również odczuwalnie zwiększyć prędkość.

Umożliwia to moduł apache mod_deflate.

Przykładowa konfiguracja dla Apache 2.2, która dostarcza skompresowaną treść CSS i Javascript, może wyglądać następująco:

FilterDeclare gzipping CONTENT_SET
FilterProvider gzipping deflate Content-Type text/css
FilterProvider gzipping deflate Content-Type $javascript
FilterChain gzipping

Podział statycznej i dynamicznej treści

Jeżeli powyżej wymienione czynności nie przyniosą polepszenia to koniecznym może być podział treści na kilka serwerów. Popularnym przy tym jest, że jeden Frontend Server z niewieloma załadowanymi modułami i bez modułów o treści dynamicznej (jak np. PHP lub Perl) wykorzystywany jest dla statycznych danych (np. zdjęcia, CSS, Javascript). Procesy na tym serwerze mają wtedy minimalny memory footprint, co oznacza, że serwer może obsłużyć znacząco więcej równoczesnych połączeń. Dynamiczne treści są wtedy przetwarzane przez dalszy serwer (nazwijmy go "Dynamic Content Server"). To przekierowanie lub inaczej przekazanie od Frontend Server do Dynamic Content Server może zostać zrealizowane np. przez moduł mod_proxy.

Jeszcze łatwiej podział ten może zostać zrealizowany przez wykorzystanie własnej subdomeny dla statycznych danych. Wiele dużych stron www korzysta z tej zasady. Jeżeli spojrzymy na np. YouTube, często obraz pochodzi nie z www.youtube.com a z subdomeny ytimg.com.

Benchmark Apache

Serwer Apache zawiera benchmark o nazwie ab. Szczegółowe informacje na ten temat znajdują się na: http://httpd.apache.org/docs/2.2/programs/ab.html

Specjalny przypadek Parallels Virtuozzo

Jeżeli środowiskowo wirtualne (VPS, VE, Container) funkcjonuje pod Virtuozzo w wersji 3 to każda, dostarczona z daną dystrybucją, konfiguracja Apache jest automatycznie dostosowywana przez skrypt Virtuozzo "post-install".

To dostosowanie minimalizuje zapotrzebowanie środowiska wirtualnego na pamięć, co podczas stosowania bardzo wielu wirtualnych maszyn na pojedynczym serwerze może być bardzo istotne. Jednak w przypadku często odwiedzanych stron może szybko prowadzić do spadku wydajności.

Tutaj znajduje się wyciąg ze skryptu post-install dla Debiana 5.

/vz/template/debian/5.0/x86/config/os/default/post-install

...
# apache tuning
CFG_FILE=etc/apache2/apache2.conf
if [ -f $CFG_FILE ]; then
    sed -e "s/^[[:blank:]]*StartServers[[:blank:]]*.*/StartServers       1/" \
        -e "s/^[[:blank:]]*MinSpareServers[[:blank:]]*.*/MinSpareServers    1/" \
        -e "s/^[[:blank:]]*MaxSpareServers[[:blank:]]*.*/MaxSpareServers    5/" \
        -e "s/^[[:blank:]]*ServerLimit[[:blank:]]*.*/ServerLimit       10/" \
        -e "s/^[[:blank:]]*MaxClients[[:blank:]]*.*/MaxClients        10/" \
        -e "s/^[[:blank:]]*MinSpareThreads[[:blank:]]*.*/MinSpareThreads    1/" \
        -e "s/^[[:blank:]]*MaxSpareThreads[[:blank:]]*.*/MaxSpareThreads    4/" \
        $CFG_FILE > ${CFG_FILE}.$$ && \
                move_file ${CFG_FILE}.$$ $CFG_FILE > /dev/null 2>&1
fi
...

Dokładnie te wartości muszą zostać odpowiednio zwiększone, aby przygotować stronę na większą ilość gości. Przede wszystkim wartości MaxClients i ServerLimit muzą zostać koniecznie zastąpione wyższą liczbą niż 10. Inaczej możliwe będzie maks. 10 równoczesnych połączeń klientów z serwerem www. Rozsądnym jest również odpowiednie zwiększenie wartości dla StartServers, MinSpareServers i MinSpareThreads, aby dla nowych zapytań były już dostępne procesy Apache i nie musiały zostać dopiero utworzone.

Powyżej w artykule znajdują się sugestie dla odpowiedniej wartości.

Kolejnym powodem problemów z wydajnością mogą być ograniczenia zasobów w Virtuozzo. W wirtualnej maszynie znajduje się plik /proc/user_beancounters, w którym ostatnia kolumna "failcnt" zawiera licznik, który pokazuje jak często wystąpiły przekroczenia zasobów.

Przykładowy wyciąg.

/proc/user_beancounters

Version: 2.5                                                                                                                     
       uid  resource                     held              maxheld              barrier                limit              failcnt
      3007: kmemsize                  2483745              2546680             57490800             59160657                    0
            lockedpages                     0                    0                 1024                 1024                    0
            privvmpages                178824               178853               262144               278528                    0
            shmpages                       16                   16                86016                86016                    0
            dummy                           0                    0                    0                    0                    0
            numproc                        51                   52                  960                  960                    0
...

Informacje odnośnie konfiguracji zasobów znajdują się w [dokumentacji Virtuozzo].

Źródła

Powiązane artykuły

Aplikacja IOMeter
Instalacja Oracle Java JRE 6 lub SE 7 w Ubuntu
Losowe restarty serwerów z procesorami AMD EPYC