- QUIC เป็นโปรโตคอลที่ถูกคาดหวังว่าจะนำมาซึ่งการเปลี่ยนแปลงครั้งสำคัญในการเพิ่มประสิทธิภาพของเว็บแอปพลิเคชัน แต่ประสิทธิภาพกลับไม่เป็นไปตามที่คาดหวัง
- บทความวิจัยนี้วิเคราะห์ประสิทธิภาพของ QUIC บนเครือข่ายความเร็วสูงอย่างเป็นระบบ
บทคัดย่อ
- บนอินเทอร์เน็ตความเร็วสูง สแตก UDP+QUIC+HTTP/3 แสดงอัตราการส่งข้อมูลลดลงสูงสุด 45.2% เมื่อเทียบกับ TCP+TLS+HTTP/2
- ช่องว่างด้านประสิทธิภาพระหว่าง QUIC และ HTTP/2 จะยิ่งกว้างขึ้นเมื่อแบนด์วิดท์พื้นฐานเพิ่มขึ้น
- ปัญหานี้พบได้ทั้งในไคลเอนต์รับส่งข้อมูลแบบเบาและเว็บเบราว์เซอร์หลัก (Chrome, Edge, Firefox, Opera) บนโฮสต์หลากหลายประเภท (เดสก์ท็อป, มือถือ) และเครือข่ายหลากหลายแบบ (บรอดแบนด์แบบมีสาย, เซลลูลาร์)
- ส่งผลกระทบไม่ใช่แค่การโอนไฟล์ แต่รวมถึงแอปพลิเคชันหลากหลายประเภท เช่น การสตรีมวิดีโอ (บิตเรตวิดีโอลดลงสูงสุด 9.8%) และการท่องเว็บ
- ระบุสาเหตุรากของปัญหาผ่านการวิเคราะห์ packet trace อย่างเข้มงวด รวมถึงการทำโปรไฟล์ในเคอร์เนลและ user space
- โดยเฉพาะอย่างยิ่ง พบว่าโอเวอร์เฮดการประมวลผลฝั่งตัวรับสูงจากแพ็กเก็ตข้อมูลจำนวนมากเกินไปและ ACK ของ QUIC ที่ทำใน user space
- เสนอคำแนะนำเชิงรูปธรรมเพื่อบรรเทาปัญหาด้านประสิทธิภาพที่สังเกตพบ
สาเหตุรากของประสิทธิภาพที่ลดลง
- เกิดโอเวอร์เฮดจากการประมวลผลแพ็กเก็ตมากเกินไปที่ระดับเคอร์เนลฝั่งตัวรับ
- QUIC ไม่ได้ใช้ UDP GRO (Generic Receive Offload) จึงต้องประมวลผลแพ็กเก็ตมากกว่า TCP อย่างมาก
- ยืนยันได้จากจำนวนครั้งที่มีการเรียกฟังก์ชัน
netif_receive_skb ซึ่งสูงกว่าใน QUIC อย่างชัดเจน
- เกิดโอเวอร์เฮดจากการประมวลผลแพ็กเก็ตมากเกินไปใน user space ของ QUIC เช่นกัน
- มีโอเวอร์เฮดสูงในการจัดการแพ็กเก็ตจำนวนมากที่เคอร์เนลส่งขึ้นมา
- การสร้าง QUIC ACK ใน user space ก็เป็นอีกสาเหตุของโอเวอร์เฮด
ข้อเสนอเพื่อบรรเทาประสิทธิภาพที่ลดลง
- นำ UDP GRO มาใช้ฝั่งตัวรับ
- ลดจำนวนแพ็กเก็ตที่ต้องประมวลผลในสแตก UDP เพื่อลดโอเวอร์เฮดทั้งในเคอร์เนลและ user space
- อย่างไรก็ตาม การนำ UDP GRO ไปใช้งานจริงในสภาพแวดล้อมไคลเอนต์ที่หลากหลายอาจไม่ใช่เรื่องง่าย
- ปรับปรุงโซลูชัน offloading เช่น GSO/GRO ให้เหมาะกับ QUIC
- รองรับการ offload แม้เป็นชุดของแพ็กเก็ต UDP ที่มีขนาดต่างกัน
- เพิ่มการตั้งค่า pacing ที่เหมาะสมให้กับ GSO เพื่อป้องกันความแออัดของเครือข่าย
- ปรับแต่งลอจิก QUIC ฝั่งตัวรับให้เหมาะสม
- หน่วงเวลาการส่ง QUIC ACK เพื่อลดโอเวอร์เฮดจากการสร้างการตอบสนอง
- ใช้
recvmmsg เพื่ออ่านแพ็กเก็ต UDP หลายรายการพร้อมกันและปรับปรุงประสิทธิภาพ
- ใช้การดาวน์โหลดแบบหลายเธรด
- สำหรับไฟล์ขนาดใหญ่ การดาวน์โหลดแบบหลายเธรดที่ใช้หลายคอร์ของ CPU อาจช่วยเพิ่มประสิทธิภาพการรับข้อมูลได้
- แต่ต้องคำนึงถึงประเด็นด้านความเป็นธรรมด้วย
1 ความคิดเห็น
ความเห็นจาก Hacker News
syscallซับซ้อน และ API พื้นฐานก็ช้าเกินไปเมื่อเทียบกับแพ็กเก็ตขนาดทั่วไป (ประมาณ 1500 ไบต์)syscallสูงขึ้นจากการบรรเทา Spectreuringซับซ้อน แต่ก็ยังต้องการ API ระดับกลาง