SSD สมัยใหม่ท้าทาย Memory Hierarchy แบบดั้งเดิม: การเข้าถึงดิสก์สามารถทำงานได้เร็วกว่า RAM ในบางสถานการณ์

ทีมชุมชน BigGo
SSD สมัยใหม่ท้าทาย Memory Hierarchy แบบดั้งเดิม: การเข้าถึงดิสก์สามารถทำงานได้เร็วกว่า RAM ในบางสถานการณ์

การวิจัยทางเทคนิคล่าสุดได้จุดประกายการถกเถียงอย่างร้อนแรงในชุมชนนักพัฒนา โดยท้าทายสมมติฐานพื้นฐานอย่างหนึ่งของคอมพิวเตอร์ที่ว่าการเข้าถึงหน่วยความจำจะเร็วกว่าการเข้าถึงดิสก์เสมอ การวิจัยนี้แสดงให้เห็นสถานการณ์ที่ solid-state drives ( SSDs ) สมัยใหม่สามารถทำงานได้ดีกว่าการทำงานของหน่วยความจำแบบดั้งเดิม ซึ่งเป็นการพลิกผันความรู้ทั่วไปที่มีมา

การสำรวจพลวัตที่เปลี่ยนแปลงไปของการเข้าถึงหน่วยความจำเทียบกับการเข้าถึงดิสก์ในคอมพิวเตอร์สมัยใหม่
การสำรวจพลวัตที่เปลี่ยนแปลงไปของการเข้าถึงหน่วยความจำเทียบกับการเข้าถึงดิสก์ในคอมพิวเตอร์สมัยใหม่

แบนด์วิดท์ PCIe ปัจจุบันเทียบเท่าแบนด์วิดท์หน่วยความจำ

การเปิดเผยที่น่าตกใจที่สุดมุ่งเน้นไปที่วิธีที่สถาปัตยกรรมฮาร์ดแวร์สมัยใหม่ได้พัฒนาขึ้น ระบบระดับไฮเอนด์ในปัจจุบันมีการเชื่อมต่อ PCIe 5.0 ที่สามารถส่งแบนด์วิดท์ได้สูงถึง 64 GB/s ในสล็อต x16 เดียว เมื่อรวมกันหลายเลนแล้ว แบนด์วิดท์ PCIe รวมสามารถเกินแบนด์วิดท์หน่วยความจำ DDR5 แบบดั้งเดิมในหลายการกำหนดค่า การเปลี่ยนแปลงนี้แสดงถึงการเปลี่ยนแปลงพื้นฐานในภูมิทัศน์คอมพิวเตอร์ที่นักพัฒนาหลายคนยังไม่เข้าใจอย่างเต็มที่

โปรเซสเซอร์ระดับเซิร์ฟเวอร์ขยายแนวโน้มนี้อย่างมาก โปรเซสเซอร์ AMD EPYC รุ่นที่ห้ามีเลน PCIe 5.0 ถึง 128 เลน ส่งแบนด์วิดท์ทางทฤษฎีเกิน 1TB/s เมื่อเทียบกับประมาณ 600GB/s จากระบบหน่วยความจำ DDR5 12 ช่องสัญญาณ แม้ว่าตัวเลขเหล่านี้จะแสดงค่าสูงสุดทางทฤษฎี แต่ก็แสดงให้เห็นว่าอินเทอร์เฟซการจัดเก็บข้อมูลได้ตามทันบัสหน่วยความจำแล้ว

PCIe: Peripheral Component Interconnect Express มาตรฐานการเชื่อมต่อความเร็วสูงที่ใช้โดย SSDs และการ์ดจอสมัยใหม่

ผลการเปรียบเทียบประสิทธิภาพ:

  • Basic mmap() พื้นฐาน: ประมาณ 610 MB/s
  • io_uring ที่ปรับปรุงแล้ว: ใกล้เคียงขีดจำกัดทางทฤษฎีของ SSD
  • แบนด์วิดท์หน่วยความจำ ( DDR5 ): ประมาณ 64 GB/s ต่อช่องสัญญาณ (โดยทั่วไปจะมี 2 ช่องสัญญาณ)
  • PCIe 5.0 x16 : แบนด์วิดท์ทางทฤษฎี 64 GB/s
  • PCIe รวมของเซิร์ฟเวอร์: มากกว่า 1TB/s (128 เลน PCIe 5.0 บน EPYC )
  • หน่วยความจำเซิร์ฟเวอร์: ประมาณ 600 GB/s (12 ช่องสัญญาณ DDR5 )

รูปแบบการเข้าถึงหน่วยความจำสำคัญกว่าความเร็วดิบ

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

การอภิปรายในชุมชนเน้นย้ำถึงการมองข้ามที่สำคัญในการทดสอบประสิทธิภาพแบบดั้งเดิม การทดสอบส่วนใหญ่มุ่งเน้นไปที่รูปแบบการเข้าถึงแบบลำดับที่เอื้อประโยชน์ต่อหน่วยความจำ ในขณะที่แอปพลิเคชันจริงมักแสดงรูปแบบการเข้าถึงแบบสุ่มที่ SSDs สามารถเป็นเลิศได้ ช่องว่างระหว่างประสิทธิภาพหน่วยความจำในกรณีที่ดีที่สุดและแย่ที่สุดนั้นใหญ่กว่าที่นักพัฒนาหลายคนตระหนัก

Cache miss: เมื่อโปรเซสเซอร์มองหาข้อมูลในหน่วยความจำแคชที่เร็วแต่ไม่พบ จึงถูกบังคับให้เดินทางที่ช้ากว่าไปยังหน่วยความจำหลัก

เปรียบเทียบประสิทธิภาพ throughput ระหว่างรูปแบบการเข้าถึงแบบ sequential และ random ในหน่วยความจำและ SSD
เปรียบเทียบประสิทธิภาพ throughput ระหว่างรูปแบบการเข้าถึงแบบ sequential และ random ในหน่วยความจำและ SSD

เทคนิค I/O ขั้นสูงปลดล็อกศักยภาพ SSD

การสืบสวนแสดงให้เห็นว่าเทคนิค I/O สมัยใหม่เช่น io_uring สามารถปรับปรุงประสิทธิภาพ SSD อย่างมากเมื่อเทียบกับการแมปหน่วยความจำแบบดั้งเดิม ( mmap ) ในขณะที่การทำงาน mmap พื้นฐานบรรลุประมาณ 610MB/s ในการทดสอบ การใช้งาน io_uring ที่ปรับให้เหมาะสมสามารถบรรลุความเร็วที่เข้าใกล้ขีดจำกัดทางทฤษฎีของฮาร์ดแวร์การจัดเก็บข้อมูล

อย่างไรก็ตาม ชุมชนได้ตั้งคำถามสำคัญเกี่ยวกับวิธีการทดสอบ นักพัฒนาหลายคนชี้ให้เห็นการปรับให้เหมาะสมที่ขาดหายไปเช่น huge pages, แฟล็ก MAP_POPULATE และการดึงข้อมูลล่วงหน้าของหน่วยความจำที่เหมาะสมซึ่งสามารถปรับปรุงแนวทางที่ใช้หน่วยความจำได้อย่างมีนัยสำคัญ เทคนิคเหล่านี้สามารถลดค่าใช้จ่ายของการค้นหาตารางหน้าและปรับปรุงประสิทธิภาพแคช

MAP_HUGETLB ไม่สามารถใช้สำหรับการ mmap ไฟล์บนดิสก์ได้ สามารถใช้ได้เฉพาะกับ MAP_ANONYMOUS กับ memfd หรือกับไฟล์บนระบบไฟล์เทียม hugetlbfs เท่านั้น

io_uring: อินเทอร์เฟซ Linux สมัยใหม่สำหรับการทำงาน I/O แบบอะซิงโครนัสที่ลดค่าใช้จ่ายของ system call Huge pages: หน้าหน่วยความจำขนาดใหญ่ที่ลดจำนวนรายการตารางหน้าที่จำเป็น ปรับปรุงประสิทธิภาพสำหรับชุดข้อมูลขนาดใหญ่

การปรับแต่งทางเทคนิคหลักที่กล่าวถึง:

  • แฟล็ก MAP_HUGETLB และ MAP_HUGE_1GB สำหรับการรองรับ huge page
  • MAP_POPULATE สำหรับการดึงข้อมูลล่วงหน้าในหน่วยความจำ
  • io_uring สำหรับการดำเนินการ I/O แบบอะซิงโครนัส
  • คำสั่ง SIMD vector (128-bit และ 256-bit)
  • Direct Data I/O ( DDIO ) สำหรับการถ่ายโอนข้อมูลตรงสู่แคช
  • การคลี่ลูปด้วยตนเองเพื่อการปรับแต่งคอมไพเลอร์
การตรวจสอบประสิทธิภาพระบบและการปรับแต่งในแอปพลิเคชัน SSD โดยใช้เทคนิค I/O ขั้นสูง
การตรวจสอบประสิทธิภาพระบบและการปรับแต่งในแอปพลิเคชัน SSD โดยใช้เทคนิค I/O ขั้นสูง

ผลกระทบในโลกแห่งความเป็นจริงสำหรับการออกแบบแอปพลิเคชัน

การวิจัยนี้แนะนำว่านักพัฒนาควรพิจารณาสมมติฐานของตนเกี่ยวกับการแลกเปลี่ยนระหว่างการจัดเก็บข้อมูลกับหน่วยความจำใหม่ สำหรับแอปพลิเคชันที่จัดการกับชุดข้อมูลขนาดใหญ่ที่ไม่พอดีในหน่วยความจำทั้งหมด การเข้าถึง SSD ที่ปรับให้เหมาะสมอย่างระมัดระวังอาจทำงานได้ดีกว่าแนวทางดั้งเดิมที่อาศัยหน่วยความจำเสมือนและการสลับเป็นหลัก

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

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

อ้างอิง: Memory is slow, Disk is fast - Part 2.