Một nhà phát triển đã phát hiện ra rằng việc gắn trình gỡ lỗi (debugger) Chrome DevTools thông qua Playwright hoặc Puppeteer làm giảm tốc độ tải lên dựa trên fetch xuống hơn 20 lần, biến các bài kiểm tra hiệu năng (benchmark) thông thường thành những dữ liệu gây hiểu lầm.
Câu đố khơi nguồn cho cuộc điều tra
Coffer, một kho lưu trữ tệp dựa trên trình duyệt có chức năng mã hóa dữ liệu trước khi gửi đến máy chủ, thường xuyên thực hiện các lượt tải lên ở cấp độ gigabit qua mạng nội bộ. Khi nhóm đo lường tốc độ tải lên, họ nhận thấy một sự chênh lệch: tốc độ tải xuống đạt mức bão hòa băng thông, nhưng tốc độ tải lên lại chậm chạp, chỉ bằng khoảng 1/8 băng thông khả dụng. Sự sai lệch này đã dẫn đến ba vòng thay đổi mã nguồn nhưng không mang lại kết quả gì đáng kể, cho đến khi một "bản sửa lỗi" thứ tư dường như mang lại sự gia tăng đột biến—nhưng rồi lại biến mất ngay khi trình gỡ lỗi được gỡ bỏ.
Những gì nhóm đã thử đầu tiên
Các kỹ sư đã tìm kiếm những nguyên nhân thông thường:
- Kích thước chunk (Chunk size) – Việc tăng gấp đôi kích thước khối từ 16 MiB lên 32 MiB không làm thay đổi thông lượng.
- Pipelining – Việc thực hiện mã hóa khối tiếp theo song song với quá trình tải lên hiện tại chỉ mang lại mức tăng khiêm tốn 13%, không thể phân biệt được với sai số đo lường.
- Tính đồng thời (Concurrency) – Chạy nhiều lượt tải lên song song vẫn bị giới hạn ở cùng một tổng tốc độ, cho thấy có một mức trần chung.
Không có sự thay đổi nào trong số này giải thích được việc tốc độ bị chậm đi 8 lần.
Một cuộc so sánh đối đầu đầy bất ngờ
Để cô lập vấn đề, nhóm đã thay đổi cách triển khai phía client. Sử dụng .NET HttpClient, họ ghi nhận tốc độ 700 Mbps trên cùng một mạng; trong khi cùng một yêu cầu được thực hiện từ API fetch() của Chromium thì chỉ dừng lại ở mức 140 Mbps. Sự tương phản rõ rệt này đã chỉ ra ngăn xếp mạng (network stack) của trình duyệt là thủ phạm—cho đến khi thí nghiệm tiếp theo chứng minh điều ngược lại.
Cái giá tiềm ẩn của trình gỡ lỗi
Playwright và Puppeteer điều khiển Chrome thông qua Chrome DevTools Protocol (CDP). Giao thức đó gắn một trình gỡ lỗi vào tiến trình trình duyệt, cho phép truy cập các sự kiện mạng, ảnh chụp DOM (DOM snapshots) và nhật ký console. Nhóm đã thực hiện một bài kiểm tra tập trung: một lệnh gọi fetch() gửi một payload Uint8Array, một lần có gắn trình gỡ lỗi CDP và một lần không.
- Có gắn trình gỡ lỗi: 113 Mbps
Sự hiện diện của trình gỡ lỗi đã làm giảm tốc độ tải lên hơn 20 lần. Một thử nghiệm thủ công trên cửa sổ Edge thông thường—không gắn trình gỡ lỗi—đã đạt mức trên 600 Mbps, xác nhận rằng bản thân trình duyệt có thể xử lý lưu lượng truy cập khi không bị cản trở.
Một cải tiến thực tế khiêm tốn
Mặc dù trình gỡ lỗi chiếm phần lớn nguyên nhân gây chậm, nhóm vẫn phát hiện ra một sự tối ưu hóa thực sự: việc chuyển đổi thân yêu cầu (request body) từ Uint8Array sang Blob đã giúp tăng tốc độ của Chromium lên khoảng 30%. Đây là một tinh chỉnh hữu ích, nhưng vẫn chưa đạt tới mức tăng trưởng "thần kỳ" như kỳ vọng ban đầu.
Tại sao điều này lại quan trọng đối với các kỹ sư
- Các công cụ đo lường có thể gây sai lệch. Các công cụ hiệu năng dùng để tự động hóa trình duyệt bản thân chúng cũng là một phần của chuỗi đo lường.
- Các kết quả benchmark trông có vẻ bất khả thi cần được kiểm tra lại tính hợp lý. Nếu các con số chênh lệch quá lớn so với dung lượng mạng, môi trường đo lường nên là đối tượng bị nghi ngờ đầu tiên.
- Một kết quả không thay đổi (null result) vẫn rất giá trị. Việc xác nhận rằng một thay đổi không mang lại tác dụng gì sẽ giúp tránh lãng phí công sức chạy theo những lỗi "ma".
- Kiểm soát thủ công là một phương án bảo hiểm rẻ tiền. Chạy cùng một thao tác trên một cửa sổ trình duyệt thông thường có thể tiết lộ các chi phí phát sinh (overhead) tiềm ẩn từ việc đo lường.
Quan điểm ngược lại: khi trình gỡ lỗi là không thể thiếu
Trình gỡ lỗi cung cấp khả năng quan sát hành vi trang, vết lỗi (error traces) và dòng thời gian mạng (network timelines) mà nếu không có chúng ta sẽ không thể tiếp cận được. Đối với kiểm thử hồi quy (regression testing), kiểm toán bảo mật hoặc các tương tác UI phức tạp, việc gắn trình gỡ lỗi CDP thường là điều bắt buộc. Chìa khóa là phải tách biệt giữa kiểm thử chức năng và đo lường hiệu năng thuần túy, đồng thời tắt trình gỡ lỗi khi mục tiêu là đo lường hiệu năng.
Bài học rút ra: Các công cụ giúp việc kiểm thử tự động trở nên khả thi cũng có thể trở thành nguồn gây biến dạng hiệu năng lớn nhất. Trước khi đổ lỗi cho trình duyệt, mạng hoặc mã nguồn, hãy xác minh rằng không có trình gỡ lỗi nào đang âm thầm làm chậm luồng dữ liệu.
