แรงจูงใจ
- เครือข่ายทั่วโลกของ Cloudflare รองรับคำขอ HTTP มากกว่า 60 ล้านรายการต่อวินาที
- ลดการใช้ CPU และเพิ่มความสามารถในการประมวลผลของ CDN ด้วย Rust crate โอเพนซอร์สตัวใหม่
- Pingora เป็นแกนหลักของบริการพร็อกซีที่พัฒนาด้วย Rust ของ Cloudflare และถูกเปิดซอร์สแล้ว
- บริการ Pingora-origin ทำหน้าที่ส่งต่อคำขอของผู้ใช้ไปยังปลายทางจริง
- เมื่อคำขอออกจาก Cloudflare จำเป็นต้องลบข้อมูลภายในออก
- งานนี้เกิดขึ้นบ่อยมากและกินการใช้ CPU ถึง 1.7%
การทำเบนช์มาร์ก
- ใช้ Rust crate ชื่อ Criterion เพื่อวัดประสิทธิภาพของฟังก์ชันในระดับนาโนวินาที
- เดิมฟังก์ชัน
clear_internal_headers ใช้เวลาเฉลี่ย 3.65µs
ลดงานอ่านข้อมูล
- ลดงานอ่านข้อมูลด้วยการกลับทิศทางการลบเฮดเดอร์
- การเปลี่ยนแปลงนี้ทำให้เวลาทำงานของฟังก์ชันดีขึ้นจาก 3.65µs เหลือ 1.53µs
- ลดการใช้ CPU จาก 1.71% เหลือ 0.717%
การค้นหาโครงสร้างข้อมูล
- ลองใช้แฮชแมปเพื่อจัดเก็บและค้นหาเฮดเดอร์ภายใน
- เวลาอ่านของแฮชแมปเพิ่มขึ้นแบบเชิงเส้นตามความยาวของคีย์
- ได้ลองโครงสร้างข้อมูลอื่น ๆ เช่น เซตแบบเรียงลำดับหรือ state machine
- การติดตั้งใช้งานที่ใช้ regular expression ช้ากว่าแฮชแมป 2 เท่า
การใช้ trie
- trie คือโครงสร้างข้อมูลแบบต้นไม้ที่ใช้กับการค้นหาคำนำหน้าหรือระบบเติมคำอัตโนมัติ
- trie สามารถระบุได้อย่างรวดเร็วว่าไม่มีสตริงนั้นอยู่
- การติดตั้งใช้งาน trie ที่มีอยู่เดิมช้ากว่าแฮชแมป
- Cloudflare จึงพัฒนา trie เวอร์ชันปรับแต่งของตัวเองชื่อ trie-hard
Trie Hard
- trie-hard เก็บความสัมพันธ์ของโหนดไว้ในบิตของจำนวนเต็มและใช้หน่วยความจำแบบต่อเนื่องเพื่อเพิ่มความเร็ว
- ลดเวลาทำงานของฟังก์ชัน
clear_internal_headers ลงเหลือ 0.93µs
- ลดการใช้ CPU จาก 1.71% เหลือ 0.43%
- ในสภาพแวดล้อมโปรดักชันจริง ประสิทธิภาพของ trie-hard สอดคล้องกับผลเบนช์มาร์ก
บทสรุป
- การระบุส่วนที่ช้าของโค้ดและปรับแต่งมันเป็นสิ่งสำคัญ
- การปรับแต่งเล็ก ๆ หลายจุดสามารถรวมกันเป็นการเพิ่มประสิทธิภาพครั้งใหญ่ได้
- Cloudflare Connected Cloud มอบความสามารถอย่างการปกป้องเครือข่าย การเร่งความเร็วแอปพลิเคชันอินเทอร์เน็ต และการป้องกันการโจมตี DDoS
สรุปโดย GN⁺
- Cloudflare ลดการใช้ CPU และเพิ่มความสามารถในการประมวลผลของ CDN ผ่าน Rust crate โอเพนซอร์สตัวใหม่
- ปรับแต่งงานลบเฮดเดอร์ภายในของบริการ Pingora-origin จนลดการใช้ CPU ได้ 1.28%
- พัฒนา trie เวอร์ชันปรับแต่งของตนเองชื่อ trie-hard เพื่อยกระดับประสิทธิภาพอย่างมาก
- บทความนี้เน้นความสำคัญของการปรับแต่งโค้ดและการเลือกโครงสร้างข้อมูล พร้อมแสดงให้เห็นว่าการปรับแต่งเล็ก ๆ สามารถนำไปสู่การเพิ่มประสิทธิภาพครั้งใหญ่ได้
- โครงการที่มีฟังก์ชันคล้ายกัน ได้แก่ NGINX และ HAProxy
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
มีการคาดเดาหลายอย่างเกี่ยวกับวิธีที่ Cloudflare จัดเก็บและลบเฮดเดอร์ภายใน
ตอนแรกคิดว่าการแมปอักขระ UTF-8 เป็นบิตมาสก์นั้นไม่มีประสิทธิภาพ
a-zและอักขระพิเศษอีกหกตัวได้A-Zและอักขระพิเศษอีกหกตัวได้มีข้อสงสัยว่าการปรับแต่งของ Cloudflare คุ้มค่าหรือไม่
ไม่ค่อยรู้เรื่องการปรับแต่งโครงสร้างข้อมูลมากนัก แต่แปลกใจที่ตัด hash table ออกไปอย่างรวดเร็ว
ใช้โครงสร้างข้อมูลแบบ fancy เพื่อกำหนดรายการที่จะลบ แล้วลบจาก header map ตามนั้น
remove_headerในที่สุดก็มีบล็อกโพสต์ที่ใช้ trie
สงสัยว่าได้ลองใช้ Bloom Filter ขนาดเล็กหรือไม่
สงสัยว่ากรณีจับคู่กับชุดรายการแบบคงที่ ได้ลองใช้ perfect hash table หรือไม่
การปรับแต่งนี้น่าสนใจ
สงสัยว่าทำไม regex crate ถึงทำงานได้ไม่ดีกว่า