Bir geliştirici, Playwright veya Puppeteer aracılığıyla bir Chrome DevTools hata ayıklayıcısı (debugger) bağlamanın, fetch tabanlı yüklemeleri 20 kattan fazla yavaşlattığını ve günlük performans kıyaslamalarını yanıltıcı verilere dönüştürdüğünü keşfetti.
İncelemeyi başlatan bulmaca
Verileri sunucuya göndermeden önce şifreleyen tarayıcı tabanlı bir dosya deposu olan Coffer, yerel ağ üzerinden düzenli olarak gigabit sınıfı yüklemeler gerçekleştiriyor. Ekip yükleme hızlarını ölçtüğünde bir fark gördü: indirmeler bağlantıyı tam kapasite kullanırken, yüklemeler mevcut bant genişliğinin yaklaşık sekizde biri hızında ilerliyordu. Bu tutarsızlık, durumu değiştirmeyi başaramayan üç tur kod değişikliğine yol açtı; ta ki dördüncü bir "düzeltme" devasa bir artış sağlıyor gibi görünene kadar—ancak hata ayıklayıcı kaldırıldığında bu artış ortadan kayboldu.
Ekibin ilk denedikleri
Mühendisler alışılagelmiş şüphelilerin peşine düştü:
- Chunk boyutu – Bloğu 16 MiB'dan 32 MiB'a çıkarmak veri akış hızını (throughput) değiştirmeden bıraktı.
- Pipelining – Bir sonraki bloğun şifrelenmesini mevcut yükleme ile çakıştırmak, ölçüm gürültüsünden ayırt edilemeyecek kadar küçük, %13'lük mütevazı bir kazanç sağladı.
- Eşzamanlılık (Concurrency) – Birkaç yüklemeyi paralel olarak çalıştırmak, toplam hızı aynı seviyede sınırlayarak küresel bir üst sınır olduğunu gösterdi.
Bu varyasyonların hiçbiri 8 katlık yavaşlamayı açıklayamadı.
Şaşırtıcı bir karşılaştırma
Sorunu izole etmek için ekip istemci uygulamasını değiştirdi. .NET HttpClient kullanarak aynı ağda 700 Mbps kaydettiler; aynı istek Chromium'un fetch() API'si üzerinden yapıldığında ise 140 Mbps'de takıldı. Bu keskin fark, bir sonraki deney aksini ispatlayana kadar, suçlunun tarayıcının ağ yığını (network stack) olduğuna işaret ediyordu.
Hata ayıklayıcının gizli maliyeti
Playwright ve Puppeteer, Chrome'u Chrome DevTools Protokolü (CDP) aracılığıyla yönetir. Bu protokol, tarayıcı işlemine bir hata ayıklayıcı bağlayarak ağ olaylarını, DOM anlık görüntülerini ve konsol günlüklerini açığa çıkarır. Ekip odaklanmış bir test gerçekleştirdi: bir Uint8Array veri yükü gönderen bir fetch() çağrısı, bir kez CDP hata ayıklayıcısı bağlıyken, bir kez de bağlı değilken yapıldı.
- Hata ayıklayıcı bağlı: 113 Mbps
Hata ayıklayıcının varlığı, yükleme hızını 20 kattan fazla azalttı. Normal bir Edge penceresinde yapılan manuel bir test (hata ayıklayıcı bağlı değilken) 600+ Mbps hıza ulaştı ve tarayıcının kendisinin, engellenmediğinde trafiği yönetebildiğini doğruladı.
Mütevazı ama gerçek bir iyileştirme
Yavaşlamanın büyük bir kısmı hata ayıklayıcıdan kaynaklansa da ekip yine de gerçek bir optimizasyon keşfetti: istek gövdesini (request body) Uint8Array yerine Blob olarak değiştirmek, Chromium'un hızını yaklaşık %30 artırdı. Bu yararlı bir ince ayar olsa da başlangıçta umulan "mucizevi" artışın yanına bile yaklaşamıyor.
Bu mühendisler için neden önemli?
- Ölçüm araçları yalan söyleyebilir. Tarayıcıları otomatikleştiren performans araçları, ölçüm zincirinin kendisidir.
- İmkansız görünen kıyaslamalar bir mantık kontrolü gerektirir. Eğer rakamlar ağ kapasitesinden aşırı derecede sapıyorsa, ilk şüpheli ölçüm ortamı olmalıdır.
- Boş (null) bir sonuç değerlidir. Bir değişikliğin hiçbir şey yapmadığını doğrulamak, hayalet hataların peşinden koşarken harcanacak emeği önler.
- Manuel kontroller ucuz bir sigortadır. Aynı işlemi düz bir tarayıcı penceresinde çalıştırmak, gizli ölçümleme yüklerini (instrumentation overhead) ortaya çıkarabilir.
Karşı görüş: Hata ayıklayıcıların vazgeçilmez olduğu durumlar
Hata ayıklayıcılar; sayfa davranışı, hata izleri ve aksi takdirde erişilemeyecek olan ağ zaman çizelgeleri hakkında görünürlük sağlar. Regresyon testleri, güvenlik denetimleri veya karmaşık kullanıcı arayüzü etkileşimleri için bir CDP hata ayıklayıcısı bağlamak genellikle tartışmaya kapalıdır. Önemli olan, işlevsel testi ham performans ölçümünden ayırmak ve amaç performans ölçümü olduğunda hata ayıklayıcıyı devre dışı bırakmaktır.
Özet: Otomatik testi mümkün kılan araçlar, aynı zamanda performans bozulmasının en büyük kaynağı haline gelebilir. Tarayıcıyı, ağı veya kodu suçlamadan önce, hiçbir hata ayıklayıcının veri akışını sessizce yavaşlatmadığından emin olun.
