[PERFORM] tuning for TPC-C benchmark

2007-11-22 Thread [EMAIL PROTECTED]
Hello all,
I'm doing tests on various Database and in particular I'm running a 
comparison between Oracle 10g and Postgres 8.1 on a dedicated server 
with 2 processors Dual-Core AMD Opteron 2218  2.6 GHz, 4GB of memory 
and Debian GNU / Linux version 2.6.18-5. Performance is very similar up 
to 30 users, but from 40 onwards with Postgres fall quickly. That is 
not what happens with Oracle that comes to 600 users. Can you help me 
with the tuning ?
Thanks a lot
My postgresql.conf configuration is:
#---
# FILE LOCATIONS
#---

# The default values of these variables are driven from the -D command 
line
# switch or PGDATA environment variable, represented here as 
ConfigDir.

#data_directory = 'ConfigDir'   # use data in another 
directory
hba_file = '/etc/postgresql/8.1/main/pg_hba.conf'   # host-based 
authentication file
ident_file = '/etc/postgresql/8.1/main/pg_ident.conf'   # IDENT 
configuration file

# If external_pid_file is not explicitly set, no extra pid file is 
written.
external_pid_file = '/var/run/postgresql/8.1-main.pid'  # 
write an extra pid file


#---
# CONNECTIONS AND AUTHENTICATION
#---

# - Connection Settings -

#listen_addresses = 'localhost' # what IP address(es) to 
listen on;
  # comma-
separated list of addresses;
 # defaults to 
'localhost', '*' = all
listen_addresses = '*'
port = 5432
max_connections = 220
# note: increasing max_connections costs ~400 bytes of shared memory 
per
# connection slot, plus lock space (see max_locks_per_transaction).  
You
# might also need to raise shared_buffers to support more connections.
#superuser_reserved_connections = 2
unix_socket_directory = '/var/run/postgresql'
#unix_socket_group = ''
#unix_socket_permissions = 0777 # octal
#bonjour_name = ''  # defaults to the computer 
name

# - Security  Authentication -

#authentication_timeout = 60# 1-600, in seconds
ssl = true
#password_encryption = on
#db_user_namespace = off

# Kerberos
#krb_server_keyfile = ''
#krb_srvname = 'postgres'
#krb_server_hostname = ''   # empty string matches any 
keytab entry
#krb_caseins_users = off

# - TCP Keepalives -
# see 'man 7 tcp' for details

#tcp_keepalives_idle = 0# TCP_KEEPIDLE, in seconds;
   # 0 selects the 
system default
#tcp_keepalives_interval = 0# TCP_KEEPINTVL, in seconds;
 # 0 selects 
the system default
#tcp_keepalives_count = 0  # TCP_KEEPCNT;
 # 0 selects 
the system default


#---
# RESOURCE USAGE (except WAL)
#---

# - Memory -

shared_buffers = 49152# min 16 or max_connections*2, 
8KB each, 384MB
temp_buffers = 1000 # min 100, 8KB each
max_prepared_transactions = 350 # can be 0 or more
# note: increasing max_prepared_transactions costs ~600 bytes of 
shared memory
# per transaction slot, plus lock space (see 
max_locks_per_transaction).
work_mem = 1024 # min 64, size in 
KB
maintenance_work_mem = 524288   # min 1024, size in KB, -512
MB-
max_stack_depth = 6144  # min 100, size in KB

# - Free Space Map -
max_fsm_pages = 58000   # min max_fsm_relations*16, 6 
bytes each
max_fsm_relations = 3000# min 100, ~70 bytes each

# - Kernel Resource Usage -

#max_files_per_process = 1000   # min 25
#preload_libraries = ''

# - Cost-Based Vacuum Delay -

#vacuum_cost_delay = 0  # 0-1000 milliseconds
#vacuum_cost_page_hit = 1   # 0-1 credits
#vacuum_cost_page_miss = 10 # 0-1 credits
#vacuum_cost_page_dirty = 20# 0-1 credits
#vacuum_cost_limit = 200# 0-1 credits

# - Background writer -

#bgwriter_delay = 5000  # 10-1 milliseconds 
between rounds
bgwriter_lru_percent = 0# 0-100% of LRU buffers 
scanned/round
bgwriter_lru_maxpages = 0   # 0-1000 buffers max 
written/round
bgwriter_all_percent = 0# 0-100% of all buffers 
scanned/round
bgwriter_all_maxpages = 0   # 0-1000 buffers max 
written/round


#---
# WRITE AHEAD LOG

Re: [PERFORM] tuning for TPC-C benchmark

2007-11-22 Thread Bill Moran
[EMAIL PROTECTED] [EMAIL PROTECTED] wrote:

 Hello all,
 I'm doing tests on various Database and in particular I'm running a 
 comparison between Oracle 10g and Postgres 8.1 on a dedicated server 
 with 2 processors Dual-Core AMD Opteron 2218  2.6 GHz, 4GB of memory 
 and Debian GNU / Linux version 2.6.18-5. Performance is very similar up 
 to 30 users, but from 40 onwards with Postgres fall quickly. That is 
 not what happens with Oracle that comes to 600 users. Can you help me 
 with the tuning ?

If you're doing perf comparisons, you should start out with the latest
PostgreSQL: 8.2.5

Also, beware that you may violate license agreements if you publish
benchmarks of Oracle ... and posting partial results to a mailing list
could potentially be considered publishing benchmarks to Oracle's
lawyers.

I've added a few more comments inline, but overall it looks like you've
done a good job tuning.  In order to tweak it any further, we're probably
going to need more details, such as iostat output during the run, details
of the test you're running, etc.

 Thanks a lot
 My postgresql.conf configuration is:
 #---
 # FILE LOCATIONS
 #---
 
 # The default values of these variables are driven from the -D command 
 line
 # switch or PGDATA environment variable, represented here as 
 ConfigDir.
 
 #data_directory = 'ConfigDir'   # use data in another 
 directory
 hba_file = '/etc/postgresql/8.1/main/pg_hba.conf'   # host-based 
 authentication file
 ident_file = '/etc/postgresql/8.1/main/pg_ident.conf'   # IDENT 
 configuration file
 
 # If external_pid_file is not explicitly set, no extra pid file is 
 written.
 external_pid_file = '/var/run/postgresql/8.1-main.pid'  # 
 write an extra pid file
 
 
 #---
 # CONNECTIONS AND AUTHENTICATION
 #---
 
 # - Connection Settings -
 
 #listen_addresses = 'localhost' # what IP address(es) to 
 listen on;
   # comma-
 separated list of addresses;
  # defaults to 
 'localhost', '*' = all
 listen_addresses = '*'
 port = 5432
 max_connections = 220
 # note: increasing max_connections costs ~400 bytes of shared memory 
 per
 # connection slot, plus lock space (see max_locks_per_transaction).  
 You
 # might also need to raise shared_buffers to support more connections.
 #superuser_reserved_connections = 2
 unix_socket_directory = '/var/run/postgresql'
 #unix_socket_group = ''
 #unix_socket_permissions = 0777 # octal
 #bonjour_name = ''  # defaults to the computer 
 name
 
 # - Security  Authentication -
 
 #authentication_timeout = 60# 1-600, in seconds
 ssl = true
 #password_encryption = on
 #db_user_namespace = off
 
 # Kerberos
 #krb_server_keyfile = ''
 #krb_srvname = 'postgres'
 #krb_server_hostname = ''   # empty string matches any 
 keytab entry
 #krb_caseins_users = off
 
 # - TCP Keepalives -
 # see 'man 7 tcp' for details
 
 #tcp_keepalives_idle = 0# TCP_KEEPIDLE, in seconds;
# 0 selects the 
 system default
 #tcp_keepalives_interval = 0# TCP_KEEPINTVL, in seconds;
  # 0 selects 
 the system default
 #tcp_keepalives_count = 0  # TCP_KEEPCNT;
  # 0 selects 
 the system default
 
 
 #---
 # RESOURCE USAGE (except WAL)
 #---
 
 # - Memory -
 
 shared_buffers = 49152# min 16 or max_connections*2, 
 8KB each, 384MB

With 4G of ram, you might want to try this closer to 1G and see if it
helps.  You may want to install the pg_buffercache module to monitor
shared_buffer usage.  I doubt you want to use it during actual timing
of the test, but it should help you get a feel for what the best
setting is for shared_buffers.

 temp_buffers = 1000 # min 100, 8KB each
 max_prepared_transactions = 350 # can be 0 or more
 # note: increasing max_prepared_transactions costs ~600 bytes of 
 shared memory
 # per transaction slot, plus lock space (see 
 max_locks_per_transaction).
 work_mem = 1024 # min 64, size in 
 KB
 maintenance_work_mem = 524288   # min 1024, size in KB, -512
 MB-
 max_stack_depth = 6144  # min 100, size in KB
 
 # - Free Space Map -
 max_fsm_pages = 58000   # min max_fsm_relations*16, 6 
 bytes each
 max_fsm_relations = 3000  

Re: [PERFORM] tuning for TPC-C benchmark

2007-11-22 Thread Jonah H. Harris
On Nov 22, 2007 10:45 AM, Kevin Grittner [EMAIL PROTECTED] wrote:
 I suggest testing with some form of connection pooling.

Yeah, that's one of the reasons I suggested DBT-2.  It pools
connections and is the most mature TPC-C-like test for Postgres.

-- 
Jonah H. Harris, Sr. Software Architect | phone: 732.331.1324
EnterpriseDB Corporation| fax: 732.331.1301
499 Thornall Street, 2nd Floor  | [EMAIL PROTECTED]
Edison, NJ 08837| http://www.enterprisedb.com/

---(end of broadcast)---
TIP 2: Don't 'kill -9' the postmaster


Re: [PERFORM] tuning for TPC-C benchmark

2007-11-22 Thread Heikki Linnakangas

[EMAIL PROTECTED] wrote:

Hello all,
I'm doing tests on various Database and in particular I'm running a 
comparison between Oracle 10g and Postgres 8.1 on a dedicated server 
with 2 processors Dual-Core AMD Opteron 2218  2.6 GHz, 4GB of memory 
and Debian GNU / Linux version 2.6.18-5. Performance is very similar up 
to 30 users, but from 40 onwards with Postgres fall quickly. That is 
not what happens with Oracle that comes to 600 users. Can you help me 
with the tuning ?


The fact that you didn't give any details on your I/O configuration 
tells me that you don't have much experience with TPC-C. TPC-C is 
basically limited by random I/O. That means that a good RAID controller 
and a lot of disks is a must. Looking at some of the results at 
www.tpc.org, systems with 4 cores have multiple RAID controllers and 
about a hundred hard drives.


You can of course run smaller tests, but those 4 cores are going spend 
all their time waiting for I/O. See for example these old DBT-2 results 
I ran to test the Load Distributed Checkpoints feature in 8.3.


Now that we got that out of the way, what kind of a test configuration 
are you using? How many warehouses? Are you using the think-times, per 
the spec, or are you running something like BenchmarkSQL which just 
pushes as many queries it can to the server?


I'm not sure what you mean by # of users, but you shouldn't use more 
than 10-30 connections on a test like that. More won't help, because 
they'll all have to queue for the same resources, whether it's I/O or CPU.


How long tests are you running? After some time, you'll need to run 
vacuums, which make a big difference.


8.3 will perform better, thanks to HOT which reduces the need to vacuum, 
varvarlen which reduces storage size, leading to better use of the cache 
and less I/O, and Load Distributed Checkpoints, which reduce the 
checkpoint spikes which otherwise throw you over the response time 
requirements.


And last but not least, why are you running the benchmark? It's going to 
be practically irrelevant for any real application. You should benchmark 
with your application, and your data, to get a comparison that matters 
for you.


--
  Heikki Linnakangas
  EnterpriseDB   http://www.enterprisedb.com

---(end of broadcast)---
TIP 1: if posting/reading through Usenet, please send an appropriate
  subscribe-nomail command to [EMAIL PROTECTED] so that your
  message can get through to the mailing list cleanly