Optymalizacja serwera VPS

  1. Wprowadzenie
  2. Memcached
  3. Testy
  4. Optymalizacja XCache
  5. Wnioski

Po zakupie serwera VPS jest wiele problemów. Musisz wybrać serwer WWW, serwer ftp, serwer pocztowy. Musimy rozważyć zasady organizacji serwera WWW z poszczególnymi modułami.

Problemy zaczynają manifestować się bezpośrednio w pracy. Pamięć jest za dużo zużywana, procesor ciągle pracuje z maksymalną prędkością, wtedy zaczyna działać na małą prędkość dysku twardego, a potem coś innego.

Nadchodzi czas na optymalizację. Gdy zainstalowane programy zaczynają dostosowywać, testować, dostosowywać ponownie.

Wprowadzenie

Pamiętam tylko, że używam VPS z linode.com, minimalnej taryfy z 512 megabajtami pamięci RAM i 4 procesorami nuklearnymi. Zainstalowanym systemem operacyjnym jest Ubuntu 10.04. Nginx + php5-fpm + XCache jest używany jako serwer WWW.

Przeprowadziłem już test warunków skrajnych, wyniki opisane w artykule Test wydajności serwera VPS . W tym czasie serwer pokazał wynik na 14,15 zapytania / sek. Aby wytrzymać ruch na mojej stronie, wynik ten jest dość wystarczający, ale pojawił się inny problem. Przeciążenie zostało zużyte w pamięci.

500 żądań wystarczyło, aby procesy php wypełniły całą pamięć RAM, wypierając wszystkie bufory i pamięci podręczne, a następnie całą wymianę. Kontynuacja takiego obciążenia może po prostu upuścić serwer. I stało się to dla mnie bardzo niepokojące.

Po prostu nie rozumiałem, dlaczego php5-fpm zaczyna wydawać tyle pamięci RAM. Jak inne projekty żyją w takich warunkach?

Próbowałem zmienić liczbę procesów i nginx i php5-fpm, zmniejszając do minimum, ale to dało tylko dodatkowe minuty pracy, ale nie pozbyłem się samego problemu. Dwa procesy php5-fpm wypełniły całą przestrzeń przydzielonej pamięci w taki sam sposób, jak wszystkie osiem. Konieczne było pozostawienie minimalnej liczby procesów na chwilę, aby dłużej wytrzymać obciążenie i poszukać rozwiązania.

Nieco bardziej uratowana sytuacja zmienia ustawienia dla php5-fpm. W pliku /etc/php5/fpm/php5-fpm.conf zmieniłem następujące wartości:

emergency_restart_threshold = 10 emergency_restart_interval = 1m process_control_timeout = 5s pm.max_requests = 500

Stało się to trochę łatwiejsze. Teraz, po pewnym czasie, procesy php5-fpm zaczęły się ponownie uruchamiać, zwalniając zajętą ​​pamięć. Ale przecieki trwały nadal.

Memcached

Memcached

Dzisiaj postanowiłem wypróbować moduł memcached w mojej pracy. Wcześniej musiałem się zastanowić i zdecydować, czy to zrobić, ponieważ pewna ilość pamięci RAM musiałaby zostać przydzielona na dodatkowy moduł i bardzo go brakowało. Postanowiłem jednak zaryzykować i zobaczyć, co się stanie. W każdym razie obciążenie strony nie jest wspaniałe. Zainstaluj i uruchom:

# apt-get install memcached php5-memcache # /etc/init.d/memcached start

Teraz musisz zarejestrować użycie memcached w php5-fpm, w tym celu zmieniamy plik /etc/php5/fpm/php.ini i na samym początku po dyrektywie [PHP] piszemy:

Teraz ponownie uruchom php:

# /etc/init.d/php5-fpm restart

Patrzymy, jeśli blok memcache pojawił się na wyjściu funkcji phpinfo (), jeśli się pojawił, to wszystko jest w porządku. Jedyną rzeczą jest to, że przed uruchomieniem memcached zmieniłem jego ustawienia, zwiększając pamięć używaną z 16 megabajtów do 64.

Kolejny test stresu zdezorientował mnie! Wydajność nie uległa zmianie, ale wycieki pamięci po prostu zniknęły. Zatrzymałem to dzikie zużycie pamięci RAM.

Aby zobaczyć, ile pamięci memcached aktualnie używa, użyłem polecenia:

ps -e | grep 'memcached' | awk '{print $ 0} {sum + = 1 $} END {print "n Użycie pamięci dla memcached:", suma / 1024, "MB n"}'

Rezultat - nieco ponad 6 megabajtów pamięci RAM. To znaczy 64 megabajty, które przydzieliłem, to więcej niż wszystko.

Testy

Przeprowadziłem serię testów, aby śledzić, ile procesów nginx i php5-fpm są optymalne do użycia na LPS VPS z minimalną szybkością. Do tego, podobnie jak ostatnio, użyłem narzędzia ab z dostarczenia serwera WWW apache. Uruchomiony w następujący sposób:

ab -n 1000 -n 50 http://domain.ru/index.php

Zwiększono liczbę żądań do 1000 i zwiększono liczbę jednoczesnych żądań do serwera do 50. Byłem zainteresowany zużyciem pamięci RAM i, oczywiście, wydajnością serwera WWW, to znaczy, ile żądań może przetworzyć na sekundę.

Aby to zrobić, zmieniłem liczbę procesów nginx, a następnie liczbę procesów php5-fpm i obserwowałem odczyty narzędzi htop.

Pierwszy test został przeprowadzony z taką samą liczbą procesów, których użyłem przed zainstalowaniem memcached.

2 nginx i 2 php5-fpm :

Współbieżność Poziom: 50 sekund Pełne żądania: 1000 Niepowodzenie żądań: 0 Błędy zapisu: 0 Odpowiedzi inne niż 2xx: 1000 Łącznie przesłanych: 283000 bajtów Przesłany HTML: 0 bajtów Żądania na sekundę: 11,14 [# / sek] ( średnia) Czas na żądanie: 4487,736 [ms] (średnia) Czas na żądanie: 89,755 [ms] (średnia we wszystkich jednoczesnych żądaniach) Szybkość transferu: 3,08 [Kb / s] odebrane czasy połączenia (ms) min średnia [+/- sd] mediana max Connect: 0 0 0,7 0 4 Przetwarzanie: 1656 4379 320,6 4390 6135 Oczekiwanie: 1656 4379 320,6 4390 6135 Razem: 1661 4379 320,3 4390 6137

Maksymalne zużycie pamięci podczas 123 MB. Wciąż jest dużo wolnej pamięci, ale wydajność jest niska, zauważalne jest, że tylko dwa z czterech dedykowanych rdzeni biorą udział w pracy. Zwiększ liczbę procesów php do 4.

2 nginx i 4 php5-fpm :

Współbieżność Poziom: 50 Czas wykonania żądań: 46.838 sekund Kompletne żądania: 1000 Niepowodzenie żądań: 0 Błędy zapisu: 0 Odpowiedzi inne niż 2xx: 1000 Razem: 283000 bajtów HTML przesłany: 0 bajtów Żądania na sekundę: 21,35 [# / sek] ( średnia) Czas na żądanie: 2341,875 [ms] (średnia) Czas na żądanie: 46,838 [ms] (średnia we wszystkich jednoczesnych żądaniach) Szybkość przesyłania: 5,90 [Kb / s] odebrane czasy połączenia (ms) min średnia [+/- sd] mediana max Connect: 0 0 0.7 0 5 Przetwarzanie: 401 2287 225.4 2286 3039 Oczekiwanie: 401 2286 225,4 2286 3039 Razem: 406 2287 225,0 2286 3041

Maksymalne zużycie pamięci w tym przypadku wynosi 157 MB. Liczba przetworzonych żądań prawie się podwoiła. Nieźle Próbujemy zwiększyć liczbę procesów nginx, w rzeczywistości wartość maksymalnej liczby jednoczesnych połączeń powinna wzrosnąć.

4 nginx i 4 php5-fpm :

Współbieżność Poziom: 50 Czas potrzebny na testy: 45,951 sekund Kompletne żądania: 1000 Niepowodzenie żądań: 0 Błędy zapisu: 0 Odpowiedzi inne niż 2xx: 1000 Łącznie: 283000 bajtów HTML przesłany: 0 bajtów Żądania na sekundę: 21,76 [# / sek] ( średnia) Czas na żądanie: 2297,534 [ms] (średnia) Czas na żądanie: 45,951 [ms] (średnia we wszystkich jednoczesnych żądaniach) Szybkość przesyłania: 6,01 [kilobajtów / s] odebrane czasy połączenia (ms) min średnia [+/- sd] mediana max Połącz: 0 0 0,7 0 4 Przetwarzanie: 494 2239 214,0 2245 2988 Oczekiwanie: 494 2239 214,0 2245 2988 Razem: 498 2240 213,6 2245 2990

Maksymalne zużycie pamięci w tym przypadku wynosi 154 MB. To nawet nieco mniej niż w poprzednim przypadku, co jest trochę dziwne. Jednak liczba żądań przetwarzanych przez serwer co sekundę pozostaje niezmieniona. Czy to ma sens utrzymywanie kilku nginx ??

1 nginx i 4 php5-fpm :

Współbieżność Poziom: 50 sekund Kompletne żądania: 1000 Niepowodzenie żądań: 0 Błędy zapisu: 0 Odpowiedzi inne niż 2xx: 1000 Łącznie przesłane: 283000 bajtów Przesłany HTML: 0 bajtów Żądania na sekundę: 21,72 [# / s] ( średnia) Czas na żądanie: 2302,504 [ms] (średnia) Czas na żądanie: 46.050 [ms] (średnia dla wszystkich jednoczesnych żądań) Szybkość transferu: 6,00 [Kb / s] odebrane czasy połączenia (ms) min średnia [+/- sd] mediana max Połącz: 0 0 0,7 0 4 Przetwarzanie: 527 2246 201,0 2260 2968 Oczekiwanie: 526 2246 201,0 2260 2968 Razem: 531 2246 200,6 2260 2969

Maksymalne zużycie pamięci 151 MB. Jak widać, ma to niewielki wpływ na zużycie pamięci i liczbę przetwarzanych żądań. Jak dotąd nie widzę powodu, aby uruchamiać dodatkowe procesy nginx.

Stało się interesujące, ale co się stanie, jeśli liczba uruchomionych procesów php będzie większa niż liczba rdzeni?

1 nginx i 8 php5-fpm :

220 Mb maks. Współbieżność Poziom: 50 Żądania czasu na testy: 47.617 sekund Pełne żądania: 1000 Niepowodzenia: 0 Błędy zapisu: 0 Odpowiedzi inne niż 2xx: 1000 Razem: 283000 bajtów HTML: 0 bajtów Żądania na sekundę: 21.00 [# / s] (średnia) Czas na żądanie: 2380,835 [ms] (średnia) Czas na żądanie: 47,617 [ms] (średnia we wszystkich jednoczesnych żądaniach) Szybkość transferu: 5,80 [Kb / s] odebrane czasy połączenia (ms) min średnia [ +/- sd] mediana max Connect: 0 0 1,2 0 7 Przetwarzanie: 544 2331 202,2 2336 3307 Oczekiwanie: 544 2331 202,2 2336 3307 Razem: 549 2331 201,9 2336 3312

Maksymalne zużycie pamięci wynosi 220 MB. Liczba wniosków nawet spadła, nie ma zmian. Oznacza to, że zwiększenie liczby procesów php powyżej 4 dla mojego serwera nie jest tego warte.

Optymalizacja XCache

Optymalizacja XCache

Wszystkie testy wykorzystywały rozszerzenie WP Super Cache. Podczas testu naturalnie wykorzystywano buforowane strony, które raczej podniosły szybkość przesyłania stron i skróciły czas ich generowania. Administrator domyślnie działa z nieużytkowanymi stronami i tylko wydajność interpretera PHP wpływa na szybkość. Chociaż moduł php5-xcache został zainstalowany, w panelu administracyjnym zauważono pewne hamulce.

Do tego momentu użyłem domyślnych ustawień XCache. Zdecydowałem się trochę majsterkować i poszukać opcji konfiguracji w Internecie. Zmieniono tylko kilka ustawień w pliku /etc/php5/conf.d/xcache.ini :

xcache.size = 64M xcache.count = 4 xcache.var_size = 64M

Wartość xcache.size wzrosła z 16 do 64 megabajtów. Parametr xcache.count wskazuje liczbę rdzeni używanych w maszynie, ustawioną na 4. I xcache.var_size zmieniono z 0 na 64 megabajty.

Po ponownym uruchomieniu php5-fpm i administrator stał się bardziej responsywny!

Wnioski

Ustawienia używanych programów rzadko są domyślnie optymalne. Wymagane jest przetestowanie każdej zainstalowanej usługi i określenie optymalnych ustawień dla każdego konkretnego przypadku.

Dzięki testom udało mi się znacznie zmniejszyć zużycie pamięci RAM. I jednocześnie osiągnąć wydajność przetworzonych żądań do serwera do 21,72. Który jest wyższy niż nawet dostosowany hosting współdzielony, którego użyłem wcześniej.

Nie spodziewałem się, że instalacja memcached pozwoli mi rozwiązać problem z wyciekami pamięci. Teraz bardzo polecam używanie tego modułu PHP na serwerach obsługujących WordPress.

Po przeprowadzeniu testów liczba przetwarzanych żądań została zwiększona do 100 na sekundę. To prawda, rozumiem, że w tej chwili jest to prawie niemożliwe, ponieważ podczas testów wszystko było ograniczone wydajnością procesora. Poszukuję opcji optymalizacji aplikacji PHP.

Poczekaj na kontynuację!

Jak inne projekty żyją w takich warunkach?
Czy to ma sens utrzymywanie kilku nginx ?
Stało się interesujące, ale co się stanie, jeśli liczba uruchomionych procesów php będzie większa niż liczba rdzeni?