Próg TTFB
ważność średniamierzonysposób ttfb
Czas do pierwszego bajtu powyżej 3 s przez kilka kolejnych skanów. Sygnał przeciążenia serwera, wycieku pamięci lub ataku.
WIKI
artykuł z 16.09.2026 · źródeł 10Próg TTFB to parametr monitoringu stron internetowych, który mierzy czas do pierwszego bajtu odpowiedzi serwera (ang. Time to First Byte) i porównuje go z ustaloną wartością graniczną w kolejnych pomiarach. Wynik to czas w milisekundach, a przekroczenie progu w serii pomiarów wskazuje na utrwalone spowolnienie, a nie chwilowe zakłócenie. TTFB mierzy czas od rozpoczęcia nawigacji do strony do chwili, w której zaczyna docierać pierwszy bajt odpowiedzi [1].
Jak działa
TTFB jest sumą kilku faz żądania: czasu przekierowań, uruchomienia service workera (jeśli występuje), zapytania DNS, nawiązania połączenia i negocjacji TLS oraz samego żądania aż do nadejścia pierwszego bajtu odpowiedzi [1]. MDN opisuje TTFB jako czas między wysłaniem żądania przez przeglądarkę a otrzymaniem pierwszego bajtu od serwera, obejmujący zapytanie DNS, uzgadnianie TCP i, przy HTTPS, uzgadnianie TLS [2].
Na czas po stronie serwera składa się wszystko, co dzieje się między przyjęciem żądania a wysłaniem początku odpowiedzi: wykonanie aplikacji, zapytania do bazy danych, odczyt z pamięci podręcznej. Nagłówek Server-Timing pozwala zmierzyć takie odrębne procesy zaplecza, na przykład zapytania do bazy danych [6]. Każde przekierowanie dokłada opóźnienie, a łańcuch przekierowań prowadzących do kolejnych przekierowań powiększa je dalej [6].
TTFB poprzedza wszystkie dalsze miary ładowania strony [1]. Nic nie może się wydarzyć po stronie przeglądarki, zanim zaplecze dostarczy pierwszy bajt treści, dlatego skrócenie TTFB poprawia każdą kolejną miarę ładowania [7].
Standardy i specyfikacje
- Navigation Timing Level 2 (W3C, szkic roboczy) definiuje
responseStartjako moment tuż po otrzymaniu przez przeglądarkę pierwszego bajtu odpowiedzi z serwera, pamięci podręcznej HTTP lub zasobów lokalnych [3]. Model przetwarzania ustawia fazy w kolejności: przekierowanie, zapytanie DNS, połączenie, zabezpieczenie połączenia, żądanie, odpowiedź [3]. - PerformanceResourceTiming udostępnia
responseStartw API przeglądarki; różnicaresponseStartirequestStartmierzy czas trwania samego żądania [4]. Dla zasobu z innego źródła bez nagłówkaTiming-Allow-Originwartość wynosi 0 [4]. - Server Timing (W3C) pozwala serwerowi przekazać przeglądarce metryki cyklu żądanie–odpowiedź, np.
Server-Timing: db;dur=53, app;dur=47.2[5]. Dostęp do tych danych jest domyślnie ograniczony regułą tego samego źródła, a serwer decyduje, które metryki ujawnia [5]. - Progi web.dev. web.dev zaleca, by serwer odpowiadał na tyle szybko, żeby 75. percentyl użytkowników mieścił się w dobrym progu FCP; jako orientację podaje TTFB do 0,8 s jako dobry i powyżej 1,8 s jako słaby [1]. TTFB nie należy do Core Web Vitals [1], ale jest pierwszą z czterech składowych LCP; web.dev sugeruje, by odpowiadał za około 40% tego czasu [7].
- 103 Early Hints. Przy odpowiedziach tymczasowych 103 za pierwsze bajty uznaje się właśnie tę odpowiedź [1]. Czas do odpowiedzi końcowej mierzy
finalResponseHeadersStart, tam gdzie jest obsługiwany [2].
Zagrożenia i skutki
Brak pamięci podręcznej stron. Wtyczki cache w WordPressie zapisują wpisy i strony jako pliki statyczne, co zmniejsza obciążenie serwera; dla stron o mało zmiennej treści poprawa może być kilkusetkrotna [8]. Pamięć podręczna obiektów przenosi dane z miejsca drogiego i wolnego w odczycie do taniego i szybkiego [8]. Bez tych mechanizmów każde żądanie wymaga pełnego wygenerowania strony.
Wtyczki, motywy i baza danych. Wydajność WordPressa zależy od liczby i jakości wtyczek oraz od użytego motywu [6]. Zapytania do bazy danych są jednym z procesów zaplecza, które warto mierzyć przy wysokim opóźnieniu [6].
WP-Cron. Zadania WP-Cron uruchamiają się przy wczytaniu strony; dokumentacja WordPressa zaleca przeniesienie ich do systemowego harmonogramu i wyłączenie stałą DISABLE_WP_CRON, bo inaczej WP-Cron nadal działa przy każdym wczytaniu strony i dokłada zużycie zasobów serwera [9].
Hosting. Hosting współdzielony jest zwykle wolniejszy, a aplikacja z niewystarczającą ilością pamięci zaczyna ją intensywnie wymieniać i nie obsługuje stron tak szybko, jak mogłaby [6]. CDN skraca dystans do użytkownika, bo zasoby są przechowywane na serwerach fizycznie bliższych odbiorcom [6].
Pomiar z jednej lokalizacji. Test laboratoryjny wykonuje jedno urządzenie, w jednej sieci, z jednego miejsca, zwykle przy pustej pamięci podręcznej [10]. Dane z pola odzwierciedlają rzeczywiste sieci i lokalizacje użytkowników, a pojedyncza liczba raportowana przez narzędzie jest punktem rozkładu, zwykle 75. percentylem [10]. Jeden odczyt TTFB jest więc próbką; o stanie serwera mówi dopiero seria pomiarów.
Przykłady
| Obserwacja | Co widać w pomiarze | Możliwa przyczyna |
|---|---|---|
| TTFB do 0,8 s | wynik w przedziale dobrym [1] | strona serwowana z pamięci podręcznej [8] |
| TTFB powyżej 1,8 s | wynik w przedziale słabym [1] | generowanie strony bez cache, ciężkie wtyczki [6] [8] |
| Wysoki TTFB, krótki czas serwera w Server-Timing | opóźnienie poza aplikacją | przekierowania, DNS, połączenie, TLS [1] |
Wysoki czas db w Server-Timing | dominuje baza danych [5] [6] | wolne zapytania do bazy [6] |
| Pojedynczy wolny odczyt, kolejne szybkie | jedna próbka z rozkładu [10] | zimna pamięć podręczna, warunki sieci [10] |
| Wolne odczyty w wielu kolejnych pomiarach | spowolnienie utrwalone w serii | przeciążony hosting, brak pamięci [6] |
| Niski TTFB przy 103 Early Hints | liczy się odpowiedź tymczasowa [1] | odpowiedź końcowa może przyjść później [2] |
- [1] Time to First Byte (TTFB) · web.dev (Google)
- [2] Time to first byte — Glossary · MDN Web Docs
- [3] Navigation Timing Level 2 · W3C
- [4] PerformanceResourceTiming: responseStart property · MDN Web Docs
- [5] Server Timing · W3C
- [6] Optimize Time to First Byte · web.dev (Google)
- [7] Optimize Largest Contentful Paint · web.dev (Google)
- [8] Cache — Advanced Administration Handbook · WordPress.org
- [9] Hooking WP-Cron Into the System Task Scheduler — Plugin Handbook · WordPress.org
- [10] Why lab and field data can be different · web.dev (Google)
STATS
wyniki z systemu · tylko liczby zbiorcze- Stron zmierzonych
- 270w ostatnim dniu pomiaru
- OK
- 452odczytów
- Fail
- 2odczytów
- Nie dało się sprawdzić
- 60timeout, blokada, limit zapytań
- Udział fail
- 0,4%bez „nie dało się”
- Stron łącznie
- 272choć jeden odczyt
- OK
- 68762odczytów
- Fail
- 171odczytów
- Nie dało się sprawdzić
- 9048timeout, blokada, limit zapytań
- Udział fail
- 0,2%bez „nie dało się”
| Dzień | fail | nie dało się sprawdzić | ok |
|---|---|---|---|
| 08.10.2026 | 2 odczyty | 226 odczytów | 1554 odczyty |
| 09.10.2026 | 2 odczyty | 227 odczytów | 1553 odczyty |
| 10.10.2026 | 2 odczyty | 330 odczytów | 1450 odczytów |
| 11.10.2026 | 2 odczyty | 152 odczyty | 1628 odczytów |
| 12.10.2026 | 3 odczyty | 151 odczytów | 1628 odczytów |
| 13.10.2026 | 3 odczyty | 186 odczytów | 1593 odczyty |
| 14.10.2026 | 4 odczyty | 212 odczytów | 1566 odczytów |
| 15.10.2026 | 2 odczyty | 218 odczytów | 1562 odczyty |
| 16.10.2026 | 2 odczyty | 213 odczytów | 1567 odczytów |
| 17.10.2026 | 2 odczyty | 213 odczytów | 1567 odczytów |
| 18.10.2026 | 2 odczyty | 252 odczyty | 1528 odczytów |
| 19.10.2026 | 2 odczyty | 214 odczytów | 1566 odczytów |
| 20.10.2026 | 2 odczyty | 221 odczytów | 1559 odczytów |
| 21.10.2026 | 2 odczyty | 170 odczytów | 1619 odczytów |
| 22.10.2026 | 2 odczyty | 156 odczytów | 1624 odczyty |
| 23.10.2026 | 3 odczyty | 153 odczyty | 1626 odczytów |
| 24.10.2026 | 4 odczyty | 196 odczytów | 1582 odczyty |
| 25.10.2026 | 2 odczyty | 198 odczytów | 1582 odczyty |
| 26.10.2026 | 2 odczyty | 223 odczyty | 1557 odczytów |
| 27.10.2026 | 2 odczyty | 220 odczytów | 1560 odczytów |
| 28.10.2026 | 2 odczyty | 228 odczytów | 1552 odczyty |
| 29.10.2026 | 10 odczytów | 220 odczytów | 1557 odczytów |
| 30.10.2026 | 2 odczyty | 228 odczytów | 1648 odczytów |
| 31.10.2026 | 4 odczyty | 226 odczytów | 1648 odczytów |
| 01.11.2026 | 4 odczyty | 203 odczyty | 1671 odczytów |
| 02.11.2026 | 3 odczyty | 236 odczytów | 1698 odczytów |
| 03.11.2026 | 4 odczyty | 366 odczytów | 1608 odczytów |
| 04.11.2026 | 5 odczytów | 397 odczytów | 1674 odczyty |
| 05.11.2026 | 4 odczyty | 449 odczytów | 1579 odczytów |
| 06.11.2026 | 2 odczyty | 60 odczytów | 452 odczyty |
- Otwarte teraz
- 5stron: 5 · w okresie łaski: 10
- Nowe w ostatnim dniu
- 104.11.2026
- Otwarte od początku
- 154stron: 77
- Zamknięte
- 139od początku
- Mediana trwania
- 8 h 33 minod wykrycia do zamknięcia
| Ustalenie | Skutek | Otwarte teraz | Łącznie | Zamknięte |
|---|---|---|---|---|
| Czas odpowiedzi (TTFB) ttfb | usterka niekrytyczna | 5 | 154 | 139 |
| Dzień | nowe ustalenia |
|---|---|
| 08.10.2026 | 1 ustalenie |
| 09.10.2026 | 0 ustaleń |
| 10.10.2026 | 0 ustaleń |
| 11.10.2026 | 1 ustalenie |
| 12.10.2026 | 2 ustalenia |
| 13.10.2026 | 2 ustalenia |
| 14.10.2026 | 0 ustaleń |
| 15.10.2026 | 0 ustaleń |
| 16.10.2026 | 1 ustalenie |
| 17.10.2026 | 0 ustaleń |
| 18.10.2026 | 0 ustaleń |
| 19.10.2026 | 0 ustaleń |
| 20.10.2026 | 0 ustaleń |
| 21.10.2026 | 0 ustaleń |
| 22.10.2026 | 1 ustalenie |
| 23.10.2026 | 1 ustalenie |
| 24.10.2026 | 0 ustaleń |
| 25.10.2026 | 1 ustalenie |
| 26.10.2026 | 0 ustaleń |
| 27.10.2026 | 0 ustaleń |
| 28.10.2026 | 0 ustaleń |
| 29.10.2026 | 5 ustaleń |
| 30.10.2026 | 1 ustalenie |
| 31.10.2026 | 1 ustalenie |
| 01.11.2026 | 1 ustalenie |
| 02.11.2026 | 2 ustalenia |
| 03.11.2026 | 1 ustalenie |
| 04.11.2026 | 1 ustalenie |
| 05.11.2026 | 0 ustaleń |
| 06.11.2026 | 0 ustaleń |
- Przebiegów
- 60sposób ttfb
- W 30 dni
- 0przebiegów
- Ostatni
- 19.09.2026start przebiegu
- Stron w przebiegach
- 20461 przebiegów bez liczby stron
CARD
karta z kodu CREATO_PING, odczyt 22.09.2026Jak ten parametr trafia do ClickUpa: wynik sondy to linia w subtasku 2. Pomiar, a usterka, którą otwiera — linia w subtasku 1. Podsumowanie (z identyfikatorem CWE i kategorią OWASP), skąd liczy się wskaźnik zagrożenia i status strony. Projekcja z bazy skanera odświeża oba subtaski co godzinę. Do 22.09 każde ustalenie dostawało własny subtask i status ze starego słownika (PODATNA, WARNING…) — te słowa zostały jeszcze w części opisów pomiaru niżej jako język wewnętrzny sond.
| Obszar i ważność | Dostępność · średnia (D08) |
|---|---|
| Workflow i częstotliwość | creato_ping_avail_v2 działa na LAB247Skaner 2.0, rytm „dostepnosc”: premium co 15 min, reszta co 3–12 h · Dawny workflow n8n avail_v2; od 20.09 te same sondy w rytmie kohort skanera. Sposób ssl daje odczyt ssl_expiry (dni do wygaśnięcia certyfikatu); odczyty trafiają do check_results. |
| Sonda i helper | sposób ttfb · CREATO_PING/helpers/ttfb_check.py |
| Testy |
|
| Typ wyniku | enum: ok / fail / timeout / nie_dalo_sie_sprawdzic (przyczyna `zrodlo_nie_odpowiada`) + czas w ms, licznik kolejnych wolnych odczytów, próg |
| Jednostka | ms — w praktyce czas całej odpowiedzi GET razem z przekierowaniami i pobraniem treści, nie czas do pierwszego bajtu |
| Próg i reguła | Czas > 3000 ms zwiększa licznik; licznik ≥ 3 = fail. Brak odpowiedzi w 10 s = timeout od razu, błąd sieci = fail od razu. |
| Gdzie leżą pokrętła | CREATO_PING/helpers/ttfb_check.py → CREATO_PING_TTFB_THRESHOLD_MS (domyślnie 3000)CREATO_PING/helpers/ttfb_check.py → CREATO_PING_TTFB_STREAK (domyślnie 3)CREATO_PING/helpers/ttfb_check.py → _TIMEOUT (10 s, poza config.TIMEOUTS)CREATO_PING/helpers/site_params.py → CRITICAL_CHECK_TYPES (ttfb poza listą) |
| Retencja odczytów | Surowy pomiar jako NIEZMIENNY wiersz tabeli `odczyty` w bazie skanera (wejście, wyjście, dowody, sha karty sondy i helpera, commit kodu) — trigger odrzuca każdą zmianę. Okno retencji z kohorty: 90 dni premium, 30 dni reszta; poza oknem zostają odczyty z werdyktem problemu, akcją albo etykietą, bo replay reguł ich potrzebuje (`skaner/retencja.py`). Spłaszczony wynik jedzie dodatkowo do tabeli `check_results` bazy LAB247 (skrzynka `state/checks_outbox` → timer co 10 min); tej tabeli kod LAB247 nie czyści. |
| Znane rozbieżności |
|
| Karta przepisana z | CREATO_PING/helpers/ttfb_check.py · CREATO_PING/helpers/config.py · CREATO_PING/helpers/site_params.py · CREATO_PING/tools/avail_writer_input.py · LAB247/site/src/lib/ingest/apply.ts · CREATO_PING/skaner/usterki.toml · CREATO_PING/skaner/ocena.py · odczyt 22.09.2026 |
ttfb: bramka polityki otwarta (gate=true) → sprawa w skanerze → Serwer odpowiada wolno — waga 2 → ocena 3–4 (niebieski), status strony „niski”, dopóki sprawa jest otwarta. Okres łaski: 1. porażka zakłada sprawę ze statusem IN PROGRESS, której wskaźnik NIE liczy (`ocena.py` pomija sprawy niepotwierdzone), 2. porażka z rzędu potwierdza sprawę i dopiero wtedy usterka wchodzi do oceny. Pierwszy odczyt ok zamyka sprawę. Zanim to nastąpi, helper wymaga serii: porażka dopiero przy 3. kolejnym wolnym odczycie, więc przy skanie dobowym usterka wchodzi do oceny najwcześniej po 4 dniach. Od 17.09 błąd sieci i brak odpowiedzi nie są porażką, tylko trzecim stanem `nie_dalo_sie_sprawdzic` (`zrodlo_nie_odpowiada`) — o niedostępności mówią tcp i http, nie próg czasu.
| Kod | Finding | Severity | Pewność | Skutek | Finding / alarm | Waga → ocena | Co zrobić |
|---|---|---|---|---|---|---|---|
| D08.01 | Czas odpowiedzi (TTFB)ttfb | Średnia | Ewidentne | usterka niekrytyczna | tak / nie | waga 2 → ocena 3–4 (niebieski) | Sprawdź obciążenie serwera, cache i ciężkie wtyczki. |
| Kod i klucz | D08.01 · ttfb · w tabeli typów |
|---|---|
| Co znaczy | Serwer odpowiada wolniej niż 3 s w kolejnych skanach. |
| Kiedy powstaje | Czas GET strony do odpowiedzi. Status fail, gdy liczba kolejnych pomiarów powyżej 3000 ms (CREATO_PING_TTFB_THRESHOLD_MS) osiągnie co najmniej 3 (CREATO_PING_TTFB_STREAK); szybki pomiar zeruje licznik. Timeout po 10 s daje status timeout i zwiększa licznik. Błąd sieci daje nie_dalo_sie_sprawdzic.Licznik jest zapisywany w state/ttfb_streak.json. |
| Severity · pewność | Średnia · Ewidentne |
| Skutek dla strony | usterka niekrytyczna · zakłada Finding · alarm nie |
| Waga → ocena | waga 2 → ocena 3–4 (niebieski) |
| Klasyfikacja | OCSF 1.9.0: poza klasami Findingu |
| Rekord OCSF | finding_info.analytic.uid = "D08.01" · analytic.name = "ttfb" · finding_info.types = ["D08 Próg TTFB"] |
| Co zrobić | Sprawdź obciążenie serwera, cache i ciężkie wtyczki. |
| Wersje typu |
|
LOOP
bez pętliTrafności jeszcze nie liczymy: zamknięcie subtaska nie niesie dziś werdyktu (prawdziwy / fałszywy / nie dało się sprawdzić). Cztery liczby pojawią się, gdy każde zamknięcie dostanie werdykt — to warunek startu pętli 1.
Ten parametr nie przeszedł jeszcze żadnej pętli. W kolejce pętli 1 jest na pozycji 4.