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

Attachment: 0001-pgbench-add-kqueue-implementation-of-the-socket-set-.patch
Description: Binary data

Reply via email to