Re: kqueue backend for pgbench

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

In response to

Responses

Browse pgsql-hackers by date

  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().