Thread: about BufferPoolBlowaway()

about BufferPoolBlowaway()

From
"Seung Hyun Jeong"
Date:
Hi, all.

I am experimenting on performance evaluation for some queries based on
PostgreSQL.
To give fair conditions to each queries, I try to clear buffer of PostgreSQL
before running each queries.
I think  the following function in .../backend/storage/buffer/bufmgr.c seems
to be designed
for such a purpose.
But the function seems to have a logical error in my opinion.

void BufferPoolBlowaway()
{
1:    int  i;

2:   BufferSync();
3:    for (i = 1; i <= NBuffers; i++)
4:   {
5:        if (BufferIsValid(i))
6:       {
7:           while (BufferIsValid(i))  ReleaseBuffer(i);
8:        }
9:       BufTableDelete(&BufferDescriptors[i - 1]);   }
}

The line 7 causes an infinite loop, I think.
So, what I did instead is the following:

void BufferPoolBlowaway()
{
1:    BufferDesc  *bufHdr;
2:    int  i;

3:    BufferSync();
4:    for (i = 1; i <= NBuffers; i++)
5:   {
6:       if (BufferIsValid(i))
7:      {
8:          bufHdr = &BufferDescriptors[i - 1];
9:          while (bufHdr->refcount > 0) ReleaseBuffer(i);
10:     }
11:     BufTableDelete(&BufferDescriptors[i - 1]);
12: }
}

Line 1, 8, and 9 are added instead of the original to release buffers.
It works without any infinite loop, but I am not quite sure that my
modification is reasonable.
Can anybody advise me about the modification?

In addition, I wonder that the disk read/write operations via buffer manager
in PostgreSQL
are free from linux system buffer cache.
If not, does anyone know how to flush and initialize the linux system buffer
cache?

Cheers.










Re: about BufferPoolBlowaway()

From
Tom Lane
Date:
"Seung Hyun Jeong" <jeongs@cs.man.ac.uk> writes:
> I am experimenting on performance evaluation for some queries based on
> PostgreSQL.
> To give fair conditions to each queries, I try to clear buffer of PostgreSQL
> before running each queries.
> I think  the following function in .../backend/storage/buffer/bufmgr.c seems
> to be designed
> for such a purpose.
> But the function seems to have a logical error in my opinion.

Actually, BufferPoolBlowaway is so completely wrong-headed that it
should be removed entirely.  You can't go around arbitrarily releasing
pins on buffers.  The holder of the pin is going to crash or corrupt
data if you do.

I'm not convinced that starting from an empty disk cache is a
particularly interesting performance measurement, but if you insist
on it: reboot and start the postmaster for each measurement.  (Anything
less than a reboot is an exercise in self-deception, since Postgres
relies on the kernel's disk cache quite as much as its own buffers.)
        regards, tom lane