Cloudflare ปล่อยโค้ด pingora-limits ตัวนับอีเวนต์ (event) ใน พรอกซี่ Pingora ที่ Cloudflare พัฒนาชึ้นมาใช้งานแทน NGINX โดยตัวเซิร์ฟเวอร์ต้องนับสถิติต่างๆ โดยยังต้องมีประสิทธิภาพสูง ไม่ทำให้บริการโดยรวมช้าลง
Pingora ต้องนับสถิติจากอีเวนต์ต่างๆ ถึง 20 ล้านครั้งต่อวินาที เช่น มีเหตุเซิร์ฟเวอร์ไม่ตอบสนอง เกินจำนวนครั้งที่กำหนดก็ต้องตัดเซิร์ฟเวอร์ตัวนั้นออก โดยตัวนับนี้มีเงื่อนไขว่าต้องรองรับการทำงานแบบขนานอย่างหนัก และขณะที่กำลังเพิ่มค่าที่นับไม่ต้องล็อกหน่วยความจำไปทั้งหมด ไม่เช่นนั้นจะกลายเป็นคอขวดของระบบ
ทาง Cloudflare ใช้โครงสร้างข้อมูล count–min sketch ที่ประสิทธิภาพการนับเป็น O(1) ขณะที่ประสิทธิภาพในแง่ขนาดหน่วยความจำเป็น O(log(n)) โดยกระบวนการนับคะแนนไม่ล็อกหน่วยความจำและแฮชค่ากุญแจของอีเวนต์ทีละหลายๆ รูปแบบ แม้จะมีบางรูปแบบที่แฮชชนกับอีเวนต์อื่นๆ บ้างก็ไม่ต้องสนใจ และเมื่อต้องการดูคะแนนสุดท้ายก็จะดูค่าที่น้อยที่สุดของกุญแจอีเวนต์นั้น
ผลการใช้งานจริงพบว่า pingora-limits ใช้หน่อยความจำน้อยมาก แต่ได้ประสิทธิภาพสูง ตัวโค้ดส่วนนี้เปิดอยู่ใน GitHub
ที่มา - Cloudflare
Comments
ดู code แล้วก็ยังไม่ lock free อยู่ดีArc, Atomic มัน implement lock
ปกติการนับ concurrent transaction มันก็ต้องมี lock อะไรอยู่แล้ว มันต้องเลี่ยงไปใช้ท่าประมาณไหนหรือครับถึงเลี่ยงการ lock ได้?
ผมอ่านข่าวผิดไปหน่อยน่ะครับ "และขณะที่กำลังเพิ่มค่าที่นับไม่ต้องล็อกหน่วยความจำ" ผมอ่านตก "ไปทั้งหมด"
แต่ผมคิดว่าน่าจะทำได้นะครับ แต่ผมก็ยังไม่เคยลองสักที
ที่คิดไว้คือมันต้องเปลี่ยนการ design จากให้ thread ไป access resource
เป็นใช้ action queue ไป access resource แทน ส่วน thread ก็ทำได้แค่สร้าง action ไปใส่ queue
ส่วน queue น่าจะต้องใช้ linked list มันจะได้ไม่ต้อง move ไปไหน
ตอน dequeue (เพื่อ perform access resource) ก็ dequeue จาก head
จะ enqueue ก็เอาไปต่อที่ tail ของ linked list
โอ้ เปล่าครับ ผมแก้ข่าวเองหลังเห็นคอมเมนต์แล้วลืมมาตอบคอมเมนต์ว่าแก้แล้ว
ขออภัยครับ -/\-
lewcpe.com , @wasonliw