I believe my numbers were 4k random access. Admittedly, this was an ages-ago kernel (2.6.18 derivative). mmap as a pattern has issues with concurrency, because you burn threads, and you can't cancel them. The only way out is to try to predict when an mmap page access will block and thread it differently, but then your code path gets longer.
There might be single-thread single-core patterns where mmap works best, or if newer kernels have changed. The reality: you have an IO, you put this "action" aside, you need to be woken up when complete, do you want to burn a thread or an IO context?
We also have recent numbers about using Linux's epoll / eventfd / signal mechanism, like Nginix seems to use, and its so deeply inferior to doing Linux AIO that its hard to choose that path, as seductive as single-event-loop is.
There might be single-thread single-core patterns where mmap works best, or if newer kernels have changed. The reality: you have an IO, you put this "action" aside, you need to be woken up when complete, do you want to burn a thread or an IO context?
We also have recent numbers about using Linux's epoll / eventfd / signal mechanism, like Nginix seems to use, and its so deeply inferior to doing Linux AIO that its hard to choose that path, as seductive as single-event-loop is.