Czym jest waterfall w testach wydajności i jak go analizować
Analiza wykresu waterfall to jedno z podstawowych narzędzi w arsenale inżyniera zajmującego się wydajnością aplikacji webowych. Pozwala ona zobaczyć dokładny przebieg pobierania zasobów, zidentyfikować wąskie gardła w czasie odpowiedzi oraz ocenić wpływ kolejności i zależności zasobów na szybkość renderowania strony. W poniższym tekście omówię, czym jest wykres waterfall, jak go czytać, jakie narzędzia wykorzystać oraz jakie praktyczne techniki optymalizacyjne zastosować na podstawie wyników analizy.
Czym jest waterfall w testach wydajności i jak powstaje wykres
Wykres waterfall to wizualizacja kolejnych etapów ładowania zasobów strony (HTML, CSS, JS, obrazy, fonty itp.) w formie pasków ułożonych na osi czasu. Każdy pasek reprezentuje jedno żądanie HTTP/HTTPS i składa się z segmentów odpowiadających fazom połączenia: Blocked, DNS, Connect, SSL, Send, Wait (TTFB) i Receive. Takie rozbicie umożliwia precyzyjne ustalenie, na którym etapie następuje opóźnienie.
W praktyce wykresy generują narzędzia takie jak Chrome DevTools, WebPageTest, Lighthouse czy narzędzia typu proxy (Fiddler, Charles), a także format plików HAR (HTTP Archive), który zrzuca szczegółowe informacje o każdym żądaniu. W kontekście testów wydajnościowych warto rozróżnić analizę na poziomie przeglądarki (symulacja rzeczywistego klienta) oraz testy obciążeniowe na warstwie API, gdzie fokus jest raczej na metrykach takich jak p99, średnia czy przepustowość.
Dlaczego waterfall jest wartościowy
Wykres ujawnia nie tylko sumaryczny czas ładowania, ale też strukturę zależności między zasobami: które elementy są blokujące, które ładują się równolegle, oraz jak działa cache przeglądarki. Dzięki niemu można znaleźć problemy niewidoczne w prostych pomiarach czasu ładowania, takie jak nadmierna liczba połączeń do różnych domen, długo trwające rozwiązywanie DNS, brak ponownego wykorzystania połączeń czy render-blocking scripts.
Jak czytać i interpretować wykres waterfall
Interpretacja waterfall wymaga systematycznego podejścia. Poniżej opisuję kroki, które pomogą znaleźć najważniejsze problemy i ich przyczyny.
Krok 1: Przeglądaj fazy żądania
- Sprawdź długość segmentu DNS — długi czas oznacza problemy z rozwiązywaniem nazw, warto rozważyć preconnect lub ograniczenie liczby domen.
- Segment Connect i SSL wskazują na opóźnienia związane z nawiązywaniem połączenia i szyfrowaniem. Jeśli są duże, sprawdź konfigurację serwera, wykorzystanie keep-alive i czy wykorzystywany jest HTTP/2 lub HTTP/3.
- Wait (TTFB) to ważny wskaźnik wydajności backendu — długi TTFB sugeruje wolne przetwarzanie po stronie serwera lub nieefektywne zapytania do bazy danych.
- Segment Receive pokazuje czas transferu danych; długi odbiór może wynikać z braku kompresji, dużych zasobów lub wolnej sieci.
Krok 2: Analizuj równoległość i kolejność
Zwróć uwagę, ile zasobów ładuje się równolegle. Przeglądarki mają ograniczoną liczbę jednoczesnych połączeń do jednej domeny (chociaż HTTP/2 znacząco to zmienia). Długie paski pojawiające się w kolejce mogą wskazywać na blokowanie zasobów przez inne, bardziej priorytetowe zadania. Ustal, które skrypty lub style są blokujące renderowanie i rozważ ich asynchroniczne ładowanie (async/defer) lub ładowanie warunkowe.
Krok 3: Szukaj wzorców zależności (critical path)
Critical path to ciąg zasobów, które bezpośrednio wpływają na to, co użytkownik widzi jako pierwsze. Skrócenie tego łańcucha (mniej zależności, mniejsze pliki, wcześniejsze priorytety) zwykle przynosi największy wpływ na percepcję szybkości. Wykres waterfall pozwala wyodrębnić te elementy i skoncentrować optymalizację tam, gdzie ma największe znaczenie.
Krok 4: Uwaga na cache i statusy HTTP
Sprawdź nagłówki odpowiedzi i statusy (200, 304, 301/302). Zasoby zwracające 304 są korzystne, bo wykorzystują cache, ale jeśli za często występują pełne pobrania (200) dla niezmiennych zasobów, trzeba rozszerzyć polityki cache. Upewnij się też, że cache-control i etag są prawidłowo skonfigurowane.
Narzędzia i metody pracy z waterfall
Wybór narzędzia zależy od celu: szybka inspekcja w przeglądarce, dogłębna analiza z historią testów czy automatyczne raporty w CI/CD.
Najpopularniejsze narzędzia
- Chrome DevTools — natychmiastowy dostęp do waterfall, możliwość throttlingu sieci i CPU, widok initiatorów i szczegółowe nagłówki. Idealne do debugowania lokalnego.
- WebPageTest — eksperymentalne środowisko z wieloma lokalizacjami, protokołami (HTTP/2), filmowaniem ładowania i wygenerowanym waterfall. Świetne do porównań i testów RUM.
- Lighthouse — audyty automatyczne z metrykami Core Web Vitals; integruje analizę waterfall w kontekście wskaźników użytkowych.
- Proxy (Fiddler, Charles) — przydatne przy analizie specyficznych warunków sieciowych i debugowaniu ruchu między aplikacją a serwerem.
- HAR analyzers / narzędzia CI — pliki HAR można analizować automatycznie i porównywać między testami, co ułatwia śledzenie regresji.
Jak przygotować dobre testy
- Symuluj realne warunki użytkownika — użyj throttlingu sieci (3G/4G), ogranicz CPU, testuj z „cold cache” i „warm cache”.
- Rób wiele powtórzeń i analizuj medianę / percentyle (p95, p99), bo pojedyncze przebiegi mogą być zaburzone przez losowe czynniki.
- Zapisuj pliki HAR i konfiguracje testów — ułatwi to porównania i współpracę z zespołem backendu.
Praktyczne strategie optymalizacji na podstawie analizy waterfall
Po zidentyfikowaniu problemów na wykresie waterfall kolejnym krokiem są działania naprawcze. Poniżej lista technik uporządkowana według najczęściej występujących problemów.
Redukcja czasu DNS/Connect/SSL
- Użyj preconnect i dns-prefetch dla zasobów ładowanych z zewnętrznych domen.
- Sklonuj najczęściej używane zasoby na CDN, zmniejsz liczbę domen jeśli to możliwe.
- Włącz keep-alive, skonfiguruj odpowiednio certyfikaty i rozważ HTTP/2 lub HTTP/3, które redukują koszt wielu połączeń.
Zmniejszenie TTFB i problemów backendowych
- Profiluj serwer: zoptymalizuj zapytania do bazy, cache’uj odpowiedzi, stosuj CDN dla statycznych treści.
- Rozważ edge computing lub rozproszenie serwerów, by skrócić fizyczną odległość między klientem a serwerem.
Ograniczenie render-blocking
- Przeanalizuj skrypty i style: krytyczne CSS inline’uj, mniej istotne CSS ładuj asynchronicznie.
- Używaj async/defer dla skryptów, lazy-loading dla obrazów i komponentów poniżej linii widoczności.
Zmniejszenie rozmiaru transferu
- Włącz kompresję (gzip, brotli), minimalizuj zasoby, usuwaj nieużywany kod i stosuj modern formaty obrazów (AVIF, WebP).
- Włącz cache z długim TTL dla zasobów statycznych i stosuj cache busting przy aktualizacji.
Wykorzystanie HTTP/2 i HTTP/3
Przy przejściu na HTTP/2 lub HTTP/3 wiele problemów związanych z liczbą połączeń i kolejnością ładowania znika dzięki multiplexingowi i lepszemu zarządzaniu priorytetami. Nie oznacza to jednak, że optymalizacje typu łączenie plików stają się zbędne — wciąż istotny jest krytyczny path i rozmiary zasobów.
Analiza zaawansowana i dobre praktyki współpracy
W praktyce waterfall często wymaga współpracy między frontendem, backendem, zespołem sieci i właścicielami treści. Oto kilka praktycznych zasad, które ułatwiają pracę:
- Udostępniaj pliki HAR i wyniki z WebPageTest jako załączniki do zgłoszeń.
- Opisuj kontekst: lokalizacja testu, warunki sieciowe, wersja aplikacji i przeglądarki.
- Wyznacz metryki sukcesu: p95 czasu ładowania, FCP, LCP — zamiast skupiać się wyłącznie na najkrótszym czasie pojedynczego przebiegu.
- Automatyzuj testy wydajności w CI, by wykrywać regresje i mieć historyczne porównania waterfall dla kolejnych buildów.
Przykładowy workflow analizy
- Krok A: Zrób test w Chrome DevTools z cold cache i throttlingiem 4G.
- Krok B: Zapisz HAR, załaduj wynik do WebPageTest i przeanalizuj film ładowania, sprawdź LCP/CLS.
- Krok C: Wykryj najdłuższe segmenty Wait/Receive, ustal priorytet naprawy (critical path).
- Krok D: Wdroż optymalizacje (preconnect, async, kompresja), przetestuj ponownie i porównaj waterfall oraz metryki Core Web Vitals.
Specyfika waterfall poza przeglądarką
Choć waterfall jest najczęściej kojarzony z analizą ładowania stron w przeglądarce, podobne podejście można zastosować także do testów API i mikrousług. Tam „paski” reprezentują kolejne połączenia między komponentami (gateway, auth service, DB), a podział na fazy przekłada się na kolejność wywołań i czasy odpowiedzi poszczególnych usług. Przy testach obciążeniowych warto generować trace’y rozproszonych systemów (np. OpenTelemetry), które umożliwiają rekonstrukcję waterfall dla scenariuszy backendowych.
Analiza takiego „backendowego waterfall” pomaga znaleźć problemy typu długie zapytania do bazy, zatory w kolejce zadań czy niewłaściwe retry mechanizmy, które potrafią dramatycznie zwiększyć p99 czasu odpowiedzi.


