Re: macOS prefetching support

Peter Eisentraut <peter@eisentraut.org>

From: Peter Eisentraut <peter@eisentraut.org>
To: Thomas Munro <thomas.munro@gmail.com>
Cc: pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2024-08-16T18:58:33Z
Lists: pgsql-hackers

Attachments

On 14.08.24 16:39, Peter Eisentraut wrote:
> On 14.08.24 14:36, Thomas Munro wrote:
>> On Wed, Aug 14, 2024 at 7:04 PM Peter Eisentraut 
>> <peter@eisentraut.org> wrote:
>>> Attached is a patch to implement this.  It seems to work, but of course
>>> it's kind of hard to tell whether it actually does anything useful.
>>
>> Header order problem: pg_config_os.h defines __darwin__, but
>> pg_config_manual.h is included first, and tests __darwin__.  I hacked
>> my way around that, and then made a table of 40,000,000 integers in a
>> 2GB buffer pool.  I used "select count(pg_buffercache_evict(buffered))
>> from pg_buffer_cache", and "sudo purge", to clear the two layers of
>> cache for each test, and then measured:
>>
>> maintenance_io_concurrency=0,  ANALYZE: 2311ms
>> maintenance_io_concurrency=10, ANALYZE:  652ms
>> maintenance_io_concurrency=25, ANALYZE:  389ms
>>
>> It works!
> 
> Cool!  I'll work on a more polished patch.

Here it is.

Some interesting questions:

What to do about the order of the symbols and include files.  I threw 
something into src/include/port/darwin.h, but I'm not sure if that's 
good.  Alternatively, we could not use __darwin__ but instead the more 
standard and predefined defined(__APPLE__) && defined(__MACH__).

How to document it.  The current documentation makes references mainly 
to the availability of posix_fadvise().  That seems quite low-level. 
How could a user of a prepared package even find out about that?  Should 
we just say "requires OS support" (kind of like I did here) and you can 
query the effective state by looking at the *_io_concurrency settings? 
Or do we need a read-only parameter that shows whether prefetch support 
exists (kind of along the lines of huge pages)?

Btw., for context, here is what I gather the prefetch support (with this 
patch) is:

cygwin          posix_fadvise
darwin          fcntl
freebsd         posix_fadvise
linux           posix_fadvise
netbsd          posix_fadvise
openbsd         no
solaris         fake
win32           no

(There is also the possibility that we provide an implementation of 
posix_fadvise() for macOS that wraps the platform-specific code in this 
patch.  And then Apple could just take that. ;-) )

Commits

  1. Standardize "read-ahead advice" terminology.

  2. Fixup for prefetching support on macOS

  3. Add prefetching support on macOS