11 คะแนน โดย kunggom 2020-03-27 | 3 ความคิดเห็น | แชร์ทาง WhatsApp

Cloudflare ได้โพสต์บล็อกเล่าประสบการณ์การปรับกลยุทธ์แคช จนสามารถลดภาระการเขียนลงบน SSD ได้สูงสุดถึง 25% (ภาษาอังกฤษ) โดยสวนทางกับความเชื่อทั่วไป Cloudflare บรรลุเป้าหมายนี้ด้วยวิธีจงใจแคชไอเท็มที่ไม่ได้ถูกเข้าถี่มากไว้ในหน่วยความจำด้วย

SSD เป็นสื่อบันทึกข้อมูลที่เปราะบางต่อการเขียน เซลล์แฟลชเมมโมรีที่ใช้เก็บข้อมูลบน SSD มีข้อจำกัดด้านจำนวนครั้งที่เขียนซ้ำได้ และการลบข้อมูลที่เคยเขียนแล้วเพื่อเขียนใหม่ก็ใช้เวลาค่อนข้างนาน อีกทั้งยังทำให้การอ่านช้าลงไปด้วย ดังนั้นสำหรับ SSD โดยเฉพาะแล้ว การลดงานเขียนจึงเป็นการปรับแต่งที่สำคัญ

Cloudflare เป็นบริษัทที่ใช้ NVMe SSD ประสิทธิภาพสูงจำนวนมากในเซิร์ฟเวอร์ จึงต้องให้ความสำคัญกับเรื่องนี้โดยธรรมชาติ Cloudflare เป็นผู้ให้บริการ CDN ซึ่งในแก่นแท้แล้ว CDN ก็ถือเป็นแคชเครือข่ายขนาดใหญ่นั่นเอง เนื้อหาที่ถูกเก็บไว้บน SSD ของเซิร์ฟเวอร์ Cloudflare ก็เป็นไอเท็มที่ถูกแคชไว้เช่นกัน และจากการสังเกตพบว่าในบรรดาไอเท็มเหล่านั้น มีจำนวนมากที่เมื่อถูกแคชแล้วก็ไม่ถูกเข้าถึงอีกเลย (หรือที่เรียกว่า “one hit wonder”) ดังนั้นคงดีกว่าหากไม่เขียนไอเท็มเหล่านี้ลง SSD ผลการทดลองแนวทางที่ไม่บันทึกไอเท็มที่ถูกเข้าถึงเพียงครั้งเดียวลง SSD แสดงผลที่น่าสนับสนุน คือช่วยลด latency ของ SSD ได้เกือบ 5%

ปัญหาคือจะนำไอเดียนี้ไปใช้ในระดับบริการจริงได้อย่างไร การไม่แคชตั้งแต่ครั้งแรก และเริ่มแคชตั้งแต่ครั้งที่สองเป็นต้นไป หมายความว่าการเข้าถึงต้นทางของข้อมูลจะเพิ่มขึ้นเป็น 2 เท่า แน่นอนว่าย่อมก่อให้เกิดต้นทุนหลายด้าน ซึ่งกลายเป็นการแก้ปัญหาผิดจุด Cloudflare จึงจัดชั้นการเขียนแคชออกเป็น 2 ระดับ โดยเริ่มจากแคชไอเท็มทั้งหมดไว้ในหน่วยความจำซึ่งเป็น ‘แคชระยะสั้น’ ก่อน จากนั้นจึง “เลื่อนขั้น” เฉพาะไอเท็มที่ถูกเข้าถึงหลายครั้งไปเขียนลง SSD ซึ่งเป็น ‘แคชถาวร’ เมื่อเป็นเช่นนี้ ไอเท็มที่มีความถี่ในการเข้าถึงต่ำก็จะค่อย ๆ ถูกเบียดออกจากแคชไปเอง ส่วนการอ่านนั้นไม่ต้องกังวลเป็นพิเศษ เพราะการอ่านจาก SSD นั้นระบบปฏิบัติการแคชไว้อยู่แล้วอย่างดี

แน่นอนว่าการนำแนวคิดนี้ไปใช้กับบริการจริงทำอย่างระมัดระวังและค่อนข้างอนุรักษนิยม แนวคิดนี้โดยพื้นฐานแล้วใช้หน่วยความจำมาก ซึ่งอาจแย่งทรัพยากรกับแคชเดิมของระบบปฏิบัติการได้ หรือในช่วงที่อัปเดตโปรเซสบนเซิร์ฟเวอร์แบบไม่หยุดให้บริการ อาจเกิดภาวะหน่วยความจำไม่พอชั่วคราวจนส่งผลให้คุณภาพบริการแย่ลงได้ เพราะฉะนั้นแนวคิดนี้จึงค่อย ๆ ถูกนำไปใช้แบบเป็นขั้นเป็นตอน เฉพาะบนเซิร์ฟเวอร์รุ่นใหม่ที่มีหน่วยความจำเพียงพอ

ผลลัพธ์หลังนำมาใช้เป็นไปในทางบวก หลังจากปรับแต่งขนาดแคชไปพร้อมกับใช้งานจริง พบว่าการเขียนลง SSD ลดลง 20% และสูงสุดถึง 25% ซึ่งนำไปสู่การลด latency ด้วย ในอนาคต Cloudflare ระบุว่าจะขยายเทคนิคนี้ไปยังเซิร์ฟเวอร์มากขึ้น ปรับปรุงอัลกอริทึมการเลื่อนขั้นให้ดีขึ้น พร้อมทั้งเพิ่มการ “ลดขั้น” และสร้างโครงสร้างแบบหลายชั้นที่คำนึงถึงไม่ใช่แค่ SSD แต่รวมถึง HDD ด้วย

สิ่งแรกที่นึกขึ้นได้เมื่อเห็นไอเดียนี้คือเทคนิค garbage collection ของ Java เพราะสมมติฐานพื้นฐานของเทคนิค garbage collection ส่วนใหญ่ก็คือ [อ็อบเจ็กต์ส่วนใหญ่จะถูกใช้งานเพียงช่วงเวลาสั้นมาก] หรือที่เรียกว่า ‘weak generational hypothesis’ นั่นเอง เนื้อหาข้างต้นก็น่าจะเป็นการประยุกต์หลักการนี้ในอีกรูปแบบหนึ่ง

3 ความคิดเห็น

 
xguru 2020-03-27

ขอบคุณสำหรับบทความดีๆ ครับ

ดูเหมือนว่าในบล็อกของ Cloudflare จะมีบทความน่าอ่านแฝงอยู่เยอะพอสมควร

บล็อกเทคนิคของบริษัทที่ดีเขาบริหารกันอย่างไร https://th.news.hada.io/topic?id=1698

ดูเหมือนว่า Cloudflare จะเป็นแบบนั้นเพราะการเขียนบล็อกได้ฝังรากเป็นวัฒนธรรมภายในองค์กรแล้ว

 
saltylight 2020-03-27

น่าสนใจมากครับ ขอบคุณครับ

 
sduck4 2020-03-27

ว้าว.. แปลให้เสร็จในทีเดียวเลย 555 ขอบคุณที่แชร์เนื้อหาดี ๆ ครับ