Upaya seorang developer untuk mempercepat pengujian sistem file di Rust telah mengungkap sesuatu yang mengejutkan tentang performa penyimpanan modern. Yang dimulai sebagai pencarian alat pengujian yang lebih cepat berakhir dengan penemuan bahwa filesystem in-memory hampir tidak memberikan keunggulan performa dibandingkan SSD biasa.
Perjalanan ini dimulai dengan tujuan sederhana: mengganti operasi sistem file yang lambat dalam pengujian dengan alternatif in-memory yang lebih cepat. Pendekatan ini bekerja dengan baik di bahasa pemrograman lain seperti Go, di mana paket Afero menyediakan abstraksi filesystem yang mulus. Namun, ekosistem Rust menceritakan kisah yang berbeda.
Pilihan Terbatas dalam Ekosistem Rust
Pencarian alternatif Rust mengungkap lanskap yang terbatas. Crate vfs
awalnya tampak menjanjikan, menawarkan beberapa backend termasuk filesystem in-memory. Namun, ia tidak memiliki fitur penting seperti dukungan symlink dan izin file, membuatnya tidak cocok untuk alat yang perlu menangani executable atau operasi file yang kompleks.
Crate rsfs
mengambil pendekatan berbeda dengan mencoba mereplikasi fungsi std::fs
sambil menambahkan opsi berbasis memori. Tetapi pilihan desain ini datang dengan biaya yang signifikan - setiap fungsi yang berurusan dengan filesystem harus diparameterisasi terhadap tipe filesystem, menciptakan signature tipe yang kompleks dan sulit dikelola di seluruh codebase.
Keterbatasan Crate Filesystem Rust:
Crate | Dukungan Symlink | Izin File | Kompleksitas Tipe | Status Pemeliharaan |
---|---|---|---|---|
vfs |
❌ Tidak | ❌ Tidak | ✅ Rendah | ✅ Aktif |
rsfs |
✅ Ya | ✅ Ya | ❌ Tinggi | ⚠️ Tidak Dipelihara |
Hasil Benchmark yang Tidak Terduga
Kejutan sebenarnya datang saat pengujian performa. Benchmark awal menunjukkan peningkatan yang berarti saat menggunakan filesystem in-memory, dengan pengujian berjalan sekitar 850ms dibandingkan 1200ms untuk operasi disk biasa. Namun, investigasi yang lebih mendalam mengungkap bahwa perbedaan ini kemungkinan disebabkan oleh faktor seperti cache linker atau artefak eksekusi pengujian daripada performa filesystem yang sebenarnya.
Benchmarking yang lebih presisi menggunakan executable pengujian individual menunjukkan sesuatu yang luar biasa: setiap pendekatan membutuhkan waktu sekitar 45ms untuk selesai. Baik menggunakan mode in-memory vfs
, rsfs
dengan backend memori, rsfs
dengan filesystem biasa, ramdisk, atau bahkan SSD standar - semuanya berkinerja identik.
Hasil Perbandingan Performa:
- Sistem file dalam memori
vfs
: ~45ms - Sistem file dalam memori
rsfs
: ~45ms - Sistem file reguler
rsfs
: ~45ms std::fs
dengan ramdisk: ~45msstd::fs
dengan SSD reguler: ~45ms
Realitas Penyimpanan Modern
Hasil ini menyoroti bagaimana teknologi penyimpanan telah berkembang secara dramatis. SSD modern yang dikombinasikan dengan caching filesystem tingkat OS yang canggih pada dasarnya telah menghilangkan kesenjangan performa yang dirancang untuk diatasi oleh pengujian in-memory. Overhead system call, yang dulunya merupakan bottleneck signifikan, kini mewakili fraksi yang sangat kecil dari total waktu eksekusi sehingga menghindarinya tidak memberikan manfaat yang terukur.
Diskusi komunitas seputar temuan ini mengungkap reaksi yang beragam. Beberapa developer menunjukkan bahwa semantik filesystem POSIX itu kompleks, dan implementasi in-memory sering memiliki kesenjangan kualitas yang membuatnya kurang dapat diandalkan dibandingkan kode kernel yang telah teruji dengan baik. Yang lain menyarankan menggunakan /tmp
atau /dev/shm
untuk operasi in-memory eksplisit saat diperlukan.
Saya selalu agak terkejut bahwa tidak ada set trait yang mencakup semacam permukaan seperti
fs
. Ini bukan permukaan yang sepele, tetapi juga tidak terlalu besar, dan saya juga pernah menemukan diri saya dalam posisi ingin memiliki beberapa implementasi struktur seperti filesystem.
Kurangnya abstraksi filesystem dalam library standar Rust berbeda dengan bahasa seperti Go, yang menyertakan interface filesystem dasar. Kesenjangan ini telah membuat beberapa developer membuat solusi mereka sendiri, meskipun adopsinya tetap terbatas karena masalah kompleksitas tipe yang disebutkan sebelumnya.
Implikasi Praktis untuk Pengujian
Untuk developer yang menghadapi tantangan pengujian serupa, temuan ini menyarankan pendekatan pragmatis: uji langsung terhadap filesystem yang sebenarnya. Manfaat performa dari sistem mocking in-memory yang rumit tidak terwujud dalam praktik, sementara biaya kompleksitasnya tetap sangat nyata.
Ini tidak berarti strategi pengujian filesystem tidak relevan. Isolasi pengujian yang tepat, prosedur pembersihan, dan penanganan kasus edge seperti izin dan symlink tetap penting. Tetapi tujuan spesifik menghindari I/O filesystem untuk alasan performa tampaknya memecahkan masalah yang sudah diatasi oleh hardware modern.
Investigasi ini berfungsi sebagai pengingat bahwa asumsi tentang bottleneck performa harus selalu divalidasi dengan pengukuran dunia nyata. Yang tampak seperti optimisasi yang jelas ternyata merupakan kompleksitas yang tidak perlu, berkat kemajuan dalam teknologi penyimpanan dan desain sistem operasi yang secara diam-diam telah merevolusi cara kita berpikir tentang performa I/O file.
Referensi: In-memory Filesystems in Rust