การทดสอบประสิทธิภาพฐานข้อมูล Cache เผยช่องว่างด้านประสิทธิภาพที่น่าประหลาดใจและปัญหาการแสดงผลข้อมูล

ทีมชุมชน BigGo
การทดสอบประสิทธิภาพฐานข้อมูล Cache เผยช่องว่างด้านประสิทธิภาพที่น่าประหลาดใจและปัญหาการแสดงผลข้อมูล

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

มาตราส่วนลอการิทึมปิดบังความแตกต่างด้านประสิทธิภาพที่แท้จริง

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

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

ผลการวัดประสิทธิภาพที่สำคัญ:

  • Memcached เทียบกับ Redis : ประสิทธิภาพของ Memcached เหนือกว่าถึง 3 เท่า (ถูกบดบังด้วยการปรับขนาดแบบลอการิทึม)
  • Valkey เทียบกับ Redis : ประสิทธิภาพที่เหนือกว่าอย่างสม่ำเสมอเนื่องจากสถาปัตยกรรมแบบ multithreaded
  • Garnet : ประสิทธิภาพ pipeline ที่ยอดเยี่ยมแม้จะใช้การพัฒนาด้วย C
  • การปรับขนาด Thread : ประสิทธิภาพคงที่ประมาณ 6-8 threads ในระบบส่วนใหญ่
  • ผลกระทบของ Pipeline : การปรับปรุงประสิทธิภาพอย่างมีนัยสำคัญด้วยค่า pipeline ที่สูงขึ้น (1, 10, 100, 1000)

Valkey โผล่มาเป็นทางเลือกที่แข็งแกร่งของ Redis

หนึ่งในผลการค้นพบที่น่าสังเกตที่สุดจากการทดสอบประสิทธิภาพคือ Valkey มีประสิทธิภาพเหนือกว่า Redis อย่างสม่ำเสมอในสถานการณ์การทดสอบต่างๆ ข้อได้เปรียบด้านประสิทธิภาพนี้ดูเหมือนจะเกิดจากสถาปัตยกรรมแบบ multithreaded ของ Valkey ซึ่งตรงข้ามกับการออกแบบแบบ single-threaded ของ Redis ผลลัพธ์นี้ได้สร้างความกระตือรือร้นในหมู่นักพัฒนาที่มองว่านี่เป็นการยืนยันสำหรับ community-driven fork ที่เกิดขึ้นหลังจากการเปลี่ยนแปลงใบอนุญาตของ Redis

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

ระบบที่ทำการทดสอบ:

  • Memcache: ระบบจัดเก็บข้อมูลแบบ key-value ในหน่วยความจำ (1 ล้าน keys บน /dev/shm)
  • Redis: ระบบจัดเก็บข้อมูลในหน่วยความจำ (1 ล้าน keys บน /dev/shm)
  • Valkey: ตัวแยกสาขาของ Redis ที่มีสถาปัตยกรรมแบบ multithreaded
  • Garnet: ระบบแคชที่เข้ากันได้กับ Redis ของ Microsoft ที่เขียนด้วยภาษา C
  • SQLite: ฐานข้อมูล SQL แบบ in-process ที่รองรับ ACID (1 พัน keys ใน /tmp/)
  • RocksDB: ระบบจัดเก็บข้อมูลแบบ key-value แบบถาวรของ Facebook (1 ล้าน keys บน /dev/shm)
  • WiredTiger: ระบบจัดเก็บข้อมูลแบบ key-value แบบถาวรของ MongoDB (1 ล้าน keys บน /dev/shm)
GitHub repository สำหรับ "Cache Benchmarks" ซึ่งรวมถึงการทดสอบประสิทธิภาพเทคโนโลยี caching ต่างๆ รวมทั้ง Valkey และ Redis
GitHub repository สำหรับ "Cache Benchmarks" ซึ่งรวมถึงการทดสอบประสิทธิภาพเทคโนโลยี caching ต่างๆ รวมทั้ง Valkey และ Redis

ประสิทธิภาพ Pipeline ที่ยอดเยี่ยมของ Garnet

บางทีผลลัพธ์ที่น่าสนใจที่สุดมาจาก Garnet ซึ่งเป็น Redis-compatible cache ของ Microsoft ที่เขียนด้วย C# ซึ่งแสดงประสิทธิภาพที่ยอดเยี่ยมในสถานการณ์ high-pipeline แม้ว่าจะถูกสร้างบน managed runtime ที่มักเชื่อมโยงกับ performance overhead แต่ Garnet ก็บรรลุผลลัพธ์เหล่านี้ผ่านเทคนิคการปรับให้เหมาะสมแบบรุกรานที่หลีกเลี่ยง garbage collection และใช้ unmanaged memory อย่างกว้างขวาง

ปรัชญาการออกแบบของระบบนี้เกี่ยวข้องกับการหลีกเลี่ยงรูปแบบ C# ทั่วไปอย่าง async/await อย่างมีกลยุทธ์ แทนที่จะย้ายการดำเนินการ I/O ไปยัง network request threads โดยตรง แนวทางนี้แม้ว่าจะสร้างโค้ด C# ที่ไม่เป็นไปตามแบบแผน แต่ก็แสดงให้เห็นว่าการวิศวกรรมที่ระมัดระวังสามารถเอาชนะข้อจำกัดของภาษาที่รับรู้ได้

Multithreaded: การออกแบบระบบที่สามารถจัดการงานหลายอย่างพร้อมกันผ่าน processing threads ที่แตกต่างกัน ซึ่งโดยทั่วไปจะปรับปรุงประสิทธิภาพสำหรับการดำเนินการพร้อมกัน

ข้อมูลจำเพาะของสภาพแวดล้อมการทดสอบ:

  • CPU: 3.1 GHz 12-Core Intel Xeon W (c8g.8xlarge 32-core ARM64 สำหรับการทดสอบบางส่วน)
  • หน่วยความจำ: 64 GB 2666 MHz DDR4
  • แพลตฟอร์ม: Linux (ยังไม่ได้ทดสอบบน Apple Silicon )
  • ระยะเวลาการทดสอบ: 30 วินาทีต่อการวัดประสิทธิภาพ
  • การดำเนินงาน: การดำเนินงานทั้งหมด 1,000,000 ครั้ง โดยมีอัตราส่วนการอ่าน 50%

ข้อกังวลเรื่องวิธีการทดสอบ

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

นอกจากนี้ ยังเกิดคำถามเกี่ยวกับพฤติกรรมของแพลตฟอร์มการทดสอบ โดยมีการคงที่ของประสิทธิภาพเกิดขึ้นประมาณ 6-8 threads ในระบบส่วนใหญ่ แม้ว่าจะทำงานบนโปรเซสเซอร์ ARM64 32-core ก็ตาม สิ่งนี้ชี้ให้เห็นถึงข้อจำกัดทางสถาปัตยกรรมหรือปัญหาการกำหนดค่าที่อาจไม่สะท้อนประสิทธิภาพที่เหมาะสมที่สุดในโลกแห่งความเป็นจริง

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

อ้างอิง: Cache Benchmarks