Re: pgsql: Use pre-fetching for ANALYZE

Поиск
Список
Период
Сортировка
От Andres Freund
Тема Re: pgsql: Use pre-fetching for ANALYZE
Дата
Msg-id 20220603023016.rlht3r7fmkksw5z7@alap3.anarazel.de
обсуждение исходный текст
Ответы Re: pgsql: Use pre-fetching for ANALYZE  (Andres Freund <andres@anarazel.de>)
Список pgsql-hackers
Hi,

On 2021-03-16 18:48:08 +0000, Stephen Frost wrote:
> Use pre-fetching for ANALYZE
> 
> When we have posix_fadvise() available, we can improve the performance
> of an ANALYZE by quite a bit by using it to inform the kernel of the
> blocks that we're going to be asking for.  Similar to bitmap index
> scans, the number of buffers pre-fetched is based off of the
> maintenance_io_concurrency setting (for the particular tablespace or,
> if not set, globally, via get_tablespace_maintenance_io_concurrency()).

I just looked at this as part of debugging a crash / hang in the AIO patch.

The code does:

        block_accepted = table_scan_analyze_next_block(scan, targblock, vac_strategy);

#ifdef USE_PREFETCH

        /*
         * When pre-fetching, after we get a block, tell the kernel about the
         * next one we will want, if there's any left.
         *
         * We want to do this even if the table_scan_analyze_next_block() call
         * above decides against analyzing the block it picked.
         */
        if (prefetch_maximum && prefetch_targblock != InvalidBlockNumber)
            PrefetchBuffer(scan->rs_rd, MAIN_FORKNUM, prefetch_targblock);
#endif

I.e. we lock a buffer and *then* we prefetch another buffer. That seems like a
quite bad idea to me. Why are we doing IO while holding a content lock, if we
can avoid it?

Greetings,

Andres Freund



В списке pgsql-hackers по дате отправления:

Предыдущее
От: Bruce Momjian
Дата:
Сообщение: Re: Multi-Master Logical Replication
Следующее
От: Andres Freund
Дата:
Сообщение: Re: pgsql: Use pre-fetching for ANALYZE