Valkey ครบรอบ 1 ปี: คอมมูนิตี้ฟอร์กแซง Redis ได้อย่างไร
(gomomento.com)- Redis Inc ทำให้ความเชื่อมั่นของคอมมูนิตี้สั่นคลอนจากการตัดสินใจปิดซอร์สโค้ดบางส่วนด้วยการเปลี่ยนไปใช้ SSPL แต่คอมมูนิตี้นักพัฒนาก็รวมตัวกันรอบฟอร์ก Valkey จนเกิดนวัตกรรมและการมีส่วนร่วมอย่างต่อเนื่อง
- Redis 8.0 กลับมาเป็นโอเพนซอร์สอีกครั้ง และผู้ก่อตั้ง Antirez ก็กลับมามีส่วนร่วมในฟีเจอร์ใหม่และการปรับแต่งประสิทธิภาพ ทำให้ทั้งสองฝั่งพัฒนาอย่างรวดเร็ว
- จากผลเบนช์มาร์กล่าสุด Valkey 8.1.1 ในสภาพแวดล้อม 8vCPU ทำประสิทธิภาพ SET ได้ สูงกว่า Redis 8.0 อยู่ 37% และยังวัดค่า p99 latency ได้สั้นกว่าอีกด้วย (ประสิทธิภาพ GET ก็นำอยู่ 16%)
- ด้วยเทคนิคการจูนสำหรับใช้งานจริง เช่น IO thread และ core pinning ทำให้ Valkey เพิ่ม throughput ในสภาพแวดล้อมมัลติเธรดได้มากกว่า 3 เท่า พร้อมลด latency ให้น้อยที่สุด
- ยังมีการแชร์ทั้งเบนช์มาร์กที่ใกล้เคียงการใช้งานจริงและแนวทางการจูน พร้อมอธิบายข้อควรระวังในการตีความผลเบนช์มาร์กและวิธีนำไปใช้ในระบบจริง
การปิดซอร์สของ Redis และการมาของ Valkey
- เมื่อ 1 ปีก่อน Redis Inc (เดิมคือ Garantia Data) ทำให้ความสัมพันธ์ด้านความเชื่อมั่นกับคอมมูนิตี้แย่ลงจากการ เปลี่ยนไลเซนส์โอเพนซอร์ส (นำ SSPL มาใช้)
- ฟอร์กแบบเปิด Valkey ที่เกิดขึ้นเพื่อแก้ปัญหานี้ ได้กลายเป็นสินทรัพย์ทางเทคโนโลยีที่ถูกใช้อย่างกว้างขวางในระบบกระจายตัว แคช และการประมวลผลข้อมูลแบบเรียลไทม์
- ฝั่ง Redis เองก็พยายามกู้คืนความเชื่อมั่นในภายหลังด้วยการกลับมาของ Antirez (ผู้ก่อตั้ง) การเสริมประสิทธิภาพ/ฟังก์ชัน และการเปลี่ยน Redis 8.0 กลับไปเป็นโอเพนซอร์ส
Valkey 8.1 vs Redis 8.0: เปรียบเทียบประสิทธิภาพ
- เบนช์มาร์ก SET ภายใต้เงื่อนไขเดียวกัน: AWS c8g.2xl 8vCPU, item ขนาด 1KB, keyspace 3M, 500 connections
- Valkey 8.1.1: 999.8K RPS (p99 0.8ms)
- Redis 8.0: 729.4K RPS (p99 0.99ms)
- Valkey สูงกว่าในงาน SET 37%, GET 16% และเร็วกว่าใน SET p99 30%, GET p99 60%
- เมื่อนำ 6 IO threads มาใช้ Valkey เพิ่มจาก 239K → 678K RPS (2.8 เท่า↑), p99 1.68ms → 0.93ms (44%↓)
- Redis ก็ได้ประโยชน์จาก IO threads เช่นกัน จาก 235K → 563K RPS, p99 1.35ms → 0.84ms (40%↓)
ผลของการจูนมัลติเธรด/คอร์
- IO thread เริ่มให้ผลชัดเจนตั้งแต่ 3 threads ขึ้นไป และ Valkey ทิ้งห่าง Redis มากขึ้นหลัง 4 threads
- หากจำกัดคอร์ IRQ (interrupt) ไว้ 2 คอร์ แล้วตรึง Redis/Valkey ไว้กับอีก 6 คอร์ที่เหลือ (pinning) จะได้ประสิทธิภาพเพิ่มขึ้นอีก
- Valkey: 832K → 999.8K RPS (core/IRQ pinning, ใช้ CPU 80%)
- การแยกคอร์ IRQ/แอปพลิเคชันช่วยเพิ่มประสิทธิภาพแคชและลด tail latency ให้น้อยที่สุด
- มีตัวอย่างการใช้งานจริงผ่าน Docker เช่น cpuset-cpus, --io-threads
การทำซ้ำเบนช์มาร์กและเคล็ดลับสำหรับใช้งานจริง
- ใช้ instance รุ่นล่าสุด AWS Graviton4 (c8g.2xlarge) พร้อม cluster placement group
- ทำประสิทธิภาพสูงสุดด้วยการ pinning คอร์/แยก IRQ/ปรับจำนวน connection (ช่วง 400~500)
- ควรจูนทั้ง ขนาด keyspace/item ด้วย โดยค่าที่เล็กกว่าและ keyspace ที่เล็กกว่าจะช่วยเพิ่มอัตรา L3 cache hit
- แนะนำให้ใช้งานเครื่องมือเบนช์มาร์กแบบมัลติเธรดอย่าง valkey-benchmark หรือ rpc-perf (เครื่องมือพื้นฐาน Rust ที่ใกล้เคียงการใช้งานจริงมากกว่า) อย่างจริงจัง
docker run --network="host" --rm --cpuset-cpus="2-7" \ valkey/valkey:8.0.1 valkey-benchmark \ -h 172.31.4.92 -p 6379 -t SET,GET -n 100000000 -c 256 \ -r 3000000 --threads 6 -d 1024
ข้อจำกัดและข้อควรระวังในการวัดประสิทธิภาพ
-
ผลเบนช์มาร์กอาจแตกต่างจากสภาพแวดล้อมการใช้งานจริง
- เวิร์กโหลดจริงมีปัจจัยซับซ้อนหลายอย่าง เช่น สัดส่วนผสมของ SET:GET ความผันผวนของโหลด เป้าหมาย TPS และ network latency
- เมื่อจำนวน connection เพิ่มสูงมาก อาจพบทั้ง queueing delay, throughput ลดลง และ tail latency สูงขึ้น
- ผลลัพธ์อาจแตกต่างกันมากตามเครื่องมือ/ออปชันของเบนช์มาร์ก และ network topology
การเติบโตหลักและพัฒนาการของคอมมูนิตี้
ตลอด 1 ปีที่ผ่านมา โปรเจกต์ Valkey เติบโตอย่างคึกคักในหลายด้าน
- มีการเพิ่มฟีเจอร์ แก้บั๊ก และปรับปรุงความปลอดภัย ผ่าน ความร่วมมือของนักพัฒนาและบริษัทจำนวนมาก บน GitHub และที่อื่น ๆ
- ให้ความสำคัญกับเอกสารและการช่วยเหลือผู้ใช้ เพื่อ ลดอุปสรรคสำหรับผู้ใช้ใหม่
- ในกระบวนการบริหารโปรเจกต์ ยังเน้น การตัดสินใจอย่างโปร่งใส และ การโหวตโดยคอมมูนิตี้
คุณค่าต่ออุตสาหกรรมและเชิงเทคนิค
Valkey มีจุดแข็งดังต่อไปนี้
- ทุกคนสามารถใช้งานได้โดยไม่มีข้อจำกัดด้านไลเซนส์ จึงเป็นตัวเลือกที่น่าสนใจสำหรับ ผู้ให้บริการคลาวด์ และ บริษัทเว็บสเกลขนาดใหญ่
- มี ความเข้ากันได้กับ Redis สูง จึงย้ายระบบได้ง่าย
- ด้วยการพัฒนาที่ขับเคลื่อนโดยคอมมูนิตี้ จึงสามารถสะท้อนความต้องการที่หลากหลายและอัปเดตได้อย่างรวดเร็วต่อเนื่อง
บทสรุปและประเด็นที่น่าสนใจ
- Valkey แสดงให้เห็นภายใน 1 ปีหลังฟอร์กจาก Redis ว่าสามารถก้าวแซง Redis ได้ทั้งด้านเทคนิค ประสิทธิภาพ และคอมมูนิตี้
- เคล็ดลับการจูนสำหรับใช้งานจริงและเครื่องมืออย่าง IO threads, การแยก core/IRQ และการปรับจำนวน connection คือหัวใจสำคัญ
- ประสิทธิภาพไม่ได้เกิดขึ้นเองโดยอัตโนมัติ แต่ต้องอาศัยการปรับแต่งอย่างต่อเนื่องให้เหมาะกับระบบ เวิร์กโหลด และโครงสร้างพื้นฐาน
- ในสภาพแวดล้อมบริการจริง ควรใช้แนวทางเชิงปฏิบัติที่ทดสอบหลายสถานการณ์ด้วยตนเอง ไม่พึ่งตัวเลขเบนช์มาร์กเพียงอย่างเดียว
4 ความคิดเห็น
แม้ Redis จะตัดสินใจผิดพลาดไว้หลายอย่าง แต่ภาพที่คนลงแรงเป็นหมี ส่วนคนฝึกกลับเป็นฝ่ายรับเงิน ก็น่าเสียดายเหมือนกัน
เอกสารนี้เป็นการสรุปว่ามีการปรับปรุงอะไรบ้างใน Valkey 8
ซึ่งโพสต์ไว้ใน Facebook "Redis User Group"
https://www.facebook.com/groups/rediskorea/posts/3927030954110001/
หากอ่านควบคู่กับเนื้อหาข้างต้น ก็น่าจะช่วยให้เข้าใจได้มากขึ้น
จริง ๆ แล้วไม่ใช่ว่า Valkey ทำอะไรเป็นพิเศษหรอก... แต่ฝั่งนั้นดันล่มสลายไปเอง...
ความเห็นจาก Hacker News
write(2)/read(2)syscall อาจช้ามาก เราจะทำ I/O แบบขนานด้วย N threads ในสภาวะ zero contention เฉพาะช่วงนั้น แล้วกลับไปเป็น single-thread ทันทีหลังจากนั้น ขอชื่นชมทีม ValKey ที่พัฒนาระบบนี้ต่อไปได้อีก มันเป็นระบบที่ใช้งานได้มานานแล้ว และพูดตรง ๆ คือฉันไม่ค่อยสบายใจกับการที่สื่อชอบพูดเกินจริงกับข้อมูลที่ในความเป็นจริงไม่ได้เปลี่ยนมากนัก ฟีเจอร์แบบนี้จริง ๆ แล้วน่าจะสำคัญกับลูกค้าองค์กรหรือผู้ให้บริการคลาวด์อย่าง Amazon, Google มากกว่าผู้ใช้ Redis ทั่วไปส่วนใหญ่ ถ้าไม่ได้ต้องรับโหลดมหาศาลหรือผู้ใช้จำนวนมากพร้อมกัน โดยมาก Redis ก็ใช้ CPU ต่ำอยู่แล้วจนไม่จำเป็นต้องเปิดใช้ด้วยซ้ำ ช่วงนี้ใน Redis เรากำลังพัฒนา vector set data type และกำหนดให้ threading เป็นค่าเริ่มต้น รวมถึงทำให้การเขียน vector set ผ่าน VADD ทำงานแบบ threaded ได้ด้วย โครงสร้างข้อมูลอย่าง HNSW มี constant factor ขนาดใหญ่มากเป็นครั้งแรกในประวัติศาสตร์ Redis ทำให้พื้นที่การออกแบบเปลี่ยนไปเลย ก่อนหน้านี้ฉันก็เคยทำ thread support สำหรับโมดูลไว้แล้วเหมือนกัน การจะใช้ threads หรือไม่เป็นการตัดสินใจที่ขึ้นกับบริบท