I was thinking of improving static file serving performance of Ferron 3 to be more in par with NGINX, and searching for performance optimizations.
I used strace logs to investigate why Ferron was slower than NGINX. It turns out that zincio, the asynchronous Rust runtime used by Ferron 3, made unnecessary epoll_wait system calls with zeroed timeout.
So I ended up modifying the I/O driver code of zincio, so it does epoll_wait with zeroed timeout (“flush”) only when there are I/O operations to poll. The “flush” exists to mitigate I/O starvation, but “flushing” even when there’s nothing to flush is just system call overhead.
I was so satisfied! ![]()
So I measured the web server performance, and found out that on localhost benchmarks, it’s getting close to NGINX if using epoll (io_uring had lower throughput, that’s why I switched to epoll to be new default for Ferron 3).
I also measured performance over a local network to update the benchmarks page for Ferron 3 website variant with, and found that Ferron 3 has high throughput, that I was wondering if I’m
…
