Mozilla ได้เปลี่ยน UDP networking stack เก่าของ Firefox ให้เป็น implementation ที่ใช้ Rust สมัยใหม่เรียบร้อยแล้ว ซึ่งให้ประสิทธิภาพที่น่าประทับใจสำหรับ HTTP/3 traffic โครงการนี้ใช้เวลากว่าหนึ่งปีในการทำให้เสร็จสมบูรณ์ และแสดงให้เห็นว่าการอัปเดต networking code ที่มีอายุหลายทศวรรษสามารถปลดล็อกการปรับปรุงความเร็วในการท่องเว็บได้อย่างมีนัยสำคัญ
ประสิทธิภาพเพิ่มขึ้นอย่างมหาศาลในสถานการณ์ที่ CPU เป็นคอขวด
implementation ใหม่ให้ผลลัพธ์ที่น่าทึ่งในสภาพแวดล้อมการทดสอบ Firefox ตอนนี้สามารถทำ throughput ได้สูงถึง 4 Gbps เมื่อเทียบกับน้อยกว่า 1 Gbps ในระบบเก่า ซึ่งเป็นการปรับปรุงถึง 400% ในกรณีที่รุนแรง การเพิ่มขึ้นนี้เกิดจากการเปลี่ยนจาก NSPR (Netscape Portable Runtime) library ที่ล้าสมัยไปเป็น quinn-udp ซึ่งเป็น UDP library สมัยใหม่ที่สร้างขึ้นสำหรับ Quinn QUIC project
การเพิ่มประสิทธิภาพนี้มีความสำคัญเพราะประมาณ 20% ของ HTTP traffic ของ Firefox ตอนนี้ใช้ HTTP/3 ซึ่งทำงานผ่าน QUIC และ UDP protocols ทุกครั้งที่คุณโหลดเว็บไซต์ที่ใช้ HTTP/3 เบราว์เซอร์ของคุณจะจัดการกับ UDP network activity จำนวนมากเบื้องหลัง
การเปรียบเทียบประสิทธิภาพ
- ระบบ NSPR เดิม: throughput น้อยกว่า 1 Gbps
- ระบบ quinn-udp ใหม่: throughput สูงสุดถึง 4 Gbps
- การปรับปรุง: เพิ่มขึ้น 400% ในสถานการณ์ที่ขึ้นอยู่กับ CPU
- ทราฟฟิก HTTP/3: ประมาณ 20% ของทราฟฟิก HTTP ทั้งหมดของ Firefox
System Calls สมัยใหม่ปลดล็อกศักยภาพที่ซ่อนอยู่
กุญแจสำคัญของการปรับปรุงเหล่านี้อยู่ที่การใช้ฟีเจอร์ขั้นสูงของระบบปฏิบัติการที่ไม่มีอยู่ตอนที่ networking code เดิมของ Firefox ถูกเขียนขึ้น ระบบสมัยใหม่มี batching capabilities ผ่าน APIs อย่าง sendmmsg และ recvmmsg ซึ่งสามารถจัดการ network packets หลายตัวพร้อมกันแทนที่จะประมวลผลทีละตัว บางแพลตฟอร์มยังรองรับ segmentation offloading ซึ่ง network card เองจะจัดการแบ่งข้อมูลขนาดใหญ่เป็น packets ขนาดเล็ก
อย่างไรก็ตาม การสนทนาในชุมชนเผยให้เห็นว่าแม้แต่การเพิ่มขึ้นที่น่าประทับใจเหล่านี้อาจยังทิ้งประสิทธิภาพที่สำคัญไว้ การวิเคราะห์ทางเทคนิคชี้ให้เห็นว่าระบบพื้นฐานสามารถจัดการ throughput ที่สูงกว่านี้ได้ในทางทฤษฎี ซึ่งชี้ไปที่ bottlenecks ในส่วนอื่นของ networking stack
คุณสมบัติทางเทคนิค
- ความปลอดภัยของหน่วยความจำ: การใช้งาน Rust แทนที่โค้ด NSPR ที่ใช้ C
- การรองรับ ECN: ~50% ของการเชื่อมต่อ QUIC ใน Firefox Nightly ใช้ ECN
- การประมวลผลแบบกลุ่ม: sendmmsg/recvmmsg สำหรับการประมวลผลแพ็กเก็ตหลายตัว
- การถ่ายโอนงานการแบ่งส่วน: GSO/GRO บน Linux, USO/URO บน Windows (ปิดใช้งาน)
ความท้าทายเฉพาะแพลตฟอร์มสร้างปัญหาปวดหัว
ในขณะที่การ implementation บน Linux ดำเนินไปอย่างราบรื่นด้วยการรองรับฟีเจอร์ขั้นสูงอย่างเต็มรูปแบบ แพลตฟอร์มอื่นๆ กลับนำเสนออุปสรรคที่สำคัญ ฟีเจอร์ UDP Segmentation Offload (USO) ของ Windows ต้องถูกปิดใช้งานหลังจากที่ทำให้เกิด packet loss และแม้แต่ network driver crashes ในบางระบบ มี bug ที่น่าสับสนเป็นพิเศษที่ส่งผลกระทบต่ออุปกรณ์ Windows on ARM ที่เปิดใช้งาน WSL ซึ่งระบบไม่สามารถกำหนดขนาด packet ได้อย่างถูกต้อง
macOS มาพร้อมกับความซับซ้อนของตัวเองแม้จะมี batch processing APIs ที่ไม่มีเอกสารอย่าง sendmmsg_nocopy และ recvmmsg_nocopy Mozilla ตัดสินใจไม่ใช้ฟีเจอร์เหล่านี้ใน production ในที่สุด เนื่องจากกังวลว่า Apple อาจลบออกโดยไม่แจ้งให้ทราบล่วงหน้า
Android พิสูจน์ให้เห็นว่าเป็นความท้าทายเป็นพิเศษ โดย Firefox ยังคงรองรับอุปกรณ์ Android 5 ที่มีอายุกว่า 10 ปี แพลตฟอร์มเก่าแก่นี้ต้องการ workarounds สำหรับ security filters และขาดการรองรับฟีเจอร์ networking สมัยใหม่ ทำให้นักพัฒนาต้องรักษาความเข้ากันได้กับระบบที่ล้าสมัยอย่างรุนแรง
สถานะการรองรับแพลตฟอร์ม
- Linux: เปิดใช้งานการรองรับ GSO/GRO แบบเต็มรูปแบบ
- Windows: ปิดการใช้งาน USO เนื่องจากปัญหาการสูญเสียแพ็กเกตและไดรเวอร์ขัดข้อง
- macOS: มี batch APIs ที่ไม่มีเอกสารแนะนำแต่ไม่ได้ใช้ในการผลิตจริง
- Android: การรองรับแบบจำกัด รักษาความเข้ากันได้กับ Android 5 (อายุ 10+ ปี)
ความปลอดภัยและประโยชน์ในอนาคต
นอกเหนือจากประสิทธิภาพดิบแล้ว implementation ที่ใช้ Rust ยังให้ข้อได้เปรียบด้าน memory safety เหนือโค้ดที่ใช้ C ก่อนหน้านี้ ระบบใหม่ยังเปิดใช้งานการรองรับ Explicit Congestion Notification (ECN) ในทุกแพลตฟอร์มหลัก โดย Firefox Nightly แสดงให้เห็นว่าประมาณ 50% ของ QUIC connections ตอนนี้ใช้ ECN
โครงการนี้แสดงให้เห็นทั้งศักยภาพและความท้าทายของการทำให้โครงสร้างพื้นฐานของเบราว์เซอร์ทันสมัย ในขณะที่การปรับปรุงประสิทธิภาพมีความสำคัญ ประสบการณ์นี้เน้นย้ำว่าความไม่สอดคล้องกันของแพลตฟอร์มและข้อกำหนดการรองรับ legacy สามารถทำให้การปรับปรุงที่ตรงไปตรงมาซับซ้อนได้
หมายเหตุทางเทคนิค: QUIC เป็น transport protocol สมัยใหม่ที่ออกแบบมาเพื่อปรับปรุงประสิทธิภาพเว็บ ในขณะที่ UDP (User Datagram Protocol) เป็น network protocol พื้นฐานที่ QUIC ใช้สำหรับการส่งข้อมูล
อ้างอิง: Fast UDP I/O for Firefox in Rust