Re: SLRU optimization - configurable buffer pool and partitioning the SLRU lock

Tender Wang <tndrwang@gmail.com>

From: tender wang <tndrwang@gmail.com>
To: "Andrey M. Borodin" <x4mmm@yandex-team.ru>
Cc: Amul Sul <sulamul@gmail.com>, Dilip Kumar <dilipbalaut@gmail.com>, Alvaro Herrera <alvherre@alvh.no-ip.org>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2023-12-14T11:32:06Z
Lists: pgsql-hackers
Andrey M. Borodin <x4mmm@yandex-team.ru> 于2023年12月14日周四 17:35写道:

>
>
> > On 14 Dec 2023, at 14:28, tender wang <tndrwang@gmail.com> wrote:
> >
> >   Now that AND is more faster, Can we  replace the '%
> SLRU_MAX_BANKLOCKS' operation in  SimpleLruGetBankLock()  with '& 127'
>
> unsigned int GetBankno1(unsigned int pageno) {
> return pageno & 127;
> }
>
> unsigned int GetBankno2(unsigned int pageno) {
> return pageno % 128;
> }
>
> Generates with -O2
>
> GetBankno1(unsigned int):
> mov eax, edi
> and eax, 127
> ret
> GetBankno2(unsigned int):
> mov eax, edi
> and eax, 127
> ret
>
>
> Compiler is smart enough with constants.
>

Yeah, that's true.

int GetBankno(long pageno) {
    unsigned short bank_mask = 128;
    int bankno = (pageno & bank_mask) % 128;
    return bankno;
}
enable -O2, only one  instruction:
xor     eax, eax

But if we all use '%',  thing changs as below:
int GetBankno(long pageno) {
    unsigned short bank_mask = 128;
    int bankno = (pageno % bank_mask) % 128;
    return bankno;
}
        mov     rdx, rdi
        sar     rdx, 63
        shr     rdx, 57
        lea     rax, [rdi+rdx]
        and     eax, 127
        sub     eax, edx


> Best regards, Andrey Borodin.

Commits

  1. Fix zeroing of pg_serial page without SLRU bank lock

  2. Fix misspelled assertions

  3. GUC table: Add description to computed variables

  4. Improve performance of subsystems on top of SLRU

  5. Rename SLRU elements in view pg_stat_slru

  6. Use atomic access for SlruShared->latest_page_number

  7. Split use of SerialSLRULock, creating SerialControlLock

  8. Index SLRUs by 64-bit integers rather than by 32-bit integers

  9. Add a macro templatized hashtable.