ข้ามไปเนื้อหาหลัก

ngx_mzstd โมดูล NGINX บีบอัด Zstd บนเธรดพูล

เจาะลึก ngx_mzstd โมดูล NGINX เขียนด้วย Rust รองรับการบีบอัด Zstandard บนเธรดพูล ช่วยแก้ปัญหาบล็อก event loop และลด p99 latency

เรียบเรียงโดย AI
Inewgen
22 Oct 2026ที่มา: Dev.to2 นาทีอ่าน (0 ครั้ง)
แชร์
ngx_mzstd โมดูล NGINX บีบอัด Zstd บนเธรดพูล

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง

ขนาดตัวอักษร
  • ngx_mzstd เป็น NGINX โมดูลเขียนด้วย Rust รองรับ Zstandard บีบอัดบนเธรดพูล
  • แก้ไขปัญหาการบีบอัดไฟล์ใหญ่บล็อก event loop จนกระทบคำขอขนาดเล็ก
  • การทดสอบวันที่ 20 ตุลาคม 2026 บน WSL2 ชี้ว่าช่วยลด p99 latency เหลือเพียง 1.7-2.0 มิลลิวินาที

การบีบอัดข้อมูลแบบ on-the-fly บน NGINX มักประสบปัญหาการบล็อก event loop เมื่อต้องจัดการกับไฟล์ขนาดใหญ่ โมดูลดั้งเดิมอย่าง tokers/zstd-nginx-module ทำงานการบีบอัดทั้งหมดบนเธรดหลัก ทำให้คำขอขนาดเล็กอื่นๆ ต้องรอนานในขณะที่ระบบกำลังประมวลผลไฟล์ขนาดใหญ่ เช่น บันเดิล JavaScript ขนาด 1.03 เมกะไบต์ ที่ระดับการบีบอัด 19 ซึ่งใช้เวลาประมาณ 200 มิลลิวินาทีต่อไฟล์

เพื่อแก้ปัญหานี้ ngx_mzstd จึงถูกพัฒนาขึ้นด้วยภาษา Rust บนพื้นฐานของตัวเข้ารหัส mzstd โดยออกแบบมาให้เป็น drop-in replacement ที่ใช้คำสั่งเดียวกันกับ tokers/zstd-nginx-module และไม่ต้องพึ่งพา libzstd จุดเด่นสำคัญคือความสามารถในการดึงเธรดพูลของ NGINX มาใช้ประมวลผลการบีบอัด ทำให้การบีบอัดไฟล์ขนาดใหญ่ไม่ขัดขวางการให้บริการคำขอส่วนอื่นในระบบ

1.5sp99 latency เดิม (8 คำขอพร้อมกัน)
2.0msp99 latency เมื่อใช้เธรดพูล 4 เธรด

ผลการทดสอบจากระบบจำลองภายใต้ WSL2 เมื่อวันที่ 20 ตุลาคม 2026 เผยให้เห็นความแตกต่างอย่างชัดเจน เมื่อมีคำขอขนาดใหญ่ 8 คำขอเข้ามาพร้อมกันที่ระดับการบีบอัด 19 โมดูล tokers/zstd-nginx-module ทำให้ค่า p99 latency ของคำขอขนาดเล็กพุ่งสูงถึง 1.5 วินาที ในขณะที่ ngx_mzstd บนเธรดพูลขนาด 4 เธรด สามารถควบคุม latency ให้อยู่ในระดับ 1.7 ถึง 2.0 มิลลิวินาทีเท่านั้น

chromebook notebook computer office desk workspace

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง

การใช้เธรดพูลใน NGINX เดิมทีถูกออกแบบมาสำหรับการจัดการบล็อก I/O ของไฟล์ (aio threads) ตั้งแต่เวอร์ชัน 1.7.11 ในปี 2015 การที่ ngx_mzstd นำสถาปัตยกรรมนี้มาประยุกต์ใช้กับการบีบอัด Zstandard ช่วยปลดล็อกขีดจำกัดของ CPU หลายคอร์ที่ไม่ถูกใช้งานใน event loop เดี่ยว ส่งผลให้ประสิทธิภาพการจัดการทราฟฟิกพุ่งสูงขึ้นอย่างก้าวกระโดด

สำหรับการแบ่งส่วนข้อมูล ngx_mzstd จะแบ่งการตอบกลับออกเป็นเซกเมนต์ขนาดเริ่มต้น 1 เมกะไบต์ (zstd_parallel_segment_size) โดยแต่ละเซกเมนต์จะถูกส่งไปยังเธรดพูลเพื่อประมวลผลพร้อมกันสูงสุด 4 งาน (zstd_parallel_tasks) แม้ว่าเซกเมนต์เหล่านี้จะไม่เป็นอิสระต่อกันอย่างสมบูรณ์เหมือน Brotli ใน ngx_mbrotli เนื่องจากต้องเชื่อมโยงขอบเขตข้อมูลเพื่อให้ยังคงอัตราการบีบอัดที่สูง แต่ประสิทธิภาพโดยรวมที่ได้ก็คุ้มค่ากับทรัพยากร CPU ที่เสียไป

ที่มา: Dev.to

ความคิดเห็น

แสดงความคิดเห็น
0/2000

พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้