Naprawianie przeciążonego serwera

Dowiedz się, jak określić wąskie gardło serwera i szybko rozwiązać powodowane przez nie problemy, poprawić wydajność serwera oraz zapobiec regresjom.

Katie Hempenius
Katie Hempenius

Przegląd

Z tego przewodnika dowiesz się, jak rozwiązać problem przeciążonego serwera w 4 krokach:

  1. Ocena: określenie wąskiego gardła serwera.
  2. Stabilizacja: wdrożenie szybkich rozwiązań w celu ograniczenia wpływu.
  3. Ulepszanie: rozszerzanie i optymalizowanie możliwości serwera.
  4. Monitorowanie: używaj zautomatyzowanych narzędzi, aby zapobiegać problemom w przyszłości.

Oceń

Gdy ruch przeciąża serwer, wąskim gardłem może stać się co najmniej 1 z tych elementów: procesor, sieć, pamięć lub operacje wejścia/wyjścia dysku. Zidentyfikowanie wąskiego gardła pozwala skupić się na najbardziej skutecznych działaniach zaradczych.

  • Procesor: wykorzystanie procesora, które stale przekracza 80%, należy zbadać i naprawić. Wydajność serwera często spada, gdy wykorzystanie procesora osiąga około 80–90%, i staje się bardziej zauważalna, gdy wykorzystanie zbliża się do 100%. Wykorzystanie procesora do obsługi pojedynczego żądania jest znikome, ale robienie tego na skalę, jaka występuje podczas skoków ruchu, może czasami przeciążyć serwer. Przeniesienie obsługi na inną infrastrukturę, ograniczenie kosztownych operacji i zmniejszenie liczby żądań pozwoli obniżyć wykorzystanie procesora.
  • Sieć: w okresach dużego ruchu przepustowość sieci wymagana do realizacji żądań użytkowników może przekroczyć pojemność. W przypadku niektórych witryn, w zależności od dostawcy usług hostingowych, mogą też obowiązywać limity dotyczące łącznego przesyłania danych. Zmniejszenie rozmiaru i ilości danych przesyłanych do i z serwera pozwoli usunąć to wąskie gardło.
  • Pamięć: gdy system nie ma wystarczającej ilości pamięci, dane muszą zostać przeniesione na dysk. Dostęp do dysku jest znacznie wolniejszy niż do pamięci, co może spowolnić działanie całej aplikacji. Jeśli pamięć zostanie całkowicie wyczerpana, może to spowodować błędy braku pamięci (OOM). Aby usunąć to wąskie gardło, możesz dostosować alokację pamięci, naprawić wycieki pamięci i zwiększyć ilość pamięci.
  • Operacje wejścia-wyjścia na dysku: szybkość odczytu i zapisu danych na dysku jest ograniczona przez sam dysk. Jeśli wąskim gardłem są dyskowe operacje wejścia/wyjścia, zwiększenie ilości danych przechowywanych w pamięci podręcznej może rozwiązać ten problem (kosztem większego wykorzystania pamięci). Jeśli to nie zadziała, może być konieczne uaktualnienie dysków.

Techniki opisane w tym przewodniku koncentrują się na rozwiązywaniu problemów z wąskimi gardłami procesora i sieci. W przypadku większości witryn podczas skoku ruchu wąskimi gardłami są procesor i sieć.

Uruchomienie polecenia top na serwerze, którego dotyczy problem, to dobry punkt wyjścia do zbadania wąskich gardeł. Jeśli to możliwe, uzupełnij je danymi historycznymi od dostawcy usług hostingowych lub z narzędzi do monitorowania.

Stabilizacja

Przeciążony serwer może szybko doprowadzić do błędów kaskadowych w innych częściach systemu. Dlatego przed wprowadzeniem istotnych zmian ważne jest ustabilizowanie serwera.

Ograniczanie liczby żądań

Ograniczanie liczby żądań chroni infrastrukturę, ograniczając liczbę żądań przychodzących. Jest to coraz ważniejsze, ponieważ wydajność serwera spada: gdy czas odpowiedzi się wydłuża, użytkownicy mają tendencję do agresywnego odświeżania strony, co jeszcze bardziej zwiększa obciążenie serwera.

Napraw

Chociaż odrzucenie żądania jest stosunkowo niedrogie, najlepszym sposobem na ochronę serwera jest obsługa ograniczania liczby żądań w miejscu przed nim, na przykład za pomocą systemu równoważenia obciążenia, odwrotnego serwera proxy lub sieci CDN.

Instrukcje:

Więcej informacji:

buforowanie HTTP,

Poszukaj sposobów na bardziej agresywne buforowanie treści. Jeśli zasób może być dostarczany z pamięci podręcznej HTTP (pamięci podręcznej przeglądarki lub sieci CDN), nie trzeba go żądać z serwera pierwotnego, co zmniejsza obciążenie serwera.

Nagłówki HTTP, takie jak Cache-Control, Expires i ETag, wskazują, jak zasób powinien być przechowywany w pamięci podręcznej HTTP. Sprawdzenie i poprawienie tych nagłówków usprawni buforowanie.

Chociaż do buforowania można też używać skryptów service worker, korzystają one z osobnej pamięci podręcznej i stanowią uzupełnienie, a nie zamiennik prawidłowego buforowania HTTP. Dlatego w przypadku przeciążonego serwera należy skupić się na optymalizacji buforowania HTTP.

Diagnozuj

Uruchom Lighthouse i sprawdź kontrolę Udostępniaj zasoby statyczne, stosując efektywne zasady buforowania, aby wyświetlić listę zasobów o krótkim lub średnim czasie życia (TTL). Zastanów się, czy nie warto zwiększyć wartości TTL dla każdego z wymienionych zasobów. Ogólne wskazówki:

  • Zasoby statyczne powinny być przechowywane w pamięci podręcznej z długim czasem życia (1 rok).
  • Zasoby dynamiczne powinny być przechowywane w pamięci podręcznej z krótkim czasem życia (3 godziny).

Napraw

Ustaw dyrektywę max-age nagłówka Cache-Control na odpowiednią liczbę sekund.

Instrukcje:

Łagodna degradacja

Łagodna degradacja to strategia polegająca na tymczasowym ograniczeniu funkcjonalności w celu zmniejszenia nadmiernego obciążenia systemu. Tę koncepcję można zastosować na wiele różnych sposobów, np. wyświetlając statyczną stronę tekstową zamiast w pełni funkcjonalnej aplikacji, wyłączając wyszukiwanie lub zwracając mniej wyników wyszukiwania albo wyłączając niektóre kosztowne lub nieistotne funkcje. Należy skupić się na usuwaniu funkcji, które można bezpiecznie i łatwo usunąć przy minimalnym wpływie na działalność firmy.

Zaproponuj ulepszenia

Używanie sieci dostarczania treści (CDN)

Zasoby statyczne można przenieść z serwera do sieci dostarczania treści (CDN), co zmniejszy obciążenie.

Główną funkcją sieci CDN jest szybkie dostarczanie treści użytkownikom dzięki dużej sieci serwerów znajdujących się blisko nich. Jednak większość sieci CDN oferuje też dodatkowe funkcje związane z wydajnością, takie jak kompresja, równoważenie obciążenia i optymalizacja multimediów.

Konfigurowanie sieci CDN

Sieci CDN korzystają z efektu skali, więc rzadko opłaca się prowadzić własną sieć CDN. Podstawową konfigurację sieci CDN można skonfigurować dość szybko (około 30 minut). Polega ona na zaktualizowaniu rekordów DNS, aby wskazywały sieć CDN.

Optymalizacja wykorzystania sieci CDN

Diagnozuj

Zidentyfikuj zasoby, które nie są udostępniane z sieci CDN (choć powinny), uruchamiając WebPageTest. Na stronie wyników kliknij kwadrat nad „Efektywne wykorzystanie sieci CDN”, aby wyświetlić listę zasobów, które powinny być udostępniane z sieci CDN.

Strzałka wskazująca przycisk „Efektywne wykorzystanie sieci CDN”
Wyniki WebPageTest

Napraw

Jeśli zasób nie jest przechowywany w pamięci podręcznej przez sieć CDN, sprawdź, czy spełnione są te warunki:

Skaluj zasoby obliczeniowe

Decyzję o skalowaniu zasobów obliczeniowych należy podejmować z rozwagą. Chociaż często konieczne jest skalowanie zasobów obliczeniowych, przedwczesne wykonanie tej czynności może spowodować niepotrzebną złożoność architektury i koszty finansowe.

Diagnozuj

Wysoki czas do pierwszego bajtu (TTFB) może oznaczać, że serwer zbliża się do limitu pojemności. Te informacje znajdziesz w audycie Lighthouse Skróć czas odpowiedzi serwera (TTFB).

Aby dowiedzieć się więcej, użyj narzędzia do monitorowania, aby ocenić wykorzystanie procesora. Jeśli bieżące lub przewidywane wykorzystanie procesora przekracza 80%, rozważ zwiększenie liczby serwerów.

Napraw

Dodanie systemu równoważenia obciążenia umożliwia rozdzielanie ruchu między wiele serwerów. System równoważenia obciążenia znajduje się przed pulą serwerów i kieruje ruch do odpowiedniego serwera. Dostawcy chmury oferują własne systemy równoważenia obciążenia (GCP, AWS, Azure), ale możesz też skonfigurować własny system, korzystając z HAProxy lub NGINX. Po skonfigurowaniu systemu równoważenia obciążenia można dodać kolejne serwery.

Oprócz równoważenia obciążenia większość dostawców chmury oferuje automatyczne skalowanie (GCP, AWS, Azure). Autoskalowanie działa w połączeniu z równoważeniem obciążenia – automatycznie skaluje zasoby obliczeniowe w górę i w dół w zależności od zapotrzebowania w danym momencie. Jednak autoskalowanie nie jest magicznym rozwiązaniem – uruchomienie nowych instancji wymaga czasu i znacznej konfiguracji. Ze względu na dodatkową złożoność, jaką wiąże się z autoskalowaniem, należy najpierw rozważyć prostszą konfigurację opartą na systemie równoważenia obciążenia.

Włącz kompresję

Zasoby tekstowe powinny być kompresowane za pomocą gzip lub brotli. Gzip może zmniejszyć rozmiar transferu tych zasobów o około 70%.

Diagnozuj

Aby zidentyfikować zasoby, które powinny zostać skompresowane, użyj kontroli Lighthouse Włącz kompresję tekstu.

Napraw

Włącz kompresję, aktualizując konfigurację serwera. Instrukcje:

Optymalizacja obrazów i multimediów

Obrazy stanowią większość rozmiaru pliku większości witryn, więc ich optymalizacja może szybko i znacznie zmniejszyć rozmiar witryny.

Diagnozuj

Lighthouse przeprowadza różne kontrole, które wskazują potencjalne optymalizacje obrazów. Inną strategią jest użycie Narzędzi deweloperskich do zidentyfikowania największych plików graficznych – te obrazy będą prawdopodobnie dobrymi kandydatami do optymalizacji.

Odpowiednie audyty Lighthouse:

Przepływ pracy w Narzędziach deweloperskich w Chrome:

Napraw

Jeśli masz mało czasu…

Skup się na identyfikowaniu dużych i często wczytywanych obrazów oraz ręcznym optymalizowaniu ich za pomocą narzędzia takiego jak Squoosh. Banery powitalne często dobrze nadają się do optymalizacji.

O czym warto pamiętać:

  • Rozmiar: obrazy nie powinny być większe niż to konieczne.
  • Kompresja: ogólnie rzecz biorąc, poziom jakości 80–85 będzie miał minimalny wpływ na jakość obrazu, a jednocześnie pozwoli zmniejszyć rozmiar pliku o 30–40%.
  • Format: w przypadku zdjęć używaj formatu JPEG, a nie PNG. W przypadku treści animowanych używaj formatu MP4, a nie GIF.

Jeśli masz więcej czasu…

Jeśli obrazy stanowią znaczną część Twojej witryny, rozważ skonfigurowanie sieci CDN do obsługi obrazów. Sieci CDN obrazów są przeznaczone do wyświetlania i optymalizowania obrazów oraz odciążają serwer pierwotny. Konfigurowanie sieci CDN obrazów jest proste, ale wymaga zaktualizowania istniejących adresów URL obrazów, aby wskazywały na sieć CDN obrazów.

Więcej informacji:

Zmniejszanie plików JS i CSS

Minifikacja usuwa niepotrzebne znaki z kodu JavaScript i CSS.

Diagnozuj

Użyj kontroli Lighthouse Zmniejsz pliki CSS i Zmniejsz pliki JavaScript, aby zidentyfikować zasoby, które wymagają zmniejszenia.

Napraw

Jeśli masz mało czasu, skup się na minifikacji kodu JavaScript. Większość witryn ma więcej kodu JavaScript niż CSS, więc będzie to miało większy wpływ.

Monitoruj

Narzędzia do monitorowania serwerów umożliwiają zbieranie danych, tworzenie paneli i wysyłanie alertów dotyczących wydajności serwerów. Ich użycie może pomóc w zapobieganiu przyszłym problemom z wydajnością serwera i ich ograniczaniu.

Konfiguracja monitorowania powinna być jak najprostsza. Nadmierne zbieranie danych i wysyłanie alertów wiąże się z kosztami: im większy zakres lub częstotliwość zbierania danych, tym droższe jest ich zbieranie i przechowywanie. Nadmierne wysyłanie alertów nieuchronnie prowadzi do ignorowania stron.

Alerty powinny używać wskaźników, które konsekwentnie i dokładnie wykrywają problemy. Czas odpowiedzi serwera (opóźnienie) to wskaźnik, który sprawdza się w tym przypadku szczególnie dobrze: pozwala wykryć wiele różnych problemów i jest bezpośrednio powiązany z wrażeniami użytkownika. Alerty oparte na danych niższego poziomu, takich jak wykorzystanie procesora, mogą być przydatnym uzupełnieniem, ale będą wykrywać mniejszy podzbiór problemów. Ponadto alerty powinny być oparte na wydajności obserwowanej na końcu (czyli w 95 lub 99 percentylu), a nie na średnich. W przeciwnym razie średnie mogą łatwo przesłonić problemy, które nie dotyczą wszystkich użytkowników.

Napraw

Wszyscy główni dostawcy chmury oferują własne narzędzia do monitorowania (GCP, AWS, Azure). Doskonałą bezpłatną alternatywą typu open source jest też Netdata. Niezależnie od wybranego narzędzia musisz zainstalować agenta monitorowania na każdym serwerze, który chcesz monitorować. Po zakończeniu tego procesu skonfiguruj alerty.

Instrukcje: