Jak zmniejszyć zużycie pamięci na serwerze Unix

36

Obecnie używam Joyent Accelerator do hostowania moich aplikacji internetowych i działa dobrze, jednak muszę obniżyć koszty, więc obniżam obecny plan i to nakłada pewne nowe ograniczenia pamięci (256M rss, 512M zamiana). Nie byłem zbyt daleko od nich wczoraj, ale po kilkukrotnym ponownym uruchomieniu Apache dzisiaj jestem teraz 411M rss, 721M swap (prstat -Z -s cpu).

Wyszukiwanie w usłudze Server Fault daje mi tylko wiele sposobów i konkretnych narzędzi do monitorowania serwera, ale nie ma wskazówek, jak zmniejszyć / zoptymalizować wykorzystanie pamięci. Widziałem również to pytanie , ale nie sądzę, aby było dobre w tej konkretnej (a może mogę powiedzieć ogólnej?) Sytuacji.

Na serwerze działa Solaris na współużytkowanym procesorze, a ja używam stosu Apache + MySQL + PHP.

Interesuje mnie znajomość kroków, które można podjąć, aby rozwiązać ten problem i rozwiązać problemy. Jednak brakuje mi też czasu, aby obniżyć stopę pamięci i obniżyć plan przed końcem bieżącego roku, więc mile widziane jest wszystko, co może stworzyć magię i uratować dzień :)

Lima
źródło
1
Chciałem tylko skomentować, że chociaż sam nauczyłem się o tych ustawieniach od Google'a, okazało się, że zmieniam ustawienia w jednym pliku, ale inny plik konfiguracyjny, który był ładowany później, w rzeczywistości po cichu przesłania moje ustawienia! Kiedyś to odkryłem, ustawienie wstępnych ustawień MPM i kilka innych rzeczy działało cuda, aby kontrolować liczbę procesów i wykorzystanie pamięci pod kontrolą, zmieniając do minimum. Mam nadzieję, że te informacje pomogą innym, zwłaszcza tym, którzy używają Gentoo na swoich serwerach.
Pistos

Odpowiedzi:

23

Dziękujemy wszystkim za odpowiedzi! Zgodnie z twoimi sugestiami udało mi się zmniejszyć zużycie pamięci do 195M SWAP i 108M RSS, bez dotykania mojego kodu (na pewno wkrótce go zoptymalizuję, ale miało to być rozwiązanie, które pozwoli mi szybko wyjść z kłopotów).

Oto lista rzeczy, które zrobiłem:

Pozbyłem się symbolu wieloznacznego używanego we wpisach VirtualHost. Zamiast *: 80 i *: 443 użyłem prawdziwego adresu IP mojego serwera.

Zmieniono preforkę Apache MPM. Oto wartości, które wykorzystałem:

StartServers 1
MinSpareServers 1 
MaxSpareServers 5 
ServerLimit 16
MaxClients 16
MaxRequestsPerChild 0
ListenBacklog 100

Nie są to wcale magiczne liczby. Spędziłem trochę czasu próbując różnych wartości i kombinacji, a następnie testowałem je pod kątem rzeczywistego wykorzystania mojego serwera i każdy powinien zrobić to samo w swoim otoczeniu. Dla przypomnienia, mój serwer otrzymuje prawie 2 mln pvs / miesiąc, obsługując zarówno dynamiczne strony, jak i zasoby w regularnym tempie - bez efektu digg. Ponownie, celem było zmniejszenie zużycia pamięci, a nie poprawa wydajności lub wysokiej dostępności.

Odniesienie:

Strojenie KeepAlive Apache. Ustawiając KeepAliveTimeoutniższą wartość (w moim przypadku 2), mogę oczekiwać, że mniej procesów serwera czeka tylko na połączenia z bezczynnymi klientami, które mogą nie żądać więcej treści.

Odniesienie: http://httpd.apache.org/docs/2.0/mod/core.html#keepalivetimeout

Usunięto nieużywany moduł MySQL. Dodałem skip-innodbdo MySQL my.cnf. Ogromne zmniejszenie zużycia pamięci.


Jest też kilka niezwykłych dobrych sugestii, których osobiście nie mogłem zrobić:

  • Usuń moduły PHP, których nie potrzebujesz. PHP na moim serwerze ma już skompilowane większość modów, prawdopodobnie spróbuję własnego minimalnego PHP na innym VPS.
  • Przełącz się na nginx z php-fastcgi. To kolejna dobra rada, którą wkrótce wypróbuję, ale teraz nie mogę ryzykować przestoju.
Lima
źródło
Używam nginx i php-fastcgi (LEMP) i mam podobne problemy z pamięcią ... na serwerze 256 MB stwierdzam, że php-fastcgi działa dobrze z PHP_FCGI_CHILDREN = 5 i PHP_FCGI_MAX_REQUESTS = 333 ... te wartości są dobrym początkiem punkt!
farinspace
Got rid of the wildcard used in VirtualHost entriesczy to faktycznie pomaga w jakikolwiek znaczący sposób? Miałem wrażenie, że to nie ma znaczenia.
Mahn
@Mahn - nie pomaga z pamięcią, ale poprawia wykorzystanie procesora, co jest dobre w środowisku o niskiej pamięci
jsnfwlr
„Przełącz na nginx z php-fastcgi” --- Mniej drastyczną, ale skuteczną opcją, jeśli chcesz zachować Apache2, byłoby: Apache2 + mod_proxy_fcgi + mod_mpm_event. mpm_event jest podobny do nginx. Użyj tego, aby połączyć się z php-fpm. Zobacz dracony.org/stop-using-php-fpm-to-argue-using-nginx-vs-apache
James Johnston,
6

Znalazłem ten artykuł na temat konfiguracji małej pamięci dla Apache i MySQL

Aby być bardzo przydatnym w planowaniu zmian konfiguracji niezbędnych dla konfiguracji o małej pamięci. Ulepszyłem je dla mojej własnej sytuacji, ale powinny dać ci narzędzia potrzebne do znalezienia najlepszego dopasowania do twojego środowiska

Kevin Kuphal
źródło
link nie działa
użytkownik2682863,
4

Będziesz musiał ograniczyć liczbę uruchomionych procesów serwera Apache, a będąc tak blisko limitu, jak ty, nie będziesz w stanie obsłużyć bardzo dużego ruchu szczytowego. Posiadanie serwera WWW, który jest maksymalny przy normalnym użytkowaniu, jest na ogół złym pomysłem (tm), ponieważ ruch internetowy jest przyjemny i niski w przeważającej części, dopóki nie zostaniesz ukośny, wykopany, ognisty lub cokolwiek innego.

Główne problemy to liczba procesów apache, które są uruchomione w dowolnym punkcie - przy założeniu prefork tutaj, ponieważ wdrożyłem tylko aplikacje PHP, a PHP nie jest wątkowo bezpieczne. Nie mam doświadczenia w wymiarowaniu MPM pracownika. Niektóre elementy znajdują się w pamięci współdzielonej, a niektóre znajdują się w pamięci każdego procesu.

Możesz zmniejszyć całkowity rozmiar pamięci, pomijając współdzielone moduły, których nie potrzebujesz. Zasadniczo Apache jest skonfigurowany z większości hostów do robienia wszystkiego pod słońcem. Jeśli nie używasz mod_userdir, skomentuj go z konfiguracji apache. Uważaj tylko, ile usuwasz, ponieważ niektóre rzeczy, których możesz potrzebować lub ich zależności nie są intuicyjne! Wszystkie moduły powinny być udokumentowane na stronie apache.org. Ślad na proces jest trudniejszy do zmniejszenia; większość konfiguracji Apache obecnie tylko z czterema wbudowanymi modułami. Poza tymi czterema modułami większość wykorzystania pamięci pochodzi z wycieków lub pamięci RAM aplikacji, która nie jest skutecznie usuwana, dlatego możesz ustawić liczbę żądań obsługiwane przez każdy proces na niskim poziomie.

Ty naprawdę chcesz, aby utrzymać zużycie pamięci w samej pamięci RAM i nie iść do wymiany. Zamiana oznacza We / Wy. We / wy jest wolne i spowoduje, że procesor przejdzie przez dach, ponieważ procesy blokują się, czekając, aż coś zostanie wymieszane z wymiany.

Karl Katzke
źródło
1
Dzięki za radę, Karl! Czy istnieje sposób, aby uniemożliwić serwerowi zamianę? Ponieważ po zmniejszeniu zużycia pamięci nie mam już więcej pamięci RAM, ale nadal pokazuje, że użyto pamięci SWAP.
lima
@fandelost Tak naprawdę nie ma znaczenia, że ​​zamiana jest używana, to kiedy rzeczy są wczytywane i zamieniane, jest źle. Twój system operacyjny może wymieniać instrukcje lub dane z procesów, które nie są uruchamiane zbyt często, gdy jest na to czas, ponieważ uważa (i często ma rację), że lepiej jest tam te instrukcje i dane.
Patrick James McDougle,
2

W przypadku apache usuń moduły, których nie używasz, ponieważ po prostu używają dodatkowej pamięci. W przypadku MySQL usuń innodb / bbdb, jeśli ich nie używasz i usuń moduły PHP, których nie potrzebujesz.

Następnie powinieneś skonfigurować Apache MaxClients w oparciu o rozmiar jednego procesu i ilość pamięci, którą chcesz dać Apache. To samo dotyczy maksymalnych połączeń na MySQL (polecam doskonały skrypt Primer Tuning MySQL .

Jeśli masz kontrolę nad aplikacją PHP, upewnij się, że nie zużywa ona zbyt dużo pamięci (np. W zmiennych, szczególnie statycznych).

Jeśli chcesz pójść dalej, możesz zastąpić apache + mod_php konfiguracją nginx + fcgi, co prawdopodobnie spowoduje dalsze zmniejszenie pamięci.

Ostatnia rzecz - naprawdę nie chcesz zamieniać się na serwerze sieciowym. Tylko trochę, aby usunąć niepotrzebne rzeczy, ale regularna zamiana na serwerze WWW spowoduje, że witryna nie będzie odpowiadać.

yhager
źródło
Dziękuję za radę yhager, próbuję tuning-primer.sh, ale pojawia się następujący błąd: „błąd składni w wierszu 94:„ cnf_socket = $ 'nieoczekiwany ”. Jakieś pomysły?
lima
Może być powiązany z powłoką. Ponieważ ten skrypt jest prawdopodobnie związany z Linuksem, spróbuj zmienić pierwszą linię, aby wskazywała bash, zamiast / bin / sh. Mam nadzieję, że możesz zainstalować bash na Solarisie, ale nic na to nie poradzę ...
yhager
2

Ponieważ osiągnąłeś już swój cel, oto kilka dodatkowych:

Ponieważ usunąłeś wszystkie niepotrzebne moduły php, możesz zrobić to samo dla apache. Domyślnie (w zależności od instalacji) apache ładuje sporo dodatkowych modułów i większość z nich nie jest tak naprawdę wymagana do normalnego codziennego użytkowania. Na przykład istnieje kilka modułów uwierzytelniania, które są zawsze ładowane. deflacja zazwyczaj nie jest wymagana, chyba że próbujesz ograniczyć wykorzystanie przepustowości. Autoindeks i status idą również w wątpliwość.

Kolejnym jest to, że możesz ograniczyć ilość pamięci dostępnej dla php w php.ini: memory_limit = xxxM

rasjani
źródło
0

Możesz oczywiście ograniczyć liczbę procesów, które apache może rozwidlić, jednak działałoby to tylko jako bardzo trudny do wykorzystania limit pamięci. Z punktu widzenia niższego poziomu możesz użyć plimit, aby ograniczyć zasoby dostępne dla procesu. Zastosuj to do procesów nadrzędnych i podrzędnych, które moim zdaniem dziedziczą.

Jednak z punktu widzenia konfiguracji serwera WWW może sprowadzać się do tego, jak naprawdę działa Twój kod! Pamiętaj jednak, że drobne rzeczy, takie jak używanie plików .htaccess, zużywają więcej zasobów niż używanie plików konfiguracji centralnego apache (ponieważ są one odczytywane za każdym razem, gdy przychodzi żądanie, co prowadzi do większego obciążenia), co jest znaczeniem w dużych witrynach internetowych.

Coops
źródło
0

Jedną z rzeczy, które mogą pomóc w zwiększeniu pamięci w czasie, jest obniżenie poziomu utrzymania httpd, ale przetestowałbym to dokładnie, na wypadek gdyby Twoja aplikacja potrzebowała dłuższych procesów.

DF
źródło
0

Na serwerze działa Solaris na współużytkowanym procesorze, a ja używam stosu Apache + MySQL + PHP.

Nie mam doświadczenia z Solaris, ale najlepszą rzeczą, jaką możesz zrobić, to nie używać Apache / mod_php.

  • Przełącz się na nginx z php-fastcgi.
  • Przekompiluj php, aby użyć minimalnej ilości wtyczek.
  • Pozbądź się niepotrzebnych procesów takich jak ntpd (użyj ntpdate), ftp (użyj scp) itp ...
Nieznany
źródło