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ń :)
Odpowiedzi:
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:
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
KeepAliveTimeout
niż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-innodb
do MySQL my.cnf. Ogromne zmniejszenie zużycia pamięci.Jest też kilka niezwykłych dobrych sugestii, których osobiście nie mogłem zrobić:
źródło
Got rid of the wildcard used in VirtualHost entries
czy to faktycznie pomaga w jakikolwiek znaczący sposób? Miałem wrażenie, że to nie ma znaczenia.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
źródło
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.
źródło
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ć.
źródło
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
źródło
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.
źródło
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.
źródło
Nie mam doświadczenia z Solaris, ale najlepszą rzeczą, jaką możesz zrobić, to nie używać Apache / mod_php.
źródło