26
An illustrated guide to the buffer cache Selena Deckelmann Based on Greg Smith’s “Inside the Buffer Cache” http://www.westnet.com /gsmith/content/postgresql

Illustrated buffer cache

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Illustrated buffer cache

An illustrated guide to the buffer cache

Selena DeckelmannBased on Greg Smith’s “Inside the Buffer Cache”

http://www.westnet.com/∼gsmith/content/postgresql

Page 2: Illustrated buffer cache

Databases

Table

Table

Table

Databases are made of tables...

Page 3: Illustrated buffer cache

Table$PGDATA/base/

A table is just a directory...

Page 4: Illustrated buffer cache

Table$PGDATA/base/

Table

Table

You can have more than one table.

Page 5: Illustrated buffer cache

Table$PGDATA/base/

Table

TableFile

File

File

File

... Up to 1 GB

8K8K8K8K8K8K8K...

Made of Made of

Files are made up of 8K blocks.*

* you can change that at compile time.

Page 6: Illustrated buffer cache

shared_buffers

Page 7: Illustrated buffer cache

shared_buffers

ptr ptr ptr ptr ptr ...

An array of pointers to 8K blocks(and some other stuff)

shared_buffers is configured at database start.You have to restart Postgres to change it.

Page 8: Illustrated buffer cache

shared_buffers:the other stuff

FREE FREE FREE FREE FREE FREE

In the beginning...

Page 9: Illustrated buffer cache

shared_buffers:the other stuff

FREE FREE FREE FREE FREE FREE456 12 100 612 32 409

Page 10: Illustrated buffer cache

shared_buffers:the other stuff

X X X X X X456 12 100 612 32 409

Page 11: Illustrated buffer cache

shared_buffers:the other stuff

X X X X X Xbase/file1 base/file2 base/file1 base/file3 base/file1 base/file1

456 12 100 612 32 409Tag

Page 12: Illustrated buffer cache

shared_buffers:the other stuff

X X X X X Xbase/file1 base/file2 base/file1 base/file3 base/file1 base/file1

456 12 100 612 32 409FLAGS FLAGS FLAGS FLAGS FLAGS FLAGS

Tag

Status

Page 13: Illustrated buffer cache

shared_buffers:the other stuff

X X X X X Xbase/file1 base/file2 base/file1 base/file3 base/file1 base/file1

456 12 100 612 32 409PINNED flags flags flags flags flags

Tag

Status

UPDATE mytable (status) VALUES(‘my cat is the best ever’)where user = ‘selenamarie’;

{ }

Page 14: Illustrated buffer cache

shared_buffers:the other stuff

X X X X X Xbase/file1 base/file2 base/file1 base/file3 base/file1 base/file1

456 12 100 612 32 409PINNED DIRTY flags flags flags flags

Tag

Status

COMMIT;{ }

Page 15: Illustrated buffer cache

shared_buffers:the other stuff

X X X X X Xbase/file1 base/file2 base/file1 base/file3 base/file1 base/file1

456 12 100 612 32 409PINNED DIRTY OTHER OTHER OTHER OTHER

Tag

Status

BLAH BLAH BLAH;{ }

Page 16: Illustrated buffer cache

shared_buffers:the other stuff

X X X X X Xbase/file1 base/file2 base/file1 base/file3 base/file1 base/file1

456 12 100 612 32 409PINNED DIRTY OTHER OTHER OTHER OTHER

1 5 5 4 3 0

Tag

StatusUsage

Page 17: Illustrated buffer cache

shared_buffers:the lifecycle

X X X X X Xbase/file1 base/file2 base/file1 base/file3 base/file1 base/file1

456 12 100 612 32 409PINNED DIRTY OTHER OTHER OTHER OTHER

1 5 5 4 3 0

myPgProcess calls:BufferAlloc(‘base/file1’, 100);{ }

Page 18: Illustrated buffer cache

shared_buffers:the lifecycle

X X X X X Xbase/file1 base/file2 base/file1 base/file3 base/file1 base/file1

456 12 100 612 32 409PINNED DIRTY PINNED OTHER OTHER OTHER

1 5 5 4 3 0

myPgProcess calls:BufferAlloc(‘base/file1’, 100);{ }

Page 19: Illustrated buffer cache

shared_buffers:the lifecycle

myPgProcess calls:BufferAlloc(‘base/file1’, 101);{ }

X X X X X Xbase/file1 base/file2 base/file1 base/file3 base/file1 base/file1

456 12 100 612 32 409PINNED DIRTY OTHER OTHER OTHER OTHER

1 5 5 4 3 0

Page 20: Illustrated buffer cache

shared_buffers:the lifecycle

myPgProcess calls:BufferAlloc(‘base/file1’, 101);{ }

X X X X X Xbase/file1 base/file2 base/file1 base/file3 base/file1 base/file1

456 12 100 612 32 409PINNED DIRTY OTHER OTHER OTHER OTHER

1 5 5 4 3 0

Eviction!

Who’s it gonna be?

Page 21: Illustrated buffer cache

shared_buffers:the lifecycle

myPgProcess calls:BufferAlloc(‘base/file1’, 101);{ }

X X X X X Xbase/file1 base/file2 base/file1 base/file3 base/file1 base/file1

456 12 100 612 32 409PINNED DIRTY OTHER OTHER OTHER OTHER

0 5 5 4 3 0

Who’s it gonna be?

Scan the cache!Usage != 0,

so decrement.

Page 22: Illustrated buffer cache

shared_buffers:the lifecycle

myPgProcess calls:BufferAlloc(‘base/file1’, 101);{ }

X X X X X Xbase/file1 base/file2 base/file1 base/file3 base/file1 base/file1

456 12 100 612 32 409PINNED DIRTY OTHER OTHER OTHER OTHER

0 4 4 3 2 0

Who’s it gonna be?

Usage == 0,Goodbye!

Page 23: Illustrated buffer cache

shared_buffers:the lifecycle

myPgProcess calls:BufferAlloc(‘base/file1’, 101);{ }

X X X X X Xbase/file1 base/file2 base/file1 base/file3 base/file1 base/file1

456 12 100 612 32 101PINNED DIRTY OTHER OTHER OTHER PINNED

0 4 4 3 2 1

Who’s it gonna be?

Page 24: Illustrated buffer cache

shared_buffers:optimizations*

SELECT pg_relation_size(‘mytable’);VACUUM mytable;{ }

X X X X X X X ...base/file1 base/file2 base/file1 base/file3 base/file1 base/file1 base/file2 ...

456 12 100 612 32 101 891 ...PINNED DIRTY OTHER OTHER OTHER PINNED OTHER ...

0 4 4 3 2 0 1 ...

Result is greater than:

shared_buffers/4

* Version 8.3 and later

Page 25: Illustrated buffer cache

shared_buffers:optimizations

SELECT pg_relation_size(‘mytable’);VACUUM mytable;{ }

X X X X X X X ...base/file1 base/file2 base/file1 base/file3 base/file1 base/file1 base/file2 ...

456 12 100 612 32 101 891 ...PINNED DIRTY OTHER OTHER OTHER PINNED OTHER ...

0 4 4 3 2 0 1 ...

256K ringbuffer allocated!

* Version 8.3 and later

Page 26: Illustrated buffer cache

shared_buffers:optimizations

SELECT pg_relation_size(‘mytable’);VACUUM mytable;{ }

X X X X X X X ...base/file1 base/file2 base/file1 base/file3 base/file1 base/file1 base/file2 ...

456 12 100 612 32 101 891 ...PINNED DIRTY OTHER OTHER OTHER PINNED OTHER ...

0 4 4 3 2 0 1 ...

256K ringbuffer allocated!

OVERSIMPLIFICATION WARNING!

Safe duringVACUUM

* Version 8.3 and later