Skip to content

Build1 publisher2 min readPublished

SeaweedFS volume servers keep a 16-byte per-blob index in memory for single-seek reads

RustFS gives you an S3 endpoint you start with one docker run, while SeaweedFS gives you a file system that also speaks S3. A dev.to comparison puts the dividing line at POSIX mounts and the count of tiny files.

The Engineer · Build desk

Illustration accompanying SeaweedFS volume servers keep a 16-byte per-blob index in memory for single-seek reads

What happened

  • SeaweedFS and RustFS are both Apache 2.0 single-binary stores, but SeaweedFS is a distributed file system that also speaks S3 and RustFS is a MinIO-compatible S3 object store with a web console.
  • RustFS's README marks S3 Core, versioning, object lock, lifecycle, bucket and site replication, IAM, server-side encryption and distributed mode available today, with S3 Tables in preview.
  • SeaweedFS's weed mini command starts the master, a volume server, the filer, WebDAV, the Iceberg REST catalog and the Admin UI in one process, with the S3 endpoint on port 8333.

Compiled by The EngineerSomething wrong?How this is made

Why it matters

  • decision Any consumer that opens a path instead of a key settles the choice before performance enters it, because RustFS ships no POSIX layer and no FUSE mount.
  • cost Running SeaweedFS means operating a master, volume servers and a filer; the RustFS container asks nobody on call to reason about a quorum, placement groups or a set of daemons.
  • capability One weed process can hand the same bytes to an S3 client, a FUSE mount on Linux, macOS or Windows, WebDAV, SFTP, HDFS and an Iceberg REST catalog, so a lakehouse and a file consumer need not each keep a copy.
  • constraint There is no published per-object index size for RustFS and the dev.to post says the comparison is not apples-to-apples, so a team cannot settle the footprint question on metadata numbers.

A read in SeaweedFS does not touch the master. Clients cache the volume-to-server mapping and talk to volume servers directly, so the master never sits in the read path [9]. The volume server keeps a 16-byte index entry per blob in memory and resolves it in a single seek, including for erasure-coded data [8]. On disk each file costs 40 bytes of metadata [8]. Because the master tracks volumes and not files, a cluster holding billions of files still has only a few thousand volumes to account for [9].

Put a billion files through that model and the index is 16 GB of memory spread across the volume servers, with 40 GB of metadata on disk [1]. Small files are packed into append-only volume files, so there is no per-file inode and no per-file metadata file [20].

The claim SeaweedFS makes for the binary is broad. Its own README says one weed binary "serves an S3 object store, a POSIX file system, and a lakehouse with S3 Tables, all over the same data" [4].

RustFS starts differently. The documented command is a single docker run that publishes the S3 API on port 9000 and a console on port 9001 [13], and bare metal has a one-line installer fetched from rustfs.com [15]. Default credentials are rustfsadmin and rustfsadmin, the same string twice, and the dev.to write-up says you must rotate them before any production exposure [14].

The throughput figure attached to SeaweedFS is its README's own: 1 million 1KB files at concurrency 16 on a MacBook with an SSD, which the dev.to post calls unscientific and cites as a scale signal, not a hardware review [10]. For that number to say anything about your cluster, your objects would have to be about 1KB, your client would have to hold 16 requests in flight, the store would have to be one machine, and the disk would have to be a local SSD. Change any of those and you are reading a measurement of someone else's laptop.

So the decision comes down to interfaces. RustFS has no POSIX layer and no FUSE mount [7]. The dev.to comparison's rule is to pick SeaweedFS when you need a POSIX/FUSE mount, an Iceberg lakehouse, or billions of small files, and to pick RustFS when S3 is your only interface and a drop-in MinIO replacement in one docker run is the goal [18]. I think that split is right, and the deciding question is cheap to answer: list every consumer of the bucket and check whether any of them takes a path rather than a key.

What to watch

  • Whether RustFS moves S3 Tables (Iceberg REST) out of preview into its available column.
  • A small-file benchmark for SeaweedFS run on server disks by someone other than the project.
  • A published per-object metadata figure from RustFS: without one the footprint comparison stays one-sided.
Loading claim ledger
Loading source directory links
Loading share composer
Loading topic controls
Loading related stories