| From: | Jeff Anton <antonpgsql(at)hesiod(dot)org> |
|---|---|
| To: | pgsql-hackers(at)lists(dot)postgresql(dot)org |
| Subject: | Re: kqueue backend for pgbench |
| Date: | 2026-10-28 15:42:39 |
| Message-ID: | 15e57b71-5c59-4cdd-bbde-cdc8f5a8de0b@hesiod.org |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
This is a lot of work which probably is not needed.
I don't think you understand select and the supporting fd_set type.
I'll include the NOTES from Freebsd on the select(2) man page....
NOTES
The default size of FD_SETSIZE is currently 1024. In order to
accommodate programs which might potentially use a larger number
of open
files with select(), it is possible to increase this size by
having the
program define FD_SETSIZE before the inclusion of any header which
includes <sys/types.h>.
If nfds is greater than the number of open files, select() is not
guaranteed to examine the unused file descriptors. For historical
reasons, select() will always examine the first 256 descriptors.
Another solution to this is to have code which does not use fd_set but
instead uses its own method of building and using bit arrays. I have
done this in my professional development.
Jeff Anton
PS: For those of you who do not know me, I was the first lead programmer
on the Postgres project at U.C.Berkeley a very long time ago. You can
blame me (or praise me) for many of the internals such as memory contexts.
On 10/25/26 23:41, Roman Khapov wrote:
> 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
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Andres Freund | 2026-10-28 15:57:53 | Re: WAL record CRC calculated incorrectly because of underlying buffer modification |
| Previous Message | David Steele | 2026-10-28 15:32:34 | Re: Return pg_control from pg_backup_stop(). |