Розробник виявив, що підключення дебагера Chrome DevTools через Playwright або Puppeteer обмежує швидкість завантаження через fetch більш ніж у 20 разів, перетворюючи звичайні тести продуктивності на оманливі дані.
Загадка, що спонукала до розслідування
Coffer — це браузерне сховище файлів, яке шифрує дані перед відправкою на сервер, і воно регулярно здійснює завантаження гігабітного класу через локальну мережу. Коли команда вимірювала швидкість завантаження, вони помітили розрив: завантаження (downloads) насичували канал, але відправка (uploads) просувалася приблизно на одну восьму від доступної пропускної здатності. Ця невідповідність призвела до трьох раундів змін у коді, які не дали жодного результату, аж поки четверне «виправлення» не продемонструвало величезний стрибок — який, проте, зник, щойно дебагер було вимкнено.
Що команда спробувала спочатку
Інженери шукали звичних «підозрюваних»:
- Розмір чанка (Chunk size) — подвоєння блоку з 16 MiB до 32 MiB не змінило пропускну здатність.
- Конвеєризація (Pipelining) — паралельне шифрування наступного блоку під час поточного завантаження дало скромне зростання на 13 %, що було не відрізнити від похибки вимірювання.
- Паралелізм (Concurrency) — запуск кількох завантажень одночасно зупинявся на тій самій загальній швидкості, що вказувало на наявність глобального обмеження.
Жодна з цих варіацій не пояснювала 8-кратне уповільнення.
Несподіване пряме порівняння
Щоб ізолювати проблему, команда змінила реалізацію клієнта. Використовуючи .NET HttpClient, вони зафіксували 700 Мбіт/с у тій самій мережі; той самий запит, зроблений через Chromium’s fetch() API, зупинявся на позначці 140 Мбіт/с. Така різниця вказувала на мережевий стек браузера як на винуватця — доки наступний експеримент не довів зворотне.
Прихована ціна дебагера
Playwright та Puppeteer керують Chrome через Chrome DevTools Protocol (CDP). Цей протокол підключає дебагер до процесу браузера, відкриваючи доступ до мережевих подій, знімків DOM та логів консолі. Команда провела цілеспрямований тест: виклик fetch(), що надсилає корисне навантаження у форматі Uint8Array, один раз із підключеним CDP-дебагером і один раз без нього.
- Дебагер підключено: 113 Мбіт/с
Наявність дебагера знизила швидкість завантаження більш ніж у 20 разів. Ручний тест у звичайному вікні Edge — без підключеного дебагера — досяг 600+ Мбіт/с, що підтвердило: браузер сам по собі може справлятися з трафіком, коли він не обтяжений зайвими процесами.
Скромне, але реальне покращення
Хоча дебагер був основною причиною уповільнення, команда все ж знайшла справжню оптимізацію: перехід від Uint8Array до Blob у тілі запиту підвищив швидкість Chromium приблизно на 30 %. Це корисне налаштування, але воно навіть близько не наближає до того «чудового» стрибка, на який спочатку сподівалися.
Чому це важливо для інженерів
- Інструменти можуть брехати. Інструменти продуктивності, які автоматизують роботу браузерів, самі є частиною ланцюга вимірювань.
- Бенчмарки, що виглядають неможливими, потребують перевірки на адекватність. Якщо цифри сильно розходяться з пропускною здатністю мережі, першим підозрюваним має бути середовище вимірювання.
- Нульовий результат є цінним. Підтвердження того, що зміна нічого не дає, дозволяє не витрачати зусилля на пошук фантомних багів.
- Ручне керування — це дешева страховка. Запуск тієї ж операції у звичайному вікні браузера може виявити приховані накладні витрати на інструментацію.
Контраргумент: коли дебагери незамінні
Дебагери забезпечують видимість поведінки сторінки, трасування помилок та часові шкали мережі, які інакше неможливо отримати. Для регресійного тестування, аудитів безпеки або складних UI-взаємодій підключення CDP-дебагера часто є обов'язковим. Головне — розділяти функціональне тестування та чисте вимірювання продуктивності, вимикаючи дебагер, коли метою є саме друге.
Висновок: Інструменти, які роблять автоматизоване тестування можливим, також можуть стати найбільшим джерелом спотворення показників продуктивності. Перш ніж звинувачувати браузер, мережу чи код, переконайтеся, що жоден дебагер непомітно не обмежує потік даних.
