How Cloudflare Solved a Congestion Bug in quiche
KẾT LUẬN
Cloudflare phát hiện và sửa một lỗi tắc nghẽn trong quiche khi thuật toán CUBIC rơi vào vòng lặp phục hồi vô hạn dưới điều kiện mất gói cao ở đầu kết nối. Nguyên nhân gốc rễ đến từ cách tính idle time không chính xác: khi inflight bytes về 0 trong slow start, idle period optimization trở thành lời tiên tri tự ứng nghiệm, giữ CUBIC kẹt vĩnh viễn trong trạng thái recovery. Bản vá cực kỳ đơn giản — chỉ một dòng code — đo idle time từ cả ACK cuối cùng nhận được thay vì chỉ từ dữ liệu cuối cùng gửi đi, đủ để phá vỡ vòng lặp và khôi phục pass rate 100%.
LUẬN ĐIỂM CHÍNH
- CUBIC trong quiche không thể phục hồi congestion window khi gặp mất gói nặng ở đầu kết nối, khiến ~60% test case không hoàn thành trước timeout 10 giây trong mô phỏng 100 lần chạy
- Nguyên nhân gốc rễ là vòng lặp phục hồi vô hạn: khi inflight bytes chạm 0 trong slow start, idle period optimization khiến CUBIC dao động liên tục giữa congestion avoidance và recovery — 999 lần chuyển trạng thái trong ~6.7 giây, tương đương ~1 lần mỗi 14ms (gần bằng RTT 10ms)
- Bản vá chỉ cần một dòng code: thay vì đo idle time từ dữ liệu cuối cùng gửi đi, team đo thêm từ ACK cuối cùng nhận được — đủ để phá vỡ vòng lặp và đưa test pass rate về 100%
- Vấn đề bắt nguồn từ một thay đổi trong Linux kernel (commit 30927520dbae) nhằm sửa lỗi TCP, nhưng tác dụng phụ đã gây ra bug này trong quiche
LUẬN ĐIỂM PHỤ
- Các test thất bại trong integration test pipeline của ingress proxy đều có điểm chung: đánh giá CUBIC trong kịch bản mất gói nặng ở giai đoạn đầu kết nối
- Khi thay CUBIC bằng thuật toán Reno, test pass 100%, chứng tỏ vấn đề nằm riêng ở CUBIC chứ không phải lỗi hệ thống rộng hơn
- Một người dùng Reddit (RelevantKnowledge485) cũng gặp vấn đề tương tự với high-frequency timer-dependent workloads, nơi C-state transitions gây ra latency spikes — debugging approach tương quan giữa kernel power management và protocol-level retransmit behavior được đánh giá cao
LUẬN CỨ & VÍ DỤ
- Mô phỏng thực tế: client tải file 10MB qua HTTP/3 với RTT 10ms, 30% mất gói ngẫu nhiên trong 2 giây đầu — 60% trong 100 lần chạy không hoàn thành trước timeout 10 giây, xác nhận bug quan sát được trong integration test pipeline
- Instrumentation ghi nhận 999 lần chuyển trạng thái trong ~6.7 giây (~1 lần mỗi 14ms), gần đúng bằng RTT 10ms — dấu hiệu rõ ràng của vòng lặp phục hồi vô hạn, congestion window không tăng trưởng sau giai đoạn mất gói
- Commit fix trên GitHub (62022d1cd7): thay đổi cách đo idle time từ last sent data only thành last sent data + last ACK received — phá vỡ vòng lặp, congestion window phục hồi bình thường, pass rate về 100%
Nguồn: InfoQ | Phân tích bởi AI
Ban thay bai viet nay the nao?
Bình luận (0)
Bài viết liên quan
Gợi ý dựa trên điểm tương quan phân cấp và danh mục chung
Không có bài viết nào đạt ngưỡng tương quan này. Hãy thử kéo thanh trượt sang trái.
--- Het ---