Get started

Performance

What Side Space feels like, measured, including what it does badly. Every number here, how it was measured and on what machine.

These are the numbers people feel: how long until a file you've never downloaded starts playing, how fast a big save goes, how quickly a folder lists. We publish what we do badly too, because that's also what we're fixing next.

Results

WhatResultNotes
Save a new 1 GiB file168 MiB/sCLI put; content-defined chunks, every chunk new
Save it again with 1 MiB changed in the middle1.6 sOnly the changed chunks are sent; the time is mostly local re-hashing
First 64 KiB of a file never downloaded37 msLinux mount (FUSE), open and read
Then 64 KiB near its end20 msFetches only the chunk it touches
Read all of it, cold240 MiB/sSequential, from the block gateway
Read it all again, cached536 MiB/sFrom the local cache
List a folder of 5,000 files132 msls in the mount
Write 500 small files into the mount133 files/sReturns before uploading
…until all 500 are versions on the server4.0 sFrom the first write
Save a 1 KiB file with the SDKp50 22 ms, p95 27 msPython SDK
Read it backp50 7 ms, p95 8 ms
Look up a pathp50 3 ms, p95 4 ms
Append a line at the endp50 67 ms, p95 72 msappend_text

What we do badly

  • Appending a line is 3× slower than saving the whole small file again (67 ms against 22 ms). An append looks the file up, then the server reads the old content, adds the line and chunks it all again. For small files a whole save is faster today; an append should rewrite only the last chunk.
  • Listing the same folder again isn't faster (141 ms the second time). The mount caches folders for only a second, so every ls asks the server. The client already keeps a copy of the whole tree and could answer from it, kept current by push updates.
  • Re-saving a 1 GiB file after changing 1 MiB takes 1.6 s, nearly all of it spent reading the whole file again to hash it. The mount already knows which bytes were written and could re-hash only the chunks they touch.

Run it yourself

From a checkout of the repository, on Linux with Docker:

Shell
scripts/dev-up.sh --native && tests/e2e/bench.sh     # BENCH_MB=2048 BENCH_FILES=10000 to scale up

It prints the same table and writes the raw results as JSON. Server capacity under many users (the load test) is in docs/performance.md in the repository.