Naprawianie przeciążonego serwera

Jak określić wąskie gardło serwera i szybko je rozwiązać, poprawić wydajność serwera oraz zapobiec regresjom.

Katie Hempenius
Katie Hempenius

Omówienie

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

  1. Ocena: określ wąskie gardło serwera.
  2. Stabilize: wdrożenie szybkich poprawek w celu zminimalizowania wpływu.
  3. Ulepsz: rozszerz i zoptymalizuj możliwości serwera.
  4. Monitorowanie: korzystaj z automatycznych narzędzi, aby zapobiegać przyszłym problemom.

Oceń

Gdy ruch przeciąża serwer, może to spowodować zwężenie w przypadku co najmniej jednego z tych elementów: procesora, sieci, pamięci lub operacji wejścia/wyjścia na dysku. Ustalenie, który z nich jest wąskim gardłem, pozwala skoncentrować się na najbardziej skutecznych sposobach zapobiegania problemom.

  • Procesor: wykorzystanie procesora, które stale przekracza 80%, należy zbadać i usunąć. Wydajność serwera często spada, gdy wykorzystanie procesora osiąga poziom około 80–90%, a im bliższa 100%, tym bardziej się obniża. Wykorzystanie procesora podczas obsługi pojedynczego żądania jest znikome, ale robienie tego na dużą skalę podczas wzrostu natężenia ruchu może czasami przeciążać serwer. Przeniesienie obsługi na inną infrastrukturę, ograniczenie kosztownych operacji i ograniczenie liczby żądań zmniejszy wykorzystanie procesora.
  • Sieć: w okresach dużego natężenia ruchu przepustowość sieci wymagana do obsługi żądań użytkowników może przekroczyć jej możliwości. Niektóre witryny, w zależności od dostawcy usług hostingowych, mogą też osiągnąć limity dotyczące łącznego przesyłania danych. Zmniejszenie rozmiaru i ilości danych przesyłanych na serwer i z niego usunie to wąskie gardło.
  • Pamięć: gdy system nie ma wystarczającej ilości pamięci, dane muszą zostać przeniesione na dysk w celu przechowywania. 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 brak pamięci. Wyeliminowanie tego wąskiego gardła wymaga dostosowania przydziału pamięci, naprawienia wycieków pamięci i zwiększenia ilości pamięci.
  • Wejście-wyjście na dysku: szybkość odczytu i zapisu danych z dysku jest ograniczona przez sam dysk. Jeśli wąskim gardłem jest wejście/wyjście z dysku, zwiększenie ilości danych buforowanych w pamięci może rozwiązać ten problem (choć kosztem zwiększenia wykorzystania pamięci). Jeśli to nie zadziała, może być konieczna aktualizacja dysków.

Techniki opisane w tym przewodniku koncentrują się na rozwiązywaniu problemów z wąskim gardłem procesora i sieci. W przypadku większości witryn procesor i sieć będą najbardziej istotnymi wąskimi gardłami podczas wzrostu natężenia ruchu.

Uruchomienie top na dotkniętym problemem serwerze to dobry punkt wyjścia do zbadania wąskich gardeł. W razie możliwości uzupełnij te informacje o dane historyczne od dostawcy usług hostingowych lub narzędzia do monitorowania.

Stabilizacja

Przeciążony serwer może szybko doprowadzić do błędów kaskadowych w innych miejscach w systemie. Dlatego ważne jest, aby stabilizować serwer przed wprowadzeniem większych zmian.

Ograniczanie liczby żądań

Ograniczenie szybkości chroni infrastrukturę przez ograniczenie liczby żądań przychodzących. Jest to coraz ważniejsze, ponieważ wydajność serwera spada: wraz ze wzrostem czasu odpowiedzi użytkownicy mają tendencję do częstego odświeżania strony, co jeszcze bardziej zwiększa obciążenie serwera.

Napraw

Odrzucenie żądania jest stosunkowo niedrogie, ale najlepszym sposobem na ochronę serwera jest ograniczenie szybkości na etapie upstream, np. za pomocą równoważnika obciążenia, zapory zwrotnej 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 (czy to z pamięci podręcznej przeglądarki czy z sieci CDN), nie trzeba wysyłać żądania do serwera źródłowego, 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 przez pamięć podręczną HTTP. Sprawdzenie i poprawienie tych nagłówków poprawi buforowanie.

Chociaż elementy service worker mogą być również używane do buforowania, korzystają one z osobnej pamięci podręcznej i są uzupełnieniem, a nie zamiennikiem prawidłowego buforowania HTTP. Dlatego w przypadku przeciążonego serwera należy skupić się na optymalizacji buforowania HTTP.

Diagnozuj

Uruchom Lighthouse i sprawdź audyt Serwowanie statycznych zasobów za pomocą skutecznej polityki dotyczącej pamięci podręcznej, aby wyświetlić listę zasobów o krótkim lub średnim czasie życia (TTL). W przypadku każdego wymienionego zasobu zastanów się, czy nie warto zwiększyć wartości TTL. Oto kilka wskazówek:

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

Napraw

Ustaw w główce Cache-Control odpowiednią liczbę sekund w opcji max-age.

Instrukcje:

Łagodna degradacja

Uprzejma degradacja to strategia tymczasowego zmniejszenia funkcjonalności w celu odciążenia systemu. Można to robić na wiele sposobów: na przykład wyświetlać stałą stronę tekstową zamiast pełnej aplikacji, wyłączać wyszukiwanie lub zwracać mniej wyników wyszukiwania albo wyłączać niektóre kosztowne lub nieistotne funkcje. Należy skupić się na usuwaniu funkcji, które można łatwo i bezpiecznie usunąć przy minimalnym wpływie na działalność firmy.

Zaproponuj ulepszenia

Korzystanie z sieci dostarczania treści (CDN)

Udostępnianie zasobów statycznych można przekazać z serwera do sieci dostarczania treści (CDN), co zmniejsza obciążenie.

Podstawową funkcją sieci CDN jest szybkie dostarczanie treści użytkownikom dzięki dużej sieci serwerów znajdujących się blisko użytkowników. Większość usług CDN oferuje jednak dodatkowe funkcje związane ze skutecznością, takie jak kompresja, równoważenie obciążenia i optymalizacja multimediów.

Konfigurowanie sieci CDN

Sieci CDN korzystają na skali, więc prowadzenie własnej sieci CDN rzadko ma sens. Podstawowa konfiguracja sieci CDN jest dość szybka do skonfigurowania (około 30 minut) i polega na zaktualizowaniu rekordów DNS, aby wskazywały sieć CDN.

Optymalizacja wykorzystania CDN

Diagnozuj

Zidentyfikuj zasoby, które nie są dostarczane z CDN (ale powinny być), uruchamiając narzędzie WebPageTest. Na stronie wyników kliknij kwadrat nad opcją „Skuteczne korzystanie z CDN”, aby wyświetlić listę zasobów, które powinny być dostarczane z CDN.

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

Napraw

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

Skalowanie zasobów obliczeniowych

Decyzja o skalowaniu zasobów obliczeniowych powinna być starannie przemyślana. Chociaż często konieczne jest skalowanie zasobów obliczeniowych, zbyt wczesne zrobienie tego może spowodować niepotrzebne komplikacje w architekturze i koszty finansowe.

Diagnozuj

Duży czas do pierwszego bajta (TTFB) może oznaczać, że serwer zbliża się do swojej maksymalnej przepustowości. Te informacje znajdziesz w audycie Lighthouse Skróć czas odpowiedzi serwera (TTFB).

Aby przeprowadzić dalsze analizy, użyj narzędzia monitorującego do oceny wykorzystania 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 rozprowadzanie ruchu na wiele serwerów. System równoważenia obciążenia znajduje się przed pulą serwerów i kieruje ruch do odpowiedniego serwera. Dostawcy usług w chmurze oferują własne systemy równoważenia obciążenia (GCP, AWS, Azure), ale możesz też skonfigurować własny, korzystając z HAProxy lub NGINX. Po skonfigurowaniu systemu równoważenia obciążenia możesz dodać dodatkowe serwery.

Oprócz równoważenia obciążenia większość dostawców usług w chmurze 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ę lub w dół w zależności od zapotrzebowania w danym momencie. Autoskalowanie nie jest jednak magiczne – włączenie nowych instancji zajmuje trochę czasu i wymaga znacznej konfiguracji. Ze względu na dodatkową złożoność, którą powoduje autoskalowanie, najpierw należy rozważyć prostszą konfigurację opartą na równoważniku obciążenia.

Włącz kompresję

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

Diagnozuj

Aby zidentyfikować zasoby, które należy skompresować, użyj audytu Lighthouse Włącz kompresję tekstu.

Napraw

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

Optymalizacja obrazów i multimediów

Większość rozmiaru pliku w przypadku większości witryn stanowią obrazy. Zoptymalizowanie obrazów może szybko i znacznie zmniejszyć rozmiar witryny.

Diagnozuj

Lighthouse zawiera różne audyty, które wskazują na potencjalne możliwości optymalizacji obrazów. Inną strategią jest użycie DevTools do zidentyfikowania największych plików graficznych – te obrazy będą prawdopodobnie dobrymi kandydatami do optymalizacji.

Odpowiednie audyty Lighthouse:

Proces w Narzędziach deweloperskich w Chrome:

Napraw

Jeśli masz ograniczony czas…

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

Uwagi:

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

Jeśli masz więcej czasu…

Jeśli obrazy stanowią znaczną część Twojej witryny, rozważ skonfigurowanie CDN obrazów. Sieci CDN obrazów są przeznaczone do wyświetlania i optymalizowania obrazów. Przejmują one zadanie wyświetlania obrazów od serwera źródłowego. Konfiguracja CDN obrazów jest prosta, ale wymaga zaktualizowania istniejących adresów URL obrazów, tak aby wskazywały CDN obrazów.

Więcej informacji:

Minifikowanie kodu JS i CSS

Kompilacja usuwa z JavaScriptu i CSS niepotrzebne znaki.

Diagnozuj

Aby zidentyfikować zasoby, które wymagają zminifikowania, użyj audytów Lighthouse Zminifikuj CSSZminifikuj JavaScript.

Napraw

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

Monitorowanie

Narzędzia do monitorowania serwera zapewniają gromadzenie danych, panele i alerty dotyczące wydajności serwera. Ich użycie może pomóc w zapobieganiu i ograniczaniu przyszłych problemów z wydajnością serwera.

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

Alerty powinny korzystać z danych, 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 wykrywać wiele różnych problemów i jest bezpośrednio powiązany z wrażeniami użytkownika. Alerty oparte na danych niskiego poziomu, takich jak wykorzystanie procesora, mogą być przydatnym uzupełnieniem, ale wykrywają mniejszą liczbę problemów. Dodatkowo alerty powinny być oparte na wynikach obserwowanych na końcu (czyli na 95. lub 99. centylu), a nie na średnich wartościach. W przeciwnym razie średnie mogą łatwo ukrywać problemy, które nie dotyczą wszystkich użytkowników.

Napraw

Wszyscy główni dostawcy usług w chmurze oferują własne narzędzia do monitorowania (GCP, AWS, Azure). Ponadto Netdata to świetna bezpłatna alternatywa typu open source. Niezależnie od tego, które narzędzie wybierzesz, musisz zainstalować agenta monitorowania na każdym serwerze, który chcesz monitorować. Po zakończeniu konfiguracji ustaw alerty.

Instrukcje: