Optymalne wartości dla ServerLimit, MaxClients, MaxRequestsPerChild

29

Prowadzę witrynę intensywnie odwiedzającą wiele dynamicznych treści, głównie generowanych przez użytkowników.

Serwer jest dedykowany i ma w sumie 4 procesory Intel (R) Xeon (R) X3210 @ 2.13GHz. Muszę wiedzieć, jakie są optymalne wartości dyrektyw apache ServerLimit i MaxClients, biorąc pod uwagę, że serwer ma 4 GB pamięci RAM, a baza danych MySQL działa na osobnym serwerze. Panel to DirectAdmin z CentOS.

Poniżej znajdują się moje aktualne dyrektywy, ale w godzinach szczytu z udziałem ponad 5 000 użytkowników zauważone jest ważne opóźnienie - i to nie w całości wina MySQL, ponieważ strony wydają się być generowane szybko (zaimplementowałem licznik czasu generowania strony), ale jest długi opóźnienie połączenia do momentu, gdy strona zacznie odpowiadać i zostanie wysłana do przeglądarki.

<IfModule prefork.c>
    StartServers     800
    MinSpareServers   20
    MaxSpareServers   60
    ServerLimit      900
    MaxClients       900
    MaxRequestsPerChild  2000
</IfModule>
Timeout 90
KeepAlive On
KeepAliveTimeout 5

Powinienem wspomnieć, że monitorowanie serwera za pomocą najwyższego polecenia, użycie procesora nigdy nie przekracza 20% ~ 30% w godzinach szczytu. Serwer MySQL ma w tym czasie również 30 ~ 50% użycia i ciągle pracuję nad naprawą powolnych zapytań, ale to inny problem. Wiem, że to nie jest wąskie gardło DB, ponieważ strony statyczne również ładują się w godzinach szczytu.

Dziękujemy za wszelkie wskazówki dotyczące optymalizacji tych wartości.

andreszs
źródło

Odpowiedzi:

24

Twoi klienci MaxClients są o WAY WAY WAY zbyt wysoko. Jaki jest obecny rozmiar twojego procesu apache? Pomnóż to x 900. Czy to więcej niż 4 GB? Jeśli tak, maszyna prawdopodobnie zamienia się. Zwykle zaczynam od MaxClients = 2x vCPU w pudełku (grep -c Processor / proc / cpuinfo). Co w tym przypadku wynosi około 8. Następnie upewnij się, że rozmiar procesu MaxClients x apache nie przekracza 4 GB.

Stamtąd możesz zwiększyć liczbę swoich klientów MaxClients, w zależności od rodzaju połączenia, jakie mają Twoi klienci. (Użytkownicy korzystający z połączeń modemowych muszą mieć dostęp do łyżki itp.) Ale upewnij się, że nigdy nie znajdziesz się w sytuacji wymiany.

Następnie ustaw serwery Min, Max i Start na MaxClients. Nie ma potrzeby, aby różniły się one w środowisku serwerów dedykowanych.

Następnie zrób kilka testów z ab (jak gęsie notatki).

toppledwagon
źródło
Z jakiegoś powodu wydaje się, że źle określiłem rozmiar procesu ... teraz w górnym poleceniu widzę, że procesy apache RESIDENT SIZE mają zakres od 10 do 15 MB. Czytałem gdzieś, że ponieważ biblioteki dzielone są zawarte w tym numerze, „rzeczywisty” rozmiar jest o połowę mniejszy. Biorąc to pod uwagę, powinienem obliczyć, że mogę pomieścić 570 procesów o wielkości 7 MB każdy, czy uważasz, że to prawda?
andreszs
Sugeruję, abyś użył 15 MB do obliczeń, a następnie zacznij sprawdzać metryki: # proces http vs. użycie pamięci. To da ci lepszy pomysł na liczbę MaxClients
hdanniel
1
Obniżyłem go do 400 i nawet przed godziną szczytu wynik miał efekt odwrotny niż pożądany: każda wartość niższa niż oryginał powoduje przekroczenie limitu czasu i duże opóźnienia. W rzeczywistości teraz zwiększyłem go do 1500 klientów, a zużycie pamięci wynosi teraz 3 GB, podczas gdy średnie użycie procesora wynosi 8%. Oczywiście na serwerze SQL jest teraz więcej obciążeń i będę musiał nad tym popracować.
andreszs
Oto moje polecenie htop, proces apache 1500 i prawie 100 procesów systemowych. To przy 75% wykorzystania pamięci RAM. a.imagehost.org/0011/htop.png Czy powinieneś ponownie rozważyć swoją formułę? ;)
andreszs
1
Dlatego musisz przeprowadzić testy we własnym środowisku. Przed apache'ami mamy akceleratory http, więc nie są użytkownikami mobilnymi. Twoja aplikacja wydaje się również bardzo lekka. Jeśli przeniosłeś obciążenie do swojej bazy danych, która mówi mi, że więcej z tych procesów Apache faktycznie obsługuje dane zamiast siedzieć i czekać na połączenie mysql. Co powoduje, że pytam, ile połączeń zezwalasz na swoją bazę danych? Czy ta liczba przekracza liczbę klientów MaxClients? Czy masz 5000 jednoczesnych połączeń? Jeśli tak, możesz zajrzeć do czegoś takiego jak perlbal z przodu.
toppledwagon
5

Musisz uzyskać średni rozmiar procesu apache. Na podstawie tej liczby i całkowitego rozmiaru pamięci RAM można obliczyć dyrektywę MaxClients. Pamiętaj o tym: „Serwer nigdy nie powinien wymieniać” ( strojenie wydajności Apache )

Monitorowanie za pomocą top lub htop jest w porządku, ale potrzebujesz lepszego widoku wszystkich statystyk swoich serwerów (procesora, pamięci RAM, operacji we / wy dysku, żądań apache, wolnych zapytań mysql itp.) Za pomocą narzędzia do monitorowania, takiego jak zwoje lub munin, aby znaleźć możliwe wąskie gardła.

hdanniel
źródło
W tej chwili mam tylko polecenia top i htop i nie mogę zrozumieć wszystkich jego informacji. Jest to aktywność wczoraj w szczycie, wydaje się, że nie ma zamiany; proszę powiedz, jeśli się mylę: Zadania: łącznie 1043, 2 uruchomione, 1041 śpiące, 0 zatrzymane, 0 procesorów zombie: 13,8% nas, 1,8% sy, 0,0% ni, 82,1% id, 0,8% wa, 0,0% cześć, 1,5% si, 0,0% st Mem: 4138360k łącznie, 3961276k używane, 177084k wolne, 75016k bufory Zamiana: 2031608k ogółem, 1484k używane, 2030124k wolne, 1836600k buforowane
andreszs
Tak, twój serwer się nie zmienia. Wolę rzeczywiste wskaźniki, ale jeśli chcesz, możesz użyć narzędzia stresującego, takiego jak ab lub httperf, aby sprawdzić, ile Twój serwer może obsłużyć. W przypadku testów zadbaj o MaxClients i zacznij od niskiej liczby (na podstawie założenia 15 MB).
hdanniel
4

Polecam bawić się narzędziem do testowania wydajności abache. Możesz bawić się wartościami, aby dopasować je do natężenia ruchu i zobaczyć, jakie odpowiedzi otrzymujesz, jeśli chodzi o średni czas ładowania i tym podobne. W tym momencie możesz pobawić się ustawieniami, o których mówisz, aby je zoptymalizować. Powinieneś być w stanie z ab uzyskać kontrolę nad optymalną wydajnością dla każdej poprawki wydajności.

Mówienie o twoich ustawieniach nie byłoby rozsądne, ale musisz także wziąć pod uwagę pamięć RAM, ponieważ wygląda na to, że jesz dużo pamięci RAM przy tych ustawieniach. Chociaż to tylko spekulacje bez żadnych danych. htop zapewnia dobry wizualny odczyt twoich zasobów.

Również średnia wartość obciążenia może wiele powiedzieć. Wątpię, aby twoje użycie było znacznie wyższe niż całkowita liczba rdzeni z 20-30% procesora, ale jest to kolejny wskaźnik tego, jak ciężko działa twój serwer.

gęś
źródło
Problemem jest to, że nie mam wystarczającego doświadczenia w administrowaniu serwerami, więc zacznij bawić się ustawieniami i monitorować wyniki. Nigdy nie użyłem narzędzia ab, żeby być szczerym. Również zmiana wartości wymaga ponownego uruchomienia HTTDP, co powoduje niedogodności dla moich użytkowników, dlatego wolę tego unikać. Wyobraź sobie, że wysyłasz wiadomość do innego użytkownika, a po kliknięciu „Wyślij” pojawia się problem z połączeniem z serwerem. O zużyciu procesora zobacz informacje z mojego poprzedniego komentarza: nie przekracza 15% w godzinach szczytu. Myślę, że to całkiem do przyjęcia, biorąc pod uwagę, że wczoraj miałem 6000 użytkowników online.
andreszs
Cóż, zdecydowanie nie chciałbym, abyś robił to w środowisku produkcyjnym. Zalecam robienie tego przy najniższym czasie ruchu, jeśli testujesz inny serwer (z bardzo podobnym, jeśli nie identycznym sprzętem). ab jest dość łatwy w użyciu, ale zdecydowanie uważam, że toppledwagon dał dobrą instrukcję obliczania MaxClients. Gdy przestaniesz używać przestrzeni wymiany, zobaczysz wyraźną poprawę. sprawdź httpd.apache.org/docs/2.0/programs/ab.html i cyberciti.biz/tips/… pod kątem AB
gęś