TTFB ve sunucu yanıtı.
TTFB, tarayıcının isteği göndermesiyle sunucudan ilk baytı almasi arasında geçen süredir ve diğer tüm metriklerin üzerine bindiği tabandır.
İlk bayt süresi bir Core Web Vitals metriği değil, ama üçünü de doğrudan etkiliyor. Sebep basit: sunucu yanıt vermeden tarayıcı hiçbir şey yapamaz. Bir saniyelik ilk bayt süresi, en iyi optimize edilmiş sayfada bile o bir saniyeyi geri getiremez. Bu yüzden performans çalışmasının tabanı burasıdır.
Google, iyi bir hedef olarak 800 milisaniyenin altını işaret ediyor. Bu sitenin canlı sunucudan ölçülen değeri 0,302 saniye; yönetilen üç projede de ölçülen değer 300 milisaniyenin altında. Rakamlar bir barındırma kararının sonucu, bir optimizasyon çabasının değil.
Süre nereye gidiyor
İlk bayt süresi tek bir işlem değil, bir zincir. Zinciri ayırmak, hangi halkanın uzun olduğunu gösterir ve her halkanın ayrı bir tedavisi vardır.
- Yönlendirme — istek başka bir adrese gönderildiyse zincir baştan başlar. Her atlama tam bir gidiş dönüş.
- Alan adı çözümlemesi — adres ilk kez çözülüyorsa bir sorgu maliyeti var.
- Bağlantı kurulumu — TCP el sıkışması ve güvenli bağlantı anlaşması.
- İstek gönderimi — kullanıcıdan sunucuya fiziksel mesafe. Işık hızı bir alt sınır koyar.
- Sunucu işi — sayfa üretiliyor mu, veritabanı sorgulanıyor mu, önbellekten mi geliyor?
- Yanıt gönderimi — ilk baytın kullanıcıya ulaşması.
Dördüncü ve altıncı maddeler fiziksel: kullanıcı ile sunucu arasındaki mesafe kısaltılamaz, ama sunucu kullanıcıya yaklaştırılabilir. İçerik dağıtım ağlarının tek işi budur ve statik içerik için etkisi dramatiktir.
Beşinci madde ise yazılım tarafı ve en büyük değişkenlik burada. Her istekte veritabanı sorgulayıp sayfa üreten bir sistem ile önceden üretilmiş bir dosyayı gönderen bir sistem arasında büyüklük farkı vardır.
Yönlendirme zinciri: sessiz maliyet
İlk madde en çok gözden kaçanıdır. Bir kullanıcı adresi eksik yazdığında ya da eski bir bağlantıya tıkladığında, istek yönlendirilir ve zincir baştan başlar. İki atlamalı bir zincir, ilk bayt süresini kolayca ikiye katlar.
Tipik zincir şudur: kullanıcı güvensiz protokolle ve alt alan adı olmadan gelir, önce güvenli protokole yönlendirilir, sonra tercih edilen alt alan adına yönlendirilir. İki atlama, iki tam gidiş dönüş.
Çözüm, yönlendirmeyi mümkün olan en erken katmanda ve tek atlamada yapmaktır. Kenar sunucu seviyesinde tanımlanan bir kural, uygulama katmanında yapılan bir yönlendirmeden hem hızlıdır hem de sunucu maliyeti sıfırdır.
Bu sitede o kural ölçüldü ve kayda geçti: apex adresten www adresine yönlendirme çalışıyor ama ideal katmanda değil — uygulama katmanında yaşıyor. Ölçülen maliyet ağ gürültüsünün içinde kaldı (yirmi istek, önbelleksiz, canlı: taban ~186 milisaniye, yönlendirmeli ~195), yani acil değil. Ama doğru katman biliniyor ve kayıtlı.
Ölçülen fark ağ gürültüsünün içindeyse, o acil bir sorun değildir — ama bilinmesi gereken bir borçtur.
Statik dosya sunmak
Sunucu işini sıfıra indirmenin en kesin yolu, sayfayı istek anında üretmemektir. Önceden üretilmiş bir dosyayı göndermek, bir veritabanı sorgusundan ve şablon işlemesinden büyüklük mertebesinde ucuzdur — ve sonuç her kullanıcı için aynı olduğu için kenar sunucularda sınırsız önbelleklenebilir.
Bu sitede sayfaların tamamı üretim anında oluşturuluyor ve statik dosya olarak sunuluyor. Elli sekiz sayfa, toplam 1.059 kilobayt. İstek anında çalışan tek kod parçası, iletişim formunun sunucu tarafı vekilidir — geri kalan her şey dosyadır.
Karar bir performans kararı olduğu kadar bir güvenilirlik kararı: çalışan kod yoksa çöken kod da yoktur. Trafik arttığında ölçeklenmesi gereken bir uygulama katmanı bulunmuyor.
Bu yaklaşımın sınırı da açık: gerçekten kişiselleştirilmiş içerik, oturum yönetimi ve sık değişen veri gerektiren sistemler statik olamaz. Ama tanıtım siteleri, belgeler, blog ve vitrin sitelerinin büyük çoğunluğu olabilir — ve genelde olmuyorlar.
Önbellek katmanları
İlk bayt süresini düşüren en güçlü araç önbellektir ve birden fazla katmanda çalışır. En dıştaki katman kullanıcının kendi tarayıcısıdır: daha önce indirilmiş bir kaynak hiç istenmez ve süre sıfır olur. Bir sonraki katman kenar sunuculardır: kaynak kullanıcının coğrafi olarak yakınındaki bir sunucudan gelir ve mesafe kısalır.
En içteki katman ise sunucunun kendi önbelleğidir: üretilmiş bir sayfa saklanır ve sonraki isteklerde yeniden üretilmez. Statik sitelerde bu katman gereksizdir çünkü sayfa zaten üretilmiş hâlde duruyor.
Katmanların doğru çalışması için önbellek başlıklarının doğru yazılması gerekiyor ve buradaki temel gerilim şudur: uzun önbellek hızlıdır ama güncelleme yayılmaz. Çözüm, içerikten türeyen bir sürüm damgasıdır — dosya değiştiğinde adresi de değişir, değişmediğinde aynı kalır. Bu sitede stil ve betik bağlantıları o damgayı taşıyor ve önbellek süresi bir yıl olarak veriliyor.
Protokol ve bağlantı
Bağlantı kurulumu, ilk bayt süresinin sabit maliyetidir ve protokol sürümü onu doğrudan etkiler. Modern protokoller el sıkışma turlarını azaltır ve tek bir bağlantı üzerinden çoklu istek yapmaya izin verir; böylece her kaynak için yeni bağlantı kurma maliyeti ortadan kalkar.
Bu, klasik optimizasyon tavsiyelerinin bir kısmını geçersiz kıldı. Dosyaları tek bir pakette birleştirmek eski protokollerde önemliydi çünkü her istek pahalıydı; modern protokollerde çoklu küçük dosya, tek büyük dosyadan daha iyi olabilir — çünkü değişmeyen kısımlar önbellekte kalır.
Bu sitenin yönettiği üç projede protokolün en yeni sürümü ölçülerek doğrulandı ve ilk bayt süreleri 300 milisaniyenin altında. Protokol seçimi genelde barındırma sağlayıcısının kararıdır ve tek yapılacak şey desteklendiğinden emin olmaktır — ama etkisi, çoğu kod optimizasyonundan büyüktür.
Son bir ölçüm notu: ilk bayt süresi tek bir sayı değil bir dağılımdır ve coğrafyaya göre dramatik biçimde değişir. Sunucunuza yakın bir konumdan yapılan ölçüm, uzaktaki kullanıcıların yaşadığını göstermez. Anlamlı bir tablo için ölçümün birden fazla bölgeden yapılması gerekiyor — ve hedef kitlenizin gerçekten nerede olduğunu bilmek, hangi bölgelerin önemli olduğunu belirliyor. Türkiye'ye hizmet veren bir site için Avrupa üzerinden ölçüm yanıltıcı olabilir; yerel bir ölçüm noktası daha dürüst bir sayı verir.