Naprawianie przeciążonego serwera

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

Katie Hempenius
Katie Hempenius

Z tego przewodnika dowiesz się, jak rozwiązać problem z przeciążonym serwerem w 4 krokach:

  1. Oceń: określ wąskie gardło serwera.
  2. Stabilizuj: wdrażaj szybkie poprawki, aby ograniczyć skutki.
  3. Usprawnij: rozszerzaj i optymalizuj możliwości serwerów.
  4. Monitoruj: korzystaj z automatycznych narzędzi, aby zapobiegać problemom w przyszłości.

Oceń

Jeśli ruch przeciąża serwer, może powstać wąskie gardło: procesor, sieć, pamięć lub wejścia/wyjścia dysku. Określenie, który z nich jest przyczyną wąskiego gardła, pozwala skoncentrować działania na najskuteczniejszych środkach zaradczych.

  • Procesor: wykorzystanie procesora na poziomie ponad 80% należy zbadać i wyeliminować. Wydajność serwera często spada, gdy wykorzystanie procesora osiągnie ok. 80–90%, i staje się bardziej widoczne w miarę wykorzystania zbliżającego się 100%. Wykorzystanie procesora przez obsługę pojedynczego żądania jest znikome, ale robienie tego na dużą skalę podczas nagłego zwiększenia ruchu może czasem przeciążyć serwer. Przeniesienie obsługi do innej infrastruktury, ograniczenie kosztownych operacji i ograniczenie liczby żądań zmniejszy wykorzystanie procesora.
  • Sieć: w okresach dużego ruchu przepustowość sieci wymagana do realizowania żądań użytkowników może przekroczyć przepustowość. W przypadku niektórych witryn, w zależności od dostawcy usług hostingowych, również mogą obowiązywać limity przesyłania danych łącznie. Zmniejszenie rozmiaru i ilości danych przesyłanych do i z serwera spowoduje usunięcie tego wąskiego gardła.
  • Pamięć – gdy w systemie nie ma wystarczającej ilości pamięci, dane muszą zostać przeładowane, aby można było je zapisać na dysku. Dostęp do dysku jest znacznie wolniejszy niż do pamięci, co może spowolnić całą aplikację. Całkowite wyczerpanie pamięci może wywołać błędy Za mało pamięci (OOM). Dostosowanie alokacji pamięci, usunięcie wycieków pamięci i uaktualnienie pamięci może usunąć to wąskie gardło.
  • Wejście-wyjście dysku: szybkość, z jaką dane mogą być odczytywane lub zapisywane z dysku, jest ograniczona przez sam dysk. Jeśli operacje wejścia-wyjścia dysku występują w przypadku wąskiego gardła, zwiększenie ilości danych w pamięci podręcznej może złagodzić ten problem (kosztem zwiększonego wykorzystania pamięci). Jeśli to nie pomoże, może być konieczne uaktualnienie dysków.

Techniki opisane w tym przewodniku skupiają się na rozwiązywaniu problemów z wąskim gardłem procesora i sieci. W przypadku większości witryn najistotniejsze wąskie gardła związane z wykorzystaniem procesora i sieci będą najbardziej odpowiednie w okresie nagłego zwiększenia ruchu.

Uruchomienie narzędzia top na serwerze, na którym występuje problem, jest dobrym punktem wyjścia do badania wąskich gardła. W miarę możliwości uzupełnij je danymi historycznymi od dostawcy usług hostingowych lub narzędzi do monitorowania.

Stabilizacja

Przeciążenie serwera może szybko doprowadzić do kaskadowych awarii w innych miejscach systemu. Dlatego przed wprowadzeniem większych zmian należy ustabilizować serwer.

Ograniczenie liczby żądań

Ograniczenie liczby żądań chroni infrastrukturę, ograniczając liczbę żądań przychodzących. Jest to coraz ważniejsze ze względu na spadek wydajności serwera. Wraz ze wzrostem czasu odpowiedzi użytkownicy często odświeżają stronę, co jeszcze bardziej zwiększa obciążenie serwera.

Napraw

Odrzucenie żądania jest stosunkowo niedrogie, ale najlepszym sposobem zabezpieczenia serwera jest ograniczenie szybkości w jego kierunku, na przykład przez system równoważenia obciążenia, odwrotny serwer proxy lub CDN.

Instrukcje:

Więcej informacji:

Buforowanie HTTP

Poszukaj sposobów na bardziej agresywne zapisywanie treści w pamięci podręcznej. Jeśli zasób może być udostępniany z pamięci podręcznej HTTP (np. z pamięci podręcznej przeglądarki czy 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ą sposób przechowywania zasobu przez pamięć podręczną HTTP. Kontrola i naprawienie tych nagłówków poprawi buforowanie.

Chociaż skrypty service worker mogą być również używane do buforowania, wykorzystują one oddzielną pamięć podręczną i stanowią uzupełnienie, a nie zamiennik dla prawidłowego buforowania HTTP. Dlatego w przypadku przeciążonego serwera należy skupić się na optymalizacji buforowania HTTP.

Diagnozuj

Uruchom Lighthouse i przejrzyj kontrolę Udostępniania zasobów statycznych z wykorzystaniem zasad pamięci podręcznej, aby zobaczyć listę zasobów o krótkim lub średnim czasie życia (TTL). Dla każdego wymienionego zasobu zastanów się, czy należy zwiększyć wartość TTL. Ogólne wytyczne:

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

Napraw

Ustaw odpowiednią liczbę sekund w dyrektywie max-age w nagłówku Cache-Control.

Instrukcje:

Łagodne pogorszenie

Łagodne pogorszenie to strategia tymczasowego ograniczania funkcjonalności w celu pozbycia się nadmiernego obciążenia systemu. Koncepcję tę można zastosować na wiele różnych sposobów, na przykład wyświetlając statyczną stronę tekstową zamiast pełnej aplikacji, wyłączenie wyszukiwania lub zwracanie mniejszej liczby wyników wyszukiwania albo wyłączenie pewnych kosztownych lub mniej ważnych funkcji. Należy położyć nacisk na usuwanie funkcji, które można bezpiecznie i łatwo usunąć przy minimalnym wpływie na działalność.

Ulepsz

Korzystanie z sieci dostarczania treści (CDN)

Wyświetlane zasoby statyczne można przenieść z serwera do sieci dystrybucji treści (CDN), zmniejszając w ten sposób obciążenie.

Podstawową funkcją sieci CDN jest szybkie dostarczanie treści użytkownikom dzięki dużej sieci serwerów znajdujących się w pobliżu użytkowników. Większość sieci CDN oferuje jednak również dodatkowe funkcje związane z wydajnością, takie jak kompresja, równoważenie obciążenia i optymalizacja mediów.

Konfigurowanie sieci CDN

Sieci CDN korzystają z skalowalności, więc obsługa własnej sieci rzadko ma sens. Podstawową konfigurację CDN można dość szybko skonfigurować (około 30 minut) i polega na zaktualizowaniu rekordów DNS tak, aby wskazywały sieć CDN.

Optymalizowanie wykorzystania CDN

Diagnozuj

Zidentyfikuj zasoby, które nie są udostępniane z sieci CDN (ale powinny być), uruchamiając narzędzie WebPageTest. Na stronie wyników kliknij kwadrat nad opcją „Efektywne wykorzystanie sieci CDN”, by 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 buforowany przez CDN, sprawdź, czy są spełnione te warunki:

Skalowanie zasobów obliczeniowych

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

Diagnozuj

Wysoka wartość Czasu do pierwszego bajtu (TTFB) może oznaczać, że serwer wyczerpuje swoją pojemność. Informacje na ten temat możesz znaleźć w raporcie Lighthouse dotyczącym skracania czasu reakcji serwera (TTFB).

Aby dokładniej zbadać wykorzystanie procesora, użyj narzędzia do monitorowania. 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 rozdzielenie ruchu między wiele serwerów. System równoważenia obciążenia znajduje się przed pulą serwerów i kieruje ruch na odpowiedni serwer. Dostawcy usług w chmurze oferują własne systemy równoważenia obciążenia (GCP, AWS, Azure). Możesz też skonfigurować własny przy użyciu HAProxy lub NGINX. Po wdrożeniu systemu równoważenia obciążenia można dodać kolejne serwery.

Oprócz równoważenia obciążenia większość dostawców chmury oferuje autoskalowanie (GCP, AWS, Azure). Autoskalowanie działa w połączeniu z równoważeniem obciążenia – autoskalowanie automatycznie skaluje zasoby obliczeniowe w górę i w dół w zależności od zapotrzebowania. Pamiętaj jednak, że autoskalowanie to nie magia – wymaga czasu, zanim nowe instancje pojawią się online, i wymaga zaawansowanej konfiguracji. Ze względu na dodatkową złożoność, z jaką wiąże się autoskalowanie, należy najpierw rozważyć prostszą konfigurację opartą na systemie równoważenia obciążenia.

Włącz kompresję

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

Diagnozuj

Skorzystaj z kontroli Włącz kompresję tekstu w Lighthouse, aby zidentyfikować zasoby do skompresowania.

Napraw

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

Optymalizuj obrazy i multimedia

Obrazy stanowią większość rozmiaru plików w większości witryn; optymalizacja obrazów może szybko i znacznie zmniejszyć rozmiar witryny.

Diagnozuj

W Lighthouse są przeprowadzane różne audyty wskazujące na możliwe optymalizacje obrazów. Inną strategią jest użycie Narzędzi deweloperskich do identyfikacji największych plików graficznych – te obrazy z dużym prawdopodobieństwem będą dobre do optymalizacji.

Odpowiednie audyty Lighthouse:

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

Napraw

Jeśli masz ograniczony czas...

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

Uwagi:

  • Rozmiar: obrazy nie mogą być większe niż to konieczne.
  • Kompresja: ogólnie jakość 80-85 ma minimalny wpływ na jakość obrazu i zmniejsza rozmiar pliku o 30-40%.
  • Format: używaj plików JPEG zamiast PNG. W przypadku treści animowanych używaj formatu MP4, a nie GIF.

Jeśli masz więcej czasu...

Rozważ skonfigurowanie sieci CDN z obrazami, jeśli obrazy stanowią znaczną część witryny. Sieci CDN obrazów zostały zaprojektowane z myślą o wyświetlaniu i optymalizowaniu obrazów. Pozwalają one przenieść obsługę obrazów z serwera pierwotnego. Konfigurowanie sieci CDN z obrazami jest proste, ale wymaga zaktualizowania istniejących adresów URL obrazów, tak aby wskazywały tę sieć.

Więcej informacji:

Zmniejsz JS i CSS

Zmniejszenie powoduje usunięcie zbędnych znaków z JavaScriptu i CSS.

Diagnozuj

Użyj audytów narzędzia Minify CSS i Minify JavaScript Lighthouse, aby zidentyfikować zasoby wymagające minifikacji.

Napraw

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

Monitorowanie

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

Konfiguracja monitorowania powinna być jak najprostsza. Nadmierne gromadzenie i alarmowanie danych wiąże się z kosztami: im większy zakres lub częstotliwość gromadzenia danych, tym droższe jest ich zbieranie i przechowywanie; nadmierna liczba alertów nieuchronnie prowadzi do zignorowania strony.

Alerty powinny korzystać z wskaźników, które konsekwentnie i dokładnie wykrywają problemy. Czas reakcji serwera (opóźnienie) to wskaźnik, który szczególnie dobrze się tu sprawdza – wykrywa wiele różnych problemów i jest bezpośrednio skorelowany z wrażeniami użytkowników. Alerty oparte na wskaźnikach niższego poziomu, takich jak wykorzystanie procesora, mogą być przydatnym uzupełnieniem, ale wykrywa mniejszy podzbiór problemów. Dodatkowo alerty powinny być oparte na wynikach zaobserwowanych na samym końcu (czyli na 95 lub 99 centylu), a nie na średnich wartościach. W przeciwnym razie średnie mogą łatwo wyeliminować 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). Netdata to też doskonała, bezpłatna alternatywa typu open source. Niezależnie od tego, które narzędzie wybierzesz, musisz zainstalować agenta monitorowania tego narzędzia na każdym serwerze, który chcesz monitorować. Gdy to zrobisz, skonfiguruj alerty.

Instrukcje: