Skip to content

A high performance sparse file webserver written in Rust

Notifications You must be signed in to change notification settings

wobcom/sparsesrv

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

sparsesrv

A high performance sparse file webserver written in Rust

Why?

We needed something to serve large, random files fast for a speedtest service. In the past we had prepared files on the filesystem. That was slow and took up a lot of space. When deploying an anycasted speedtest service we didn't want to waste the space on 8 machines - so this project was born.

Why don't you deliver just zeroes?

Some proxies compress or cache the transmitted data. We want to test the end to end speed. That's why we're using a random number generator.

The data is generated using the extremely fast SmallRng of the rand crate.

How fast is it?

In our setup running in VMs on AMD EPYC 7302P processors @ 3.3 GHz we achieve ~20 Gbit/s per stream. We're sure further optimization is possible, but this is okay for us, as our machines only have 25 Gbit/s interfaces anyways. Feel free to contribute optimizations.

Build

If you are using the Nix package manager, there is a flake file included. ❄️

Building manually is straightforward using Cargo:

cargo build --release

Deployment Considerations

Network Stack

Tune your kernel network stack:

# Increase network buffer size
net.core.rmem_max=134217728
net.core.wmem_max=134217728

# Increase TCP buffer size
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864

# Enable BBR TCP scheduler
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr

Consider increasing your NICs buffer sizes and the amount of queues. If you are running this in a VM, consider enabling Multi-Queue in your virtio-net

Reverse Proxy

If you are using nginx as a reverse proxy you want to consider a few settings:

  • Set caching and last-modified headers
  • Turn off gzip compression
  • Increase proxy_read_timeout
  • Increase proxy_buffers size

That's what our config looks like:

add_header Cache-Control 'no-store, no-cache, max-age=0, no-transform';
add_header Last-Modified $date_gmt;
  if_modified_since off;
  expires off;
  etag off;

gzip off;
proxy_read_timeout 999;
proxy_buffers 16 128k;

About

A high performance sparse file webserver written in Rust

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published