I’m currently working on implementing a WebDAV server using Plug/Cowboy, inspired by the great Python wsgidav library. So far read only access works fine and when downloading files using
Plug.Conn.chunk I’m seeing very good performance (1,88GB/s - GigaBYTES from local SSD to /dev/null) with less than 50% scheduler utilization:
But while implementing initial write support I’ve noticed that the other direction, using
Plug.Conn.read_body maxes out at about 200MB/s - even when just discarding the output:
You can try this yourselves by cloning the repository (
write_support branch) and running the demo project from the
demo folder. Then starting the server is as easy as using
iex -S mix after the usual
mix deps.get step.
For uploading, you can use
curl -X PUT -F 'data=@/dev/random' http://demo:firstname.lastname@example.org:5001/tmp/test.null.
For downloading, first create/download a sufficiently large file and then use
wget -O /dev/null "http://127.0.0.1:5001/tmp/10G" --user demo --password demo (replace /tmp/10G with the file path).
I tried tweaking the
Plug.Conn.read_body opts, but did not find anything that improved this.
Maybe someone with deeper insight into plug/cowboy has an idea why the
Plug.Conn.read_body direction performs so bad. I’d expect both directions to have roughly the same performance and scheduler usage.
Thanks for any hints!