Obecnie mam serwer Apache2 działający z OpenVZ VPS mpm-preforki mod_phpna nim z 512 MB pamięci rzeczywistej / 1024 M pamięci RAM z możliwością pękania (bez wymiany). Po przeprowadzeniu niektórych testów stwierdziłem, że maksymalny rozmiar procesu, jaki otrzymuje Apache, to MaxClients23 MB, więc ustawiłem 25 (23 MB x 25 = 575 MB, ok dla mnie). Postanowiłem uruchomić testy obciążenia na moim serwerze, a wyniki mnie zaskoczyły.
Używam abna swoim komputerze stacjonarnym, aby poprosić o stronę główną z bloga Wordpress.
Kiedy uruchamiam abz 24 jednoczesnymi połączeniami, wszystko wydaje się w porządku. Jasne, procesor idzie w górę, wolna pamięć RAM spada, a wynik wynosi około 2-3s czasu odpowiedzi na żądanie.
Ale jeśli uruchomię abz 25 jednoczesnymi połączeniami (mój limit serwerów), Apache po prostu zawiesi się po kilku sekundach. Zaczyna przetwarzać żądania, potem przestaje odpowiadać, procesor wraca do 100% bezczynności i kończy się limit abczasu. Dziennik Apache mówi, że osiągnął MaxClients.
Gdy tak się dzieje, Apache blokuje się przy 25 uruchomionych procesach (wszystkie są w „W”, jeśli sprawdzę status serwera) i dopiero po TimeOutustawieniu procesy zaczynają umierać, a serwer zaczyna ponownie odpowiadać (w moim przypadku jest ustawiony do 45).
Moje pytanie: czy to oczekiwane zachowanie? Dlaczego Apache umiera, kiedy się osiąga MaxClients? Jeśli działa z 24 połączeniami, czy nie powinno współpracować z 25, wystarczy poświęcić więcej czasu na odpowiedź na każde żądanie i ustawić w kolejce resztę?
Brzmi trochę dziwnie dla mnie, że każde uruchomione dziecko abmoże samodzielnie zabić serwer sieciowy, ustawiając równoczesne połączenia z serwerami MaxClients.