Brak pamięci dla Apache


Mam VPS z 768 MB pamięci RAM i procesorem 1,13 GHz. Mam serwis randkowy php/mysql, wydajność jest doskonała, a obciążenie serwera jest ogólnie bardzo niskie.
Czasami reklamuję się na Facebooku iw godzinach szczytu mogę uzyskać 100-150 kliknięć w kilka sekund - prowadzi to do braku pamięci na serwerze:
Nie można przydzielić pamięci: nie można utworzyć procesu potomnego:/opt/suphp/sbin/suphp ....
Wszyscy użytkownicy otrzymują błąd 500 stron.
Zastanawiam się tylko, czy to brzmi rozsądnie, czy nie - 100-150 nie brzmi dla mnie jak liczba, która powinna spowodować, że Apache zabraknie pamięci.
Wszelkie porady/wskazówki dotyczące diagnozowania problemu są mile widziane.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Optymalizację rozmiaru pamięci zwykle osiąga się poprzez zmniejszenie (i ograniczenie) następujących czynników:
  • liczba współbieżnych procesów Apache (polecam przejście na podgląd MPM, który jest nieco łatwiejszy w zarządzaniu w środowisku o ograniczonej pamięci)
  • przejście z mod_php lub php_cgi do fastcgi mod_cfgid działa dobrze. Zmniejszenie liczby dozwolonych uruchomionych procesów php przy użyciu FcgidMaxProcesses i usuwanie długich limitów czasu (zobacz. http://httpd.apache.org/mod_fc ... .html http://httpd.apache.org/mod_fc ... .html )
  • „wątkowanie” serwera, zwłaszcza poprzez redukcję niepotrzebnie długich limitów czasu ((rozłączanie) limitów czasu połączenia, komunikatów o utrzymywaniu aktywności, ...)

Jeśli obciążenie staje się naprawdę duże, należy również przyjrzeć się szybkości przetwarzania żądań (szybsze ładowanie poprawia ogólny rozmiar * czas pamięci wymagany dla jednego żądania)
  • optymalizacja kodu witryny (ulepszenie kodu PHP, aby był szybszy i/lub bardziej wydajny w pamięci)
  • optymalizacja wykonania PHP (xcache może kilkakrotnie przyspieszyć pracę)
  • buforowanie całych żądań również działa cuda, patrz mod_cache

Być może, jeśli Twoja witryna w ogóle nie obciąża procesora i chcesz ekstremalnego Req/S, wypróbuj inny serwer WWW (taki jak nginx lub lighttpd), który zachowuje się lepiej w takich sytuacjach.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Pierwszą rzeczą do zrobienia jest uporządkowanie obecnego systemu. Domyślnie Apache jest zwykle skonfigurowany z wieloma rozszerzeniami, których prawdopodobnie nie potrzebujesz (w szczególności auth i proxy, także jeśli używasz SSL, ale tylko okazjonalnie, rozważ usunięcie mod_ssl i uruchomienie stunnel). Włącz mod_deflate. Spójrz na wszystko inne, co działa w twoim systemie - wyłącz (i wyłącz) wszelkie usługi, których nie potrzebujesz.
Następnie uruchomienie suphp na dedykowanej maszynie za pośrednictwem CGI jest zwykle bardzo głupim pomysłem - użyj mod_php lub fastCGI.
Przyspieszając system, nie tylko poprawisz jakość obsługi klienta, ale także zmniejszysz zużycie pamięci. Więc....
Zainstaluj pamięć podręczną kodu operacji PHP, jeśli jeszcze jej nie masz.
Zacznij zgłębiać wydajność swojego systemu - zmień konfigurację httpd, aby rozpocząć rejestrację% D, i spójrz na iloczyn częstotliwości adresów URL i% D, aby określić, które adresy URL powodują najwięcej problemów.
Niższy próg powolnego logowania zapytań w MySQL - użyj tego

parser
http://www.retards.org/projects/mysql/
lub podobnie do analizy danych (pamiętaj, że ponownie należy ustalać priorytety na podstawie iloczynu częstotliwości i czasu wykonania).
Dodaj automatyczne dołączanie, aby włączyć kompresję bufora wyjściowego gz.
Rozpocznij rejestrowanie liczby uruchomionych procesów httpd i porównaj to z mniejszą liczbą buforów/buforów dostępnych w „wolnym” - mapuj i wykreśl dane, aby określić, ile procesów httpd możesz rozsądnie uruchomić - a następnie zmodyfikuj swój httpd.conf, aby dostosować się do tego limitu . Zauważ, że we/wy dysku

fenomenalny

powolny oznacza, że ​​do buforowania wymagana jest wystarczająca ilość pamięci.
Zacznij sprawdzać, czy Twój serwer zapewnia dobre informacje o buforowaniu treści - lub czy klienci i serwery proxy powinni wracać po rzeczy, które się nie zmieniły (mod_expires, mod_headers)
Ale czasami potrzebujesz więcej sprzętu. Poleciłbym pomyśleć o drugim serwerze, a nie tylko o aktualizowaniu tego, który masz - dodanie systemu DNS z działaniem okrężnym jest trywialne - a otrzymasz dodatkową korzyść w postaci lepszej dostępności (po ustaleniu, jak radzić sobie z replikacją bazy danych).
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wymagana ilość pamięci dla każdej instancji Apache wynosi około 10 MB, chociaż dokładna ilość zależy od konfiguracji. Więc jeśli chcesz obsłużyć 100 jednoczesnych połączeń z Apache, potrzebujesz co najmniej 1 GB pamięci RAM oraz wszystkiego, czego potrzebuje system, MySQL i wszystko inne, czego używasz.
Jeśli chcesz zatrzymać stan „poza błędem”, możesz skonfigurować
         MaxClients
Parametr konfiguracyjny Apache do odpowiedniego poziomu. Aby uzyskać oszacowanie pamięci dla każdej instancji Apache, przyjrzyj się
         top
wydrukuj i odejmij kolumny RES i SHR wszystkich poleceń httpd. Pamiętaj, aby odjąć całą pamięć wymaganą przez MySQL i resztę systemu. Zwróć uwagę, że możesz uzyskać stosunkowo niewielką liczbę MaxClients na tym komputerze (30-50).
Pozostałe odpowiedzi stanowią dobre podsumowanie tego, co możesz zrobić, aby zwiększyć liczbę jednoczesnych żądań, które możesz obsłużyć. Należy pamiętać, że w tak niskim systemie może być trudne, choć niekoniecznie niemożliwe, dopasowanie Apache/PHP/MySQL plus lighttpd/nginx/memcached/caching. To, jak łatwe lub trudne, będzie zależeć od aplikacji i docelowej wydajności. Rozważ przejście na większy serwer ... o wiele łatwiej będzie ci zebrać wszystko, czego potrzebujesz do 2 lub 4 GB.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zarządzanie ruchem w godzinach szczytu jest trudne. Alternatywy obejmują: lżejszy serwer HTTP (lighttpd, nginx itp.); więcej fizycznej pamięci RAM; moduł równoważenia obciążenia i dodatkowe hosty, które zapewniają dodatkową korzyść w postaci wyższej dostępności; przesyłanie kodu aplikacji do systemu oddzielonego od serwera HTTP, zwykle za pośrednictwem FastCGI; dynamiczne udostępnianie zasobów obliczeniowych w celu sprostania obciążeniom za pośrednictwem usługi w chmurze, takiej jak EC2; lub mnóstwo innych pomysłów, o których zapomniałem lub których nie wymyśliłem. Istnieje kilka doskonałych źródeł na ten temat; w

Wysoka skalowalność
http://highscalability.com/
na przykład blog obejmuje większość tego obszaru. Mam nadzieję że to pomoże!

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się