Hi hackers! While working on [1] I run performance tests on different environments, including laptop with macOS. pgbench is usually chosen for this, but on one of the last runs I discovered that it uses select() on macOS (which lacks the ppoll() syscall), which caps the max amount of clients at 1024 (FD_SETSIZE).
This can be fixed with new implementation of socket_set based on kqueue(). The only wrinkle is fact that select() and ppoll() is stateless, while kqueue() is not (registration persists in kernel across kevent() calls), so wait_on_socket_set() must be written in harder way than other implementations: - disable stale registrations: EV_DISABLE for every fd to drain error for closed fds - enable current set with EV_ENABLE, call kevent() - report results (save flags in socket_set->input_ready) + preserving the set for the next iteration POC-patch attached, any feedback would be appreciated! [1] - https://github.com/yandex/odyssey -- Best regards, Roman Khapov
0001-pgbench-add-kqueue-implementation-of-the-socket-set-.patch
Description: Binary data
