การแสวงหาของนักพัฒนาเพื่อเพิ่มความเร็วในการทดสอบระบบไฟล์ใน Rust ได้เปิดเผยสิ่งที่น่าประหลาดใจเกี่ยวกับประสิทธิภาพการจัดเก็บข้อมูลสมัยใหม่ สิ่งที่เริ่มต้นจากการค้นหาเครื่องมือทดสอบที่เร็วขึ้น กลับจบลงด้วยการค้นพบว่าระบบไฟล์แบบ in-memory ให้ประโยชน์ด้านประสิทธิภาพเกือบไม่ต่างจาก SSD ทั่วไป
การเดินทางเริ่มต้นด้วยเป้าหมายง่ายๆ คือแทนที่การดำเนินการระบบไฟล์ที่ช้าในการทดสอบด้วยทางเลือกแบบ in-memory ที่เร็วกว่า แนวทางนี้ทำงานได้ดีในภาษาโปรแกรมอื่นๆ เช่น Go ที่ package Afero ให้การแยกระบบไฟล์อย่างราบรื่น อย่างไรก็ตาม ระบบนิเวศของ Rust เล่าเรื่องที่แตกต่างออกไป
ตัวเลือกที่จำกัดในระบบนิเวศของ Rust
การค้นหาทางเลือกใน Rust เผยให้เห็นภูมิทัศน์ที่รกร้าง crate vfs
ดูมีแนวโน้มดีในตอนแรก โดยเสนอ backend หลายตัวรวมถึงระบบไฟล์แบบ in-memory อย่างไรก็ตาม มันขาดคุณสมบัติสำคัญอย่างการรองรับ symlink และ file permissions ทำให้ไม่เหมาะสำหรับเครื่องมือที่ต้องจัดการไฟล์ปฏิบัติการหรือการดำเนินการไฟล์ที่ซับซ้อน
crate rsfs
ใช้แนวทางที่แตกต่างโดยพยายามจำลองฟังก์ชันการทำงานของ std::fs
ในขณะที่เพิ่มตัวเลือกแบบ memory-based แต่การเลือกออกแบบนี้มาพร้อมกับต้นทุนที่สำคัญ - ทุกฟังก์ชันที่จัดการกับระบบไฟล์ต้องมีพารามิเตอร์กับประเภทระบบไฟล์ ทำให้เกิด type signature ที่ซับซ้อนและยากต่อการจัดการตลอดทั้ง codebase
ข้อจำกัดของ Rust Filesystem Crate:
Crate | รองรับ Symlink | สิทธิ์ไฟล์ | ความซับซ้อนของ Type | สถานะการดูแลรักษา |
---|---|---|---|---|
vfs |
❌ ไม่รองรับ | ❌ ไม่รองรับ | ✅ ต่ำ | ✅ ใช้งานอยู่ |
rsfs |
✅ รองรับ | ✅ รองรับ | ❌ สูง | ⚠️ ไม่มีการดูแลรักษา |
ผลการทดสอบประสิทธิภาพที่ไม่คาดคิด
ความประหลาดใจที่แท้จริงเกิดขึ้นระหว่างการทดสอบประสิทธิภาพ การทดสอบเบื้องต้นแนะนำให้เห็นการปรับปรุงที่มีความหมายเมื่อใช้ระบบไฟล์แบบ in-memory โดยการทดสอบใช้เวลาประมาณ 850ms เทียบกับ 1200ms สำหรับการดำเนินการดิสก์ปกติ อย่างไรก็ตาม การสืบสวนเชิงลึกเผยให้เห็นว่าความแตกต่างเหล่านี้น่าจะเกิดจากปัจจัยอย่าง linker cache หรือสิ่งประดิษฐ์ในการดำเนินการทดสอบมากกว่าประสิทธิภาพระบบไฟล์จริง
การทดสอบประสิทธิภาพที่แม่นยำยิ่งขึ้นโดยใช้ไฟล์ปฏิบัติการทดสอบแต่ละตัวแสดงให้เห็นสิ่งที่น่าทึ่ง: ทุกแนวทางใช้เวลาประมาณ 45ms ในการทำงานให้เสร็จสิ้น ไม่ว่าจะใช้ vfs
ในโหมด in-memory, rsfs
กับ memory backend, rsfs
กับระบบไฟล์ปกติ, ramdisk หรือแม้แต่ SSD มาตรฐาน - ทั้งหมดทำงานได้เหมือนกัน
ผลการเปรียบเทียบประสิทธิภาพ:
vfs
in-memory filesystem: ~45msrsfs
in-memory filesystem: ~45msrsfs
regular filesystem: ~45msstd::fs
กับ ramdisk: ~45msstd::fs
กับ regular SSD: ~45ms
ความเป็นจริงของการจัดเก็บข้อมูลสมัยใหม่
ผลลัพธ์นี้เน้นให้เห็นว่าเทคโนโลยีการจัดเก็บข้อมูลได้พัฒนาไปอย่างมากมาย SSD สมัยใหม่ร่วมกับระบบแคชระบบไฟล์ระดับ OS ที่ซับซ้อนได้กำจัดช่องว่างประสิทธิภาพที่การทดสอบแบบ in-memory ได้รับการออกแบบมาเพื่อแก้ไข overhead ของ system call ที่เคยเป็นคอขวดที่สำคัญ ตอนนี้แสดงเป็นเศษส่วนเล็กๆ ของเวลาการดำเนินการทั้งหมด จนการหลีกเลี่ยงมันไม่ให้ประโยชน์ที่วัดได้
การสนทนาในชุมชนรอบๆ การค้นพบนี้เผยให้เห็นปฏิกิริยาที่หลากหลาย นักพัฒนาบางคนชี้ให้เห็นว่า POSIX filesystem semantics มีความซับซ้อน และการดำเนินการแบบ in-memory มักมีช่องว่างด้านคุณภาพที่ทำให้เชื่อถือได้น้อยกว่าโค้ด kernel ที่ผ่านการทดสอบดี คนอื่นๆ แนะนำให้ใช้ /tmp
หรือ /dev/shm
สำหรับการดำเนินการแบบ in-memory อย่างชัดเจนเมื่อจำเป็น
มันทำให้ฉันประหลาดใจเสมอที่ไม่มีชุดของ trait ที่ครอบคลุมพื้นผิวแบบ
fs
มันไม่ใช่พื้นผิวที่เรียบง่าย แต่ก็ไม่ใหญ่มากเช่นกัน และฉันก็พบว่าตัวเองอยู่ในตำแหน่งที่ต้องการมีการดำเนินการหลายรูปแบบของโครงสร้างแบบระบบไฟล์
การขาดการแยกระบบไฟล์ใน standard library ของ Rust ตรงกันข้ามกับภาษาอย่าง Go ที่รวม interface ระบบไฟล์พื้นฐาน ช่องว่างนี้ทำให้นักพัฒนาบางคนสร้างโซลูชันของตัวเอง แม้ว่าการยอมรับยังคงจำกัดเนื่องจากปัญหาความซับซ้อนของประเภทที่กล่าวถึงก่อนหน้านี้
ผลกระทบในทางปฏิบัติสำหรับการทดสอบ
สำหรับนักพัฒนาที่เผชิญกับความท้าทายในการทดสอบที่คล้ายกัน การค้นพบแนะนำแนวทางที่ปฏิบัติได้: ทดสอบโดยตรงกับระบบไฟล์จริง ประโยชน์ด้านประสิทธิภาพของระบบ mocking แบบ in-memory ที่ซับซ้อนไม่ปรากฏในทางปฏิบัติ ในขณะที่ต้นทุนความซับซ้อนยังคงเป็นจริง
นี่ไม่ได้หมายความว่ากลยุทธ์การทดสอบระบบไฟล์ไม่เกี่ยวข้อง การแยกการทดสอบที่เหมาะสม ขั้นตอนการทำความสะอาด และการจัดการกรณีขอบอย่าง permissions และ symlink ยังคงสำคัญ แต่เป้าหมายเฉพาะของการหลีกเลี่ยง filesystem I/O เพื่อเหตุผลด้านประสิทธิภาพดูเหมือนจะแก้ปัญหาที่ฮาร์ดแวร์สมัยใหม่แก้ไขแล้ว
การสืบสวนนี้เป็นการเตือนใจว่าสมมติฐานเกี่ยวกับคอขวดประสิทธิภาพควรได้รับการตรวจสอบด้วยการวัดในโลกจริงเสมอ สิ่งที่ดูเหมือนการปรับปรุงที่ชัดเจนกลับกลายเป็นความซับซ้อนที่ไม่จำเป็น ขอบคุณความก้าวหน้าในเทคโนโลยีการจัดเก็บข้อมูลและการออกแบบระบบปฏิบัติการที่ได้ปฏิวัติวิธีคิดของเราเกี่ยวกับประสิทธิภาพ file I/O อย่างเงียบๆ
อ้างอิง: In-memory Filesystems in Rust