Fork! in Valum
Ever heard of fork
?
using GLib;
using VSGI.HTTP;
var server = new Server ("", () => {
return res.expand_utf8 ("Hello world!");
});
server.listen (new VariantDict ().end ());
server.fork ();
new MainLoop ().run ();
Yeah, there’s a new API for listening and forking with custom options…
The fork
system call will actually copy the whole process into a new process,
running the exact same program.
Although memory is not shared, file descriptors are, so you can have workers listening on common interfaces.
I notably tested the whole thing on our cluster at IRIC. It’s a 64 cores Xeon Core i7 setup.
wrk -c 1024 -t 32 http://0.0.0.0:3003/hello
With a single worker:
Running 10s test @ http://0.0.0.0:3003/hello
32 threads and 1024 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 54.35ms 95.96ms 1.93s 98.78%
Req/Sec 165.81 228.28 2.04k 86.08%
41741 requests in 10.10s, 5.89MB read
Socket errors: connect 35, read 0, write 0, timeout 13
Requests/sec: 4132.53
Transfer/sec: 597.28KB
With 63 forks (64 workers):
Running 10s test @ http://0.0.0.0:3003/hello
32 threads and 1024 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 60.83ms 210.70ms 2.00s 93.58%
Req/Sec 2.99k 797.97 7.44k 70.33%
956577 requests in 10.10s, 135.02MB read
Socket errors: connect 35, read 0, write 0, timeout 17
Requests/sec: 94720.20
Transfer/sec: 13.37MB
It’s about 1500 req/sec per worker and an speedup of a factor of 23. The latency is almost not affected.