użycie pamięci httpd

13

Masz problemy z użyciem pamięci httpd( Apache/2.2.29).

Z biegiem czasu zużycie pamięci w httpdprocesach wzrasta, aż ostatecznie osiąga 100%.

Ostatnim razem wznowiłem pracę httpdokoło 24 godzin temu. Dane wyjściowe free -mto:

[ec2-user@www ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1655       1415        239          0        202        424
-/+ buffers/cache:        788        866
Swap:         1023          4       1019

Aby udowodnić, że to zdecydowanie httpd, ponownie uruchomiłem httpdi uruchomiłem free -mponownie:

[ec2-user@www ~]$ sudo service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
[ec2-user@www ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1655        760        894          0        202        360
-/+ buffers/cache:        197       1457
Swap:         1023          4       1019

Ponowne uruchomienie Apache zabiera wolną pamięć z 239 Mb do 894 Mb - co wydaje się dużym skokiem.

Przeglądałem listę aktualnie włączonych modułów Apache (jest ich całkiem sporo) i wyłączono / usunąłem ( mod_wsgii mod_perlżaden z nich nie jest wymagany dla tego serwera, na którym działa aplikacja webowa oparta na PHP - w szczególności Magento).

Na podstawie https://servercheck.in/blog/3-small-tweaks-make-apache-fly , uruchomiłem ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}'i otrzymałem następujące dane wyjściowe:

[root@www ~]# ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}' 15.1328 MB 118.09 MB 127.449 MB 129.059 MB 117.734 MB 113.824 MB 125.062 MB 123.922 MB 119.855 MB 108.066 MB 136.23 MB 114.031 MB 113.27 MB 110.695 MB 102.113 MB 113.234 MB 186.816 MB 118.602 MB 0.835938 MB

Uruchomienie innego sugerowanego narzędzia diagnostycznego, dla MaxClientsktórego ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'zwraca następujące informacje:

[root@www ~]# ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'
110.212 MB

Ten serwer ( m1.smallinstancja Amazon AWS ) ma 1.7 Gbpamięć RAM. Więc dlatego:

Wszelkie dalsze wskazówki / sugestie, jak najlepiej dostosować httpdustawienia lub jak zdiagnozować, co dokładnie może być przyczyną tego?

James Spittal
źródło
Zauważ, że aby sprawdzić wykorzystanie pamięci przez procesy, musisz spojrzeć na -/+ buffers/cachelinię; jednak w tym przypadku zmiana jest porównywalna. W zależności od tego, jak apache został dostrojony, może rozpocząć się od kilku procesów gotowych do obsługi żądań; po okresie wielu jednoczesnych żądań prawdopodobnie rozwinie się więcej procesów do obsługi obciążenia. Można także dostosować liczbę bezczynnych procesów. Więc jeśli apache rośnie, aby zużywać zbyt dużo pamięci, musisz dokonać strojenia.
wurtel
Nie mam nic przeciwko konfiguracji serwera Apache, ale w przeszłości nie robiłem wiele, jeśli chodzi o dostrajanie wydajności Apache. Jakieś sugestie na które dyrektywy powinienem patrzeć lub jakie wskazówki? Czy istnieje ustawienie konfiguracji, które mogę włączyć, aby nakazać Apache zabić rozwidlone procesy po pewnym czasie? (Wygląda na to, że Apache z jakiegoś powodu nie robi tego domyślnie.)
James Spittal
To jest właśnie powód, dla którego przeprowadziłem się z Apache ... spróbuj Nginx, a nawet Lighttpd.
Ciekawy. Słyszałem o czymś dobrym, nginxwięc może czas spróbować, ale szczerze mówiąc, używam Apache od lat i nigdy nie miałem większych problemów. Magento naprawdę przeżuwa pamięć.
James Spittal
1
Zauważ, że twój skrypt do obliczenia średniego zużycia pamięci obejmuje niskie zużycie pamięci przez grep httpd-process (przynajmniej dla mnie). Aby to naprawić, ps aux | grep 'httpd' | grep -v grep | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'
zaleciłbym

Odpowiedzi:

12

Oto, co zrobiłem, aby go „rozwiązać”:

  1. Zestaw MaxClients 7(na podstawie (1740.8Mb Memory on server - 900Mb for MySQL + other stuff) / 111Mb average usage per httpd process = 7.5747747747747747747747747747748)

W związku z tym:

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients         7
MaxRequestsPerChild  4000
</IfModule>
  1. Wyłączyć wszystkie moduły Apache wyjątkiem authz_host_module, log_config_module, expires_module, deflate_module, setenvif_module, mime_module, autoindex_module, negotiation_module, dir_module, alias_module, rewrite_module,php5_module

  2. Usuń mod_sslpakiet, ponieważ klient w https://ogóle nie korzysta .

Poinformuję cię, gdy ta nowa konfiguracja zacznie działać, aby zobaczyć, czy to rozwiąże problem.

Pewna inspiracja tutaj została zapożyczona z: http://www.activoinc.com/blog/2009/08/31/performance-optimized-httpd-conf-for-magento-ecommerce/ i http://www.activoinc.com/ pliki do pobrania / httpd.conf-magento

James Spittal
źródło
Powyższa konfiguracja zdecydowanie pomogła ogromnie.
James Spittal
1
Kilka dni później problemy z wyciekiem pamięci httpdwydają się zniknąć całkowicie.
James Spittal
2

Obawiam się, że opcja MaxRequestsPerChild pomogła w twoim przypadku, ponieważ umożliwia recykling procesów po określonej liczbie żądań, więc wyciek pamięci jest, ale już nie jest widoczny.

Dodatkowo: MaxClients = ServerLimit * ThreadsPerChild

W twoim przypadku, jeśli potrzebujesz tylko 7 równoczesnych użytkowników (MaxClients = 7), wystarczy 2 procesy (na wypadek, gdyby nie udało się zminimalizować przestojów), więc konfiguracja może być:

<IfModule prefork.c>
StartServers       2
MinSpareServers    2
MaxSpareServers   20
ServerLimit        2
MaxClients         8
ThreadsPerChild    4
MaxRequestsPerChild  4000
</IfModule>

Korzystam z MaxClients 8 , tylko po to, aby uzyskać bardziej równomierny rozkład żądań między 2 procesami.

Igor Lewkow
źródło