Optymalizacja wykorzystania pamięci Apache

11

Apache zużywa zbyt dużo pamięci serwera, co powoduje awarię. Mam 4 GB pamięci RAM na serwerze.

Próbuję dostroić ustawienia Apache, aby poprawić jego wydajność, ale jestem w tym całkiem nowy.

Starałem się postępować zgodnie z radą tego artykułu, ale nie jestem pewien, jak to obliczyć, i wydaje mi się, że to pogarsza.

Mój top brzmi:

11697 apache    15   0  322m  37m 4048 S  0.0  0.9   0:00.52 httpd
13602 apache    15   0  323m  37m 3944 S  0.0  0.9   0:00.50 httpd
11786 apache    15   0  322m  36m 4052 S  0.0  0.9   0:00.50 httpd
12525 apache    15   0  322m  36m 4040 S  0.0  0.9   0:00.63 httpd
11806 apache    15   0  322m  36m 3952 S  0.0  0.9   0:00.42 httpd
11731 apache    15   0  322m  36m 4036 S  0.0  0.9   0:00.46 httpd
11717 apache    16   0  322m  36m 3956 S  0.0  0.9   0:00.54 httpd
11659 apache    15   0  322m  36m 3980 S  0.0  0.9   0:00.49 httpd

Tak byłoby

MaxClients = 3000/ (322-37) = 10

Czy to prawda? Jakie powinny być również wartości dla innych parametrów, takich jak MinSpareServers, MaxSpareServers, MaxRequestsPerChild, StartServers, MinSpareThreads, MaxSpareThreads, ThreadsPerChild, MaxRequestsPerChild?

Czy ktoś mógłby mi pomóc?

Aktualizacja

Próbowałem tego, co zasugerowaliście. Działa, ale tylko przez chwilę. Po pewnym czasie od uruchomienia serwera zużycie pamięci stale rośnie i nigdy nie spada.

Mam na myśli, że po uruchomieniu serwera załóżmy, że jest 500 użytkowników online. Serwer zużywa X RAM. Dwie godziny później, przy tych samych 500 użytkownikach online, serwer zużyje 10X pamięci RAM.

Czy istnieje sposób, aby tego uniknąć, czy będę musiał od czasu do czasu obserwować serwer i ponownie go uruchamiać?

Souljacker
źródło
1
dodając aktualizacje do pytania, edytuj oryginał zamiast publikować odpowiedź. Ma to również dodatkową zaletę polegającą na ponownym umieszczeniu pytania na górze pierwszej strony.
Ben Pilbrow

Odpowiedzi:

14

Głównym parametrem dostrajania wykorzystania pamięci Apache będzie MaxClients. Zbyt niska wartość i zabraknie dostępnych miejsc do obsługi żądań klientów. Za dużo, a zużyjesz całą pamięć RAM i zaczniesz używać przestrzeni wymiany, która zabije wydajność (może się to wydawać awarią serwera).

Jednym ze sposobów dostrajania MaxClientsjest obserwowanie zużycia pamięci przez system i dostrajanie ustawień w górę / w dół w razie potrzeby. Jeśli serwer zacznie się zamieniać, edytuj go. Jeśli serwer ma wolną pamięć, ustaw ją.

Możesz także oszacować maksymalną wartość, patrząc na użycie pamięci przez Apache. Uruchom topi naciśnij, Maby posortować procesy według pamięci. Powinieneś zobaczyć coś takiego:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
18698 apache    17   0  141m  59m  41m S  0.0  1.6   4:57.46 httpd
18591 apache    17   0  141m  59m  41m S  0.0  1.5   4:54.79 httpd
22917 apache    16   0  141m  57m  39m S  0.0  1.5   4:57.44 httpd
18595 apache    16   0  142m  57m  38m S  0.0  1.5   5:23.43 httpd
18697 apache    16   0  139m  56m  41m S  0.0  1.5   5:09.29 httpd
18735 apache    25   0  141m  56m  38m S  0.0  1.5   5:05.32 httpd

Odejmij kolumny RES i SHR, aby uzyskać przybliżone użycie pamięci na instancję Apache. W tym przypadku jest to około 16 MB. Jeśli mam 4 GB pamięci RAM i chcę, aby 3 GB z niej było używane w Apache, moje ustawienie MaxClients będzie około:

MaxClients = 3000/16 = 188

Tak więc w tym przypadku mógłbym zacząć od wartości 150-200, ale obserwowałbym użycie pamięci i gdyby kiedykolwiek zaczęło się zbliżać do korzystania z zamiany, zmniejszyłbym MaxClients o 10-20%. Należy również pamiętać, że wartość 3 GB jest tylko przypadkowym przykładem. Na serwerach tylko z uruchomionym Apache mogę być w stanie użyć prawie wszystkich 4 GB. W innych przypadkach mogę chcieć tylko 1 lub 2 GB dla Apache, aby zapisać pozostałe dla innych aplikacji, systemu lub pamięci podręcznej.

Edycja: odpowiadanie na dodatkowe pytania

Na ogół nie ma magicznych wartości MaxClients ani innych parametrów konfiguracyjnych Apache, które spowodowałyby, że twój serwer nagle dwa razy szybciej. Wygląda na to, że niektóre serwery działają poprawnie, niezależnie od tego, czy MaxClients ma 10, czy 1000. Istnieją dwa główne przypadki, w których ustawienie MaxClients jest „złe”:

  • Zbyt niska : gdy wartość MaxClients jest zbyt niska, dojdziesz do sytuacji, w której wszyscy klienci Apache są wykorzystywani, a nowe połączenia trafiają do kolejki, czekając na dostępność kolejnego klienta. Jeśli włączysz mod_status Apache, możesz zobaczyć w czasie rzeczywistym, ilu klientów jest zajętych w danym momencie. Ten stan jest stosunkowo łatwy do zdiagnozowania, ponieważ witryna stanie się wolna w czasie dużego ruchu, a wszyscy klienci będą w użyciu.
  • Zbyt wysoka : gdy MaxClients jest zbyt wysoka, przejdziesz do przypadku wyczerpania całej pamięci RAM i zaczniesz używać wymiany. Gdy to nastąpi, wydajność Twojej witryny spadnie do zera (rozważ różnicę prędkości między pamięcią RAM a dyskiem). Ten stan może być znacznie trudniejszy do zaobserwowania i zdiagnozowania, ponieważ serwer będzie działał dobrze z wysokimi MaxClientami, dopóki nie wystąpi gwałtowny wzrost ruchu. Na przykład w witrynie, która otrzymuje kilka odwiedzin na godzinę, mogę ustawić MaxClients na 1000, znacznie więcej niż obsługiwana przez RAM, ale nigdy nie widziałem problemu, ponieważ Apache musiał używać tylko jednego lub dwóch klientów na raz. Wykryję problem tylko wtedy, gdy dostanę gwałtownego wzrostu ruchu, zwiększając liczbę klientów używanych jednocześnie, aż do wyczerpania pamięci RAM i potrzebnej przestrzeni wymiany.

Chociaż nie znam szczegółów twojego serwera, aplikacji ani ruchu, mogę zaproponować następujące wartości konfiguracji jako punkt wyjścia. Wypróbuj je, monitoruj obciążenie i użycie serwera oraz zmieniaj ustawienia w razie potrzeby.

  • mod_status : Włącz to, abyś mógł zobaczyć użycie Apache. Aby uzyskać bardziej zaawansowane statystyki, zainstaluj aplikację monitorującą, taką jak Zabbix / Nagios, abyś mógł śledzić użycie serwera i wzorce ruchu.
  • MaxClients : Ustaw na wartość 100-200. Zaczynam od niższej wartości, jeśli nie jestem pewien i monitoruję użycie pamięci / procesora / Apache. Będzie to główny parametr do poprawiania.
  • MaxRequestsPerChild : Określa, kiedy klient / dziecko Apache zostanie zrestartowany. Nie ma złej wartości (chociaż bardzo małe wartości mogą być nieefektywne) i będzie to zależeć od treści, które udostępniasz. W przypadku treści dynamicznych duża wartość niezerowa (powiedzmy 1000) powstrzyma procesy httpd przed zbyt dużym powiększeniem.
  • Inne parametry : Chociaż nie przeprowadziłem dokładnej analizy pozostałych parametrów, powinny one mieć stosunkowo niewielki wpływ, chyba że ustawisz je na bardzo niskie lub bardzo wysokie wartości. Korzystanie z ustawień domyślnych powinno być odpowiednie dla większości witryn. Zobacz dokumentację modułu Apache Prefork lub Worker , aby uzyskać pełny opis parametrów, który jest używany w każdym module (nie ma sensu próbować dostroić parametr, którego nie używasz).
  • Benchmarking : Kiedy dostosowujesz parametry, zaleciłbym użycie narzędzia do testów porównawczych, takiego jak ab (ApacheBench) lub oblężenie, aby uzyskać liczbę ilościową na możliwościach twojego serwera. Poleganie wyłącznie na odczuciu lub gorzej, sprawdzanie, czy ulega awarii, czy nie, nie jest dobrą metodą dostrajania parametrów serwera WWW.
uesp
źródło
Nazwa MaxClients została zmieniona na MaxRequestWorkers od Apache 2.4.
jastram