MaxClients w apache. Jak poznać wielkość mojego procesu?

9

From http://httpd.apache.org/docs/2.2/misc/perf-tuning.html

Największym problemem sprzętowym wpływającym na wydajność serwera WWW jest pamięć RAM. Serwer sieciowy nigdy nie powinien wymieniać, ponieważ zamiana zwiększa opóźnienie każdego żądania poza punkt, który użytkownicy uważają za „wystarczająco szybki”. To powoduje, że użytkownicy uderzają w stop i przeładowują, co jeszcze bardziej zwiększa obciążenie. Możesz i powinieneś kontrolować ustawienie MaxClients, aby twój serwer nie spawnował tak wielu dzieci, które zaczną zamieniać. Ta procedura jest prosta: określ rozmiar średniego procesu Apache, przeglądając listę procesów za pomocą narzędzia takiego jak top, i podziel go na całkowitą dostępną pamięć, pozostawiając miejsce dla innych procesów.

Głównym problemem jest to, że nie rozumiem, jak poznać rozmiar, ponieważ, no cóż, mam rozmiar httpd na nie więcej niż 3888

Ale jeśli musimy ustalić liczbę dla MaxClients, a ja mam 4 GB pamięci RAM, to otrzymuję: 972, więc powinienem użyć około 900 w MaxClients?

Larry
źródło
4
„mam rozmiar httpd nie więcej niż 3888” - myślę, że mówię w imieniu wszystkich, kiedy mówię „HUH?”
womble

Odpowiedzi:

9

Najpierw określ PID jednego z procesów Apache.

Następnie możesz zrobić coś takiego:

cat /proc/PIDHERE/status | grep VmRSS

Spowoduje to (bieżący) rozmiar zestawu rezydentnego tego konkretnego procesu, podobny do:

VmRSS: 304456 kB

Ta wartość brzmi, jak się wydaje, jest to wielkość procesu rezydującego w pamięci RAM.

Następnie znormalizuj swoją jednostkę miary ( 4GB * 1024 * 1024 = 4,194,304 KB). Podzielić:

4194304 KB / 304456 KB = 13.77 processes

Weź pod uwagę, że prawdopodobnie w twoim systemie działają inne procesy, które również zajmują pamięć, i idealnie chcesz zminimalizować zamianę, dlatego prawdopodobnie nie chcesz skonfigurować 13 serwerów Apache MaxClients (używając moich numerów), chcesz trochę mniej (według własnego uznania) ).

To jest przybliżony szacunek; rozmiar procesów Apache może z czasem rosnąć w zależności od obciążenia.

loopforever
źródło
1
Chociaż RSS nie obejmuje stron współużytkowanych, obejmuje strony oznaczone jako kopiowanie przy zapisie - tzn. Na komputerze jest miejsce na więcej procesów niż (suma rss) / (pamięć fizyczna). Zobacz także moją odpowiedź gdzie indziej - wolne miejsce jest niezbędne dla dobrej wydajności.
symcbean
4

Przewidywanie maxClients na podstawie scenariuszy testowych jest punktem wyjścia - ale aby właściwie rozwiązać problem, musisz zacząć mierzyć, jak Twoja aplikacja zachowuje się przy rzeczywistym ruchu.

Zakładając, że twój apache działa przed rozwidleniem ...

Skonfiguruj zadanie cron, aby policzyć liczbę procesów httpd i wynik „wolny”. Zauważ, że jeśli twój serwer wyświetla jakąkolwiek zawartość z plików lokalnych (aw wielu przypadkach, nawet jeśli nie jest), ilość pamięci dostępnej dla bufora / buforów będzie miała duży wpływ na wydajność. tzn. jeśli dojdziesz do punktu wymiany, Twoja wydajność internetowa jest prawdopodobnie okropna!

Po uzyskaniu danych wykreśl je na wykresie i wykonaj regresję metodą najmniejszych kwadratów - ekstrapoluj, aby znaleźć liczbę klientów, przy których osiągniesz docelowy limit wykorzystania pamięci httpd. Punktem wyjścia dla celu pamięci byłby mniejszy 80% pamięci fizycznej / 80% wielkości zawartości.

(zwróć uwagę, że MinSpareServers ma bardzo wysoką wartość, wyniki mogą być niedokładne)

#!/bin/bash

LOGFILE='/var/log/httpd/memusage'
PIDS = `ps -ef | grep httpd | grep -v grep | wc -l`
MEM = `free | grep 'buffers/cache'`
DAY = `date '%Y-%m-%d %H:%M:%S'`
echo ${DAY} ${PIDS} ${MEM} >>LOGFILE

W idealnym świecie mierzyłbyś również czas odpowiedzi adresu URL w tym samym pliku dziennika - ale jest to o wiele bardziej skomplikowane.

symcbean
źródło
Dla mnie bufory / pamięć podręczna zmieniają się bardzo mało, niezależnie od tego, czy działa 11 klientów, czy serwer osiągnął 86 lub 151 klientów (a serwer się zawiesił). Czego oczekujesz od swojej zmiennej MEM? Dostaję dwie liczby, więc zastanawiam się, czy Ubuntu 12.04 daje coś innego niż się spodziewałeś.
PeterB
Spróbuj uruchomić „za darmo”, a zobaczysz, czego oczekuję (2 liczby). Jeśli to prawda, że ​​liczby te różnią się nieznacznie przy różnej liczbie procesów, oznacza to, że albo używasz serwera opartego na zdarzeniach, albo masz ustawienie maxspareservers. Jeśli zamieściłeś próbkę danych wyjściowych i odpowiednich części httpd.conf, to może mielibyśmy lepszy obraz?
symcbean 30.03.13
.... i „katastrofa”? Co za awaria?
symcbean 30.03.13
Niestety, zobacz pastebin.com/aHZCagVn, aby uzyskać informacje na temat ustawień httpd.conf i przykładowych wyników. Przez „awarię” mam na myśli zbyt wielu klientów, serwerowi brakuje pamięci i blokuje się. Więcej informacji można znaleźć na pastebin.com/fnXzBfQL .
PeterB
1
@PeterB wydaje się bardziej prawdopodobne, że przyczyną problemu jest MySQLd. Gdy zabójca OOM jądra włączy się, zabija najpierw najgorszych przestępców na podstawie wartości / proc / PID / oom_score_adj. Jak wynika z twoich wyników, mysqld poszedł pierwszy. Konieczne może być dostosowanie ustawień w pliku my.cnf w celu lepszego dopasowania do ograniczeń maszyny wirtualnej. Aby obejść / tymczasowe / obejście, aby sprawdzić, czy można uniknąć kopania zabójcy OOM, spróbuj dodać plik wymiany dla dodatkowej pamięci wirtualnej; pozbądź się go, gdy zidentyfikujesz swój prawdziwy problem.
loopforever