pgsql: Improve eviction algorithm in ReorderBuffer using max-heap for m

Поиск
Список
Период
Сортировка
От Masahiko Sawada
Тема pgsql: Improve eviction algorithm in ReorderBuffer using max-heap for m
Дата
Msg-id E1rrqYp-000E0E-Iz@gemulon.postgresql.org
обсуждение исходный текст
Список pgsql-committers
Improve eviction algorithm in ReorderBuffer using max-heap for many subtransactions.

Previously, when selecting the transaction to evict during logical
decoding, we check all transactions to find the largest
transaction. This could lead to a significant replication lag
especially in the case where there are many subtransactions.

This commit improves the eviction algorithm in ReorderBuffer using the
max-heap with transaction size as the key to efficiently find the
largest transaction.

The max-heap starts with empty. While the max-heap is empty, we don't
do anything for the max-heap when updating the memory
counter. Therefore, we get the largest transaction in O(N) time, where
N is the number of transactions including top-level transactions and
subtransactions.

We build the max-heap just before selecting the largest transactions
if the number of transactions being decoded is higher than the
threshold, MAX_HEAP_TXN_COUNT_THRESHOLD. After building the max-heap,
we also update the max-heap when updating the memory counter. The
intention is to efficiently find the largest transaction in O(1) time
instead of incurring the cost of memory counter updates (O(log
N)). Once the number of transactions got lower than the threshold, we
reset the max-heap.

The performance benchmark results showed significant speed up (more
than x30 speed up on my machine) in decoding a transaction with 100k
subtransactions, whereas there is no visible overhead in other cases.

Reviewed-by: Amit Kapila, Hayato Kuroda, Vignesh C, Ajin Cherian,
Tomas Vondra, Shubham Khanna, Peter Smith, Álvaro Herrera,
Euler Taveira
Discussion: https://postgr.es/m/CAD21AoAfKTgrBrLq96GcTv9d6k97zaQcDM-rxfKEt4GSe0qnaQ%40mail.gmail.com

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/5bec1d6bc5e3ee44a229228a2749567eb2ab7beb

Modified Files
--------------
src/backend/replication/logical/reorderbuffer.c | 237 +++++++++++++++++++++---
src/include/replication/reorderbuffer.h         |   4 +
2 files changed, 214 insertions(+), 27 deletions(-)


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

Предыдущее
От: David Rowley
Дата:
Сообщение: pgsql: Don't adjust ressortgroupref in generate_setop_child_grouplist()
Следующее
От: Nathan Bossart
Дата:
Сообщение: pgsql: Add built-in ERROR handling for archive callbacks.