Re: Tests with switch of WAL segment files.

From: "J(dot) Carlos Muro" <murojc(at)gmail(dot)com>
To: pgsql-admin <pgsql-admin(at)postgresql(dot)org>
Subject: Re: Tests with switch of WAL segment files.
Date: 2009-07-17 10:44:22
Message-ID: 992cea4f0907170344w372165c9q96522af763a0bda3@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-admin

I realized something else, that only happened once.
I recreated the cluster. If I execute "select pg_switch_xlog();" once, then
segment file gets almost immediately switched (a new file is created) even
though I don't insert new data. If I waite some thime and execute "select
pg_switch_xlog();" then segments are almost inmediately switched again, and
so on...
If instead I execute "select pg_switch_xlog();" N consecutive times (N > 1),
then the segment file is not switched until new inserts arrive...

I tried to reproduce the case, recreating the cluster, but it didn't happen
again. It is very extrange...

Anyone has got some similar experience? BTW, I am running "PostgreSQL 8.3.7
on x86_64-pc-linux-gnu".

2009/7/16 J. Carlos Muro <murojc(at)gmail(dot)com>

> Hi! I am trying to better understand when switch of WAL files takes place.
> I have executed the next tests while "archive_mode = off":
>
> $ initdb -D /var/lib/postgresql/8.3/data
>
> $ du -sk /var/lib/postgresql/8.3/data/base
> 13156 base
>
> $ psql -c "drop table if exists heavytable; create table heavytable as
> select * from pg_class, pg_description;"
> $ du -sk /var/lib/postgresql/8.3/data/base
> 116532 base
> $ ls -lh /var/lib/postgresql/8.3/data/pg_xlog
> -rw------- 1 postgres postgres 16M 2009-07-16 17:21
> 000000010000000000000000
>
> $ psql -t -c "select
> pg_size_pretty(pg_total_relation_size('heavytable')) as size;"
> 97 MB
>
> $ psql -c "drop table if exists heavytable; create table heavytable as
> select * from pg_class, pg_description;"
> $ psql -c "drop table if exists heavytable; create table heavytable as
> select * from pg_class, pg_description;"
> $ psql -c "drop table if exists heavytable; create table heavytable as
> select * from pg_class, pg_description;"
> $ du -sk /var/lib/postgresql/8.3/data/base
> 116588 base
> $ ls -lh /var/lib/postgresql/8.3/data/pg_xlog
> -rw------- 1 postgres postgres 16M 2009-07-16 17:26
> 000000010000000000000000
>
> I create many other times the 'heavytable', nothing changed, WAL segment
> file keeps to be the same, the size of base directory almost didn't change.
> I guess that's normal, and I think there is something that I haven't yet
> reached to understand from all the docs that I have read. I have two
> questions:
>
> Q1 - Why do I have just one segment file the whole time? I thought
> PostgreSQL would create at least 3 of them at the beginning... I have
> "checkpoint_segments = 3".
>
> If I now state a "select pg_switch_xlog();" it returns one label, but if I
> execute it again N times it will constantly return the same label (while I
> don't insert data).
> I have executed "select pg_switch_xlog();" many times (please see the next
> log of tests). After that, I realize that PostgreSQL is ready to create the
> next segment file ONLY whenever I insert new data.
>
> Q2 - After that, I stated a CHECKPOINT, what caused a switch to a new file.
> I execute CHECKPOINT once again and switch takes place again. But, if I
> execute CHECKPOINT again and again, from now and on will NOT be any
> switches. Why? What makes the switch to a new file take place?
>
> Here is the log of tests:
>
> $ psql -p 5433 --tuples-only webcreds -c "select pg_switch_xlog();"
> 0/4EFA80
> $ du -sk /var/lib/postgresql/8.3/data/base
> 116684 base
> $ ls -lh /var/lib/postgresql/8.3/data/pg_xlog
> -rw------- 1 postgres postgres 16M 2009-07-16 18:23
> 000000010000000000000000
>
> $ psql -c "drop table if exists heavytable; create table heavytable as
> select * from pg_class, pg_description;"
> $ ls -lh /var/lib/postgresql/8.3/data/pg_xlog
> -rw------- 1 postgres postgres 16M 2009-07-16 18:45
> 000000010000000000000000
> -rw------- 1 postgres postgres 16M 2009-07-16 18:45
> 000000010000000000000001
>
> $ psql -p 5433 --tuples-only webcreds -c "select pg_switch_xlog();"
> 0/100B9D0
> $ psql -p 5433 --tuples-only webcreds -c "select pg_switch_xlog();"
> 0/2000000
> $ psql -p 5433 --tuples-only webcreds -c "select pg_switch_xlog();"
> 0/2000000
> $ psql -p 5433 --tuples-only webcreds -c "select pg_switch_xlog();"
> 0/2000000
> $ psql -c "drop table if exists heavytable; create table heavytable as
> select * from pg_class, pg_description;"
> $ ls -lh /var/lib/postgresql/8.3/data/pg_xlog
> -rw------- 1 postgres postgres 16M 2009-07-16 18:45
> 000000010000000000000000
> -rw------- 1 postgres postgres 16M 2009-07-16 18:48
> 000000010000000000000001
> -rw------- 1 postgres postgres 16M 2009-07-16 18:49
> 000000010000000000000002
>
> $ psql -p 5433 --tuples-only webcreds -c "CHECKPOINT;" # <== it causes
> switch
> $ ls -lh /var/lib/postgresql/8.3/data/pg_xlog
> -rw------- 1 postgres postgres 16M 2009-07-16 18:48
> 000000010000000000000001
> -rw------- 1 postgres postgres 16M 2009-07-16 18:52
> 000000010000000000000002
> -rw------- 1 postgres postgres 16M 2009-07-16 18:45
> 000000010000000000000003
>
> $ psql -p 5433 --tuples-only webcreds -c "CHECKPOINT;" # <== one of
> these will cause switch
> $ psql -p 5433 --tuples-only webcreds -c "CHECKPOINT;"
> $ psql -p 5433 --tuples-only webcreds -c "CHECKPOINT;"
> $ ls -lh /var/lib/postgresql/8.3/data/pg_xlog
> -rw------- 1 postgres postgres 16M 2009-07-16 18:48
> 000000010000000000000002
> -rw------- 1 postgres postgres 16M 2009-07-16 18:52
> 000000010000000000000003
> -rw------- 1 postgres postgres 16M 2009-07-16 18:45
> 000000010000000000000004
>
> $ psql -p 5433 --tuples-only webcreds -c "CHECKPOINT;" # <== there
> won't be any switches from now and on!
> $ psql -p 5433 --tuples-only webcreds -c "CHECKPOINT;"
> $ psql -p 5433 --tuples-only webcreds -c "CHECKPOINT;"
> $ ls -lh /var/lib/postgresql/8.3/data/pg_xlog
> -rw------- 1 postgres postgres 16M 2009-07-16 18:48
> 000000010000000000000002
> -rw------- 1 postgres postgres 16M 2009-07-16 18:52
> 000000010000000000000003
> -rw------- 1 postgres postgres 16M 2009-07-16 18:45
> 000000010000000000000004
>
> $ psql -c "drop table if exists heavytable; create table heavytable as
> select * from pg_class, pg_description;"
> $ ls -lh /var/lib/postgresql/8.3/data/pg_xlog
> -rw------- 1 postgres postgres 16M 2009-07-16 18:56
> 000000010000000000000002
> -rw------- 1 postgres postgres 16M 2009-07-16 18:45
> 000000010000000000000003
> -rw------- 1 postgres postgres 16M 2009-07-16 18:48
> 000000010000000000000004
>
> $ psql -p 5433 --tuples-only webcreds -c "CHECKPOINT;"
> $ psql -p 5433 --tuples-only webcreds -c "CHECKPOINT;"
> $ ls -lh /var/lib/postgresql/8.3/data/pg_xlog
> -rw------- 1 postgres postgres 16M 2009-07-16 18:56
> 000000010000000000000002
> -rw------- 1 postgres postgres 16M 2009-07-16 18:45
> 000000010000000000000003
> -rw------- 1 postgres postgres 16M 2009-07-16 18:48
> 000000010000000000000004
>
> $ psql -c "drop table if exists heavytable; create table heavytable as
> select * from pg_class, pg_description;"
> $ ls -lh /var/lib/postgresql/8.3/data/pg_xlog
> -rw------- 1 postgres postgres 16M 2009-07-16 18:59
> 000000010000000000000002
> -rw------- 1 postgres postgres 16M 2009-07-16 18:45
> 000000010000000000000003
> -rw------- 1 postgres postgres 16M 2009-07-16 18:48
> 000000010000000000000004
>
> $ psql -p 5433 --tuples-only webcreds -c "CHECKPOINT;"
> $ ls -lh /var/lib/postgresql/8.3/data/pg_xlog
> -rw------- 1 postgres postgres 16M 2009-07-16 19:00
> 000000010000000000000002
> -rw------- 1 postgres postgres 16M 2009-07-16 18:45
> 000000010000000000000003
> -rw------- 1 postgres postgres 16M 2009-07-16 18:48
> 000000010000000000000004
>
> Thanks in advance!!
> J. Carlos Muro
>

In response to

Responses

Browse pgsql-admin by date

  From Date Subject
Next Message Andreas Wenk 2009-07-17 13:17:32 Re: Enhancement - code completion when typing set search_path
Previous Message rasa 2009-07-17 09:16:38 Re: PostgreSQL using 100% CPU