I have been doing some benchmarking. The idea is to measure the difference
between PostgreSQL 7.2.1 compiled for an 8K block or a 16K block. pgbench is
almost useless for measuring changes in performance, I can't seem to get any
real consistency, so I used the osdb to measure performance.
In the 16K block configuration, I reduced the number of blocks by half, so as
to keep caching memory similarly sized.
The machine:
RedHat 7.2, dual PIII 650, 1G ram, 2 IBM scsi 18G drives.
uname -a:
Linux slave1.mohawksoft.com 2.4.7-10smp #1 SMP Thu Sep 6 17:09:31 EDT 2001 i686
unknown
mount:
[markw@slave1 markw]$ mount
/dev/sda3 on / type ext3 (rw)
none on /proc type proc (rw)
usbdevfs on /proc/bus/usb type usbdevfs (rw)
/dev/sda1 on /boot type ext3 (rw)
/dev/sda4 on /u01 type ext2 (rw)
/dev/sdb1 on /u02 type ext2 (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
none on /dev/shm type tmpfs (rw)
The 8K data directory:
[postgres@slave1 data]$ pwd
/home/postgres/data
[postgres@slave1 data]$ ls -l
total 40
lrwxrwxrwx 1 root root 9 Mar 6 07:21 base -> /u02/base
drwx------ 2 postgres postgres 4096 Apr 25 21:51 global
drwx------ 2 postgres postgres 4096 Apr 25 21:29 pg_clog
-rw------- 1 postgres postgres 10068 Mar 6 07:26 pg_hba.conf
-rw------- 1 postgres postgres 1250 Mar 6 07:20 pg_ident.conf
-rw------- 1 postgres postgres 4 Mar 6 07:20 PG_VERSION
lrwxrwxrwx 1 root root 12 Mar 6 07:22 pg_xlog -> /u01/pg_xlog
-rw------- 1 postgres postgres 3095 Apr 24 19:23 postgresql.conf
-rw------- 1 postgres postgres 56 Apr 25 20:54 postmaster.opts
-rw------- 1 postgres postgres 44 Apr 25 20:54 postmaster.pid
The 16K data directory:
[postgres@slave1 data16kb]$ pwd
/home/postgres/data16kb
[postgres@slave1 data16kb]$ ls -l
total 36
lrwxrwxrwx 1 postgres postgres 13 Apr 25 08:47 base -> /u02/base16kb
drwx------ 2 postgres postgres 4096 Apr 25 20:53 global
drwx------ 2 postgres postgres 4096 Apr 25 20:33 pg_clog
-rw------- 1 postgres postgres 10068 Apr 25 08:44 pg_hba.conf
-rw------- 1 postgres postgres 1250 Apr 25 08:43 pg_ident.conf
-rw------- 1 postgres postgres 4 Apr 25 08:43 PG_VERSION
lrwxrwxrwx 1 postgres postgres 16 Apr 25 08:46 pg_xlog ->
/u01/pg_xlog16kb
-rw------- 1 postgres postgres 3095 Apr 25 08:44 postgresql.conf
-rw------- 1 postgres postgres 64 Apr 25 14:59 postmaster.opts"osdb"
"Invoked: osdb-pg --postgresql=no_hash_index --logfile 16kb.log"
create_tables() 0.02 seconds return value = 0
load() 15.81 seconds return value = 0
create_idx_uniques_key_bt() 3.39 seconds return value = 0
create_idx_updates_key_bt() 3.42 seconds return value = 0
create_idx_hundred_key_bt() 3.47 seconds return value = 0
create_idx_tenpct_key_bt() 3.43 seconds return value = 0
create_idx_tenpct_key_code_bt() 0.93 seconds return value = 0
create_idx_tiny_key_bt() 0.00 seconds return value = 0
create_idx_tenpct_int_bt() 0.63 seconds return value = 0
create_idx_tenpct_signed_bt() 0.93 seconds return value = 0
create_idx_uniques_code_h() 1.40 seconds return value = 0
create_idx_tenpct_double_bt() 1.09 seconds return value = 0
create_idx_updates_decim_bt() 2.43 seconds return value = 0
create_idx_tenpct_float_bt() 1.10 seconds return value = 0
create_idx_updates_int_bt() 0.62 seconds return value = 0
create_idx_tenpct_decim_bt() 2.31 seconds return value = 0
create_idx_hundred_code_h() 1.40 seconds return value = 0
create_idx_tenpct_name_h() 1.38 seconds return value = 0
create_idx_updates_code_h() 1.28 seconds return value = 0
create_idx_tenpct_code_h() 1.27 seconds return value = 0
create_idx_updates_double_bt() 1.09 seconds return value = 0
create_idx_hundred_foreign() 11.11 seconds return value = 0
populateDataBase() 58.51 seconds return value = 0
"Logical database size 40MB"
sel_1_cl() 0.01 seconds return value = 1
join_3_cl() 0.05 seconds return value = 0
sel_100_ncl() 0.19 seconds return value = 100
table_scan() 0.37 seconds return value = 0
agg_func() 3.50 seconds return value = 100
agg_scal() 0.24 seconds return value = 0
sel_100_cl() 0.19 seconds return value = 100
join_3_ncl() 0.57 seconds return value = 1
sel_10pct_ncl() 1.34 seconds return value = 10000
agg_simple_report() 73.78 seconds return value = 990009900
agg_info_retrieval() 0.08 seconds return value = 0
agg_create_view() 0.02 seconds return value = 0
agg_subtotal_report() 3.41 seconds return value = 1000
agg_total_report() 3.23 seconds return value = 932849
join_2_cl() 0.00 seconds return value = 0
join_2() 0.99 seconds return value = 1000
sel_variable_select_low() 0.24 seconds return value = 0
sel_variable_select_high() 3.39 seconds return value = 25000
join_4_cl() 0.00 seconds return value = 0
proj_100() 4.40 seconds return value = 10000
join_4_ncl() 0.83 seconds return value = 1
proj_10pct() 9.70 seconds return value = 100000
sel_1_ncl() 0.01 seconds return value = 1
join_2_ncl() 0.18 seconds return value = 1
integrity_test() 0.36 seconds return value = 0
drop_updates_keys() 0.02 seconds return value = 0
bulk_save() 0.03 seconds return value = 0
bulk_modify() 164.11 seconds return value = 0
upd_append_duplicate() 0.00 seconds return value = 0
upd_remove_duplicate() 0.00 seconds return value = 0
upd_app_t_mid() 0.00 seconds return value = 1
upd_mod_t_mid() 0.17 seconds return value = 0
upd_del_t_mid() 0.16 seconds return value = 0
upd_app_t_end() 0.00 seconds return value = 1
upd_mod_t_end() 0.17 seconds return value = 0
upd_del_t_end() 0.16 seconds return value = 0
create_idx_updates_code_h() 1.27 seconds return value = 0
upd_app_t_mid() 0.01 seconds return value = 1
upd_mod_t_cod() 0.00 seconds return value = 0
upd_del_t_mid() 0.16 seconds return value = 0
create_idx_updates_int_bt() 0.63 seconds return value = 0
upd_app_t_mid() 0.01 seconds return value = 1
upd_mod_t_int() 0.00 seconds return value = 0
upd_del_t_mid() 0.16 seconds return value = 0
bulk_append() 0.22 seconds return value = 0
bulk_delete() 162.26 seconds return value = 0
"Single User Test" 436.63 seconds (0:07:16.63)
"Executing multi-user tests with 10 user tasks"
Mixed IR (tup/sec) 105.21 returned in 5.00 minutes
sel_1_ncl() 0.01 seconds return value = 1
agg_simple_report() 182.60 seconds return value = 990009900
mu_sel_100_seq() 0.12 seconds return value = 0
mu_sel_100_rand() 0.18 seconds return value = 0
mu_mod_100_seq_abort() 0.33 seconds return value = 0
mu_mod_100_rand() 0.12 seconds return value = 0
mu_unmod_100_seq() 0.16 seconds return value = 0
mu_unmod_100_rand() 0.08 seconds return value = 0
crossSectionTests(Mixed IR) 183.60
mu_checkmod_100_seq() 0.01 seconds return value = 100
mu_checkmod_100_rand() 0.72 seconds return value = 100
Mixed OLTP (tup/sec) 101.48 returned in 5.00 minutes
sel_1_ncl() 0.04 seconds return value = 1
agg_simple_report() 208.05 seconds return value = 990009900
mu_sel_100_seq() 1.90 seconds return value = 0
mu_sel_100_rand() 0.07 seconds return value = 0
mu_mod_100_seq_abort() 0.50 seconds return value = 0
mu_mod_100_rand() 0.23 seconds return value = 0
mu_unmod_100_seq() 0.18 seconds return value = 0
mu_unmod_100_rand() 0.14 seconds return value = 0
crossSectionTests(Mixed OLTP) 211.12
mu_checkmod_100_seq() 0.76 seconds return value = 100
mu_checkmod_100_rand() 11.10 seconds return value = 100
"Multi-User Test" 2830.09 seconds (0:47:10.09)
"osdb"
"Invoked: osdb-pg --postgresql=no_hash_index --logfile 8kb.log"
create_tables() 0.01 seconds return value = 0
load() 17.26 seconds return value = 0
create_idx_uniques_key_bt() 3.59 seconds return value = 0
create_idx_updates_key_bt() 3.75 seconds return value = 0
create_idx_hundred_key_bt() 3.67 seconds return value = 0
create_idx_tenpct_key_bt() 3.55 seconds return value = 0
create_idx_tenpct_key_code_bt() 0.95 seconds return value = 0
create_idx_tiny_key_bt() 0.00 seconds return value = 0
create_idx_tenpct_int_bt() 0.63 seconds return value = 0
create_idx_tenpct_signed_bt() 0.93 seconds return value = 0
create_idx_uniques_code_h() 1.42 seconds return value = 0
create_idx_tenpct_double_bt() 1.09 seconds return value = 0
create_idx_updates_decim_bt() 2.45 seconds return value = 0
create_idx_tenpct_float_bt() 1.09 seconds return value = 0
create_idx_updates_int_bt() 0.62 seconds return value = 0
create_idx_tenpct_decim_bt() 2.32 seconds return value = 0
create_idx_hundred_code_h() 1.42 seconds return value = 0
create_idx_tenpct_name_h() 1.38 seconds return value = 0
create_idx_updates_code_h() 1.27 seconds return value = 0
create_idx_tenpct_code_h() 1.28 seconds return value = 0
create_idx_updates_double_bt() 1.09 seconds return value = 0
create_idx_hundred_foreign() 11.02 seconds return value = 0
populateDataBase() 60.79 seconds return value = 0
"Logical database size 40MB"
sel_1_cl() 0.01 seconds return value = 1
join_3_cl() 0.01 seconds return value = 0
sel_100_ncl() 0.18 seconds return value = 100
table_scan() 0.38 seconds return value = 0
agg_func() 3.50 seconds return value = 100
agg_scal() 0.24 seconds return value = 0
sel_100_cl() 0.18 seconds return value = 100
join_3_ncl() 7.73 seconds return value = 1
sel_10pct_ncl() 1.35 seconds return value = 10000
agg_simple_report() 75.62 seconds return value = 990009900
agg_info_retrieval() 0.08 seconds return value = 0
agg_create_view() 0.01 seconds return value = 0
agg_subtotal_report() 3.41 seconds return value = 1000
agg_total_report() 3.19 seconds return value = 932849
join_2_cl() 0.00 seconds return value = 0
join_2() 1.00 seconds return value = 1000
sel_variable_select_low() 0.22 seconds return value = 0
sel_variable_select_high() 3.41 seconds return value = 25000
join_4_cl() 0.00 seconds return value = 0
proj_100() 4.41 seconds return value = 10000
join_4_ncl() 10.74 seconds return value = 1
proj_10pct() 9.87 seconds return value = 100000
sel_1_ncl() 0.00 seconds return value = 1
join_2_ncl() 3.65 seconds return value = 1
integrity_test() 0.34 seconds return value = 0
drop_updates_keys() 0.02 seconds return value = 0
bulk_save() 0.03 seconds return value = 0
bulk_modify() 162.64 seconds return value = 0
upd_append_duplicate() 0.00 seconds return value = 0
upd_remove_duplicate() 0.00 seconds return value = 0
upd_app_t_mid() 0.00 seconds return value = 1
upd_mod_t_mid() 0.16 seconds return value = 0
upd_del_t_mid() 0.17 seconds return value = 0
upd_app_t_end() 0.00 seconds return value = 1
upd_mod_t_end() 0.16 seconds return value = 0
upd_del_t_end() 0.17 seconds return value = 0
create_idx_updates_code_h() 1.27 seconds return value = 0
upd_app_t_mid() 0.01 seconds return value = 1
upd_mod_t_cod() 0.00 seconds return value = 0
upd_del_t_mid() 0.16 seconds return value = 0
create_idx_updates_int_bt() 0.63 seconds return value = 0
upd_app_t_mid() 0.00 seconds return value = 1
upd_mod_t_int() 0.00 seconds return value = 0
upd_del_t_mid() 0.17 seconds return value = 0
bulk_append() 0.23 seconds return value = 0
bulk_delete() 163.47 seconds return value = 0
"Single User Test" 458.83 seconds (0:07:38.83)
"Executing multi-user tests with 10 user tasks"
Mixed IR (tup/sec) 102.59 returned in 5.00 minutes
sel_1_ncl() 0.01 seconds return value = 1
agg_simple_report() 238.69 seconds return value = 990009900
mu_sel_100_seq() 0.04 seconds return value = 0
mu_sel_100_rand() 0.02 seconds return value = 0
mu_mod_100_seq_abort() 0.32 seconds return value = 0
mu_mod_100_rand() 0.18 seconds return value = 0
mu_unmod_100_seq() 0.21 seconds return value = 0
mu_unmod_100_rand() 0.09 seconds return value = 0
crossSectionTests(Mixed IR) 239.56
mu_checkmod_100_seq() 0.02 seconds return value = 100
mu_checkmod_100_rand() 0.72 seconds return value = 100
Mixed OLTP (tup/sec) 97.46 returned in 5.00 minutes
sel_1_ncl() 0.05 seconds return value = 1
agg_simple_report() 168.05 seconds return value = 990009900
mu_sel_100_seq() 0.26 seconds return value = 0
mu_sel_100_rand() 0.03 seconds return value = 0
mu_mod_100_seq_abort() 0.29 seconds return value = 0
mu_mod_100_rand() 0.16 seconds return value = 0
mu_unmod_100_seq() 0.13 seconds return value = 0
mu_unmod_100_rand() 0.27 seconds return value = 0
crossSectionTests(Mixed OLTP) 169.26
mu_checkmod_100_seq() 0.25 seconds return value = 100
mu_checkmod_100_rand() 13.33 seconds return value = 100
"Multi-User Test" 2843.70 seconds (0:47:23.70)
tcpip_socket = true
#ssl = false
max_connections =256
#port = 5432
#hostname_lookup = false
#show_source_port = false
#unix_socket_directory = ''
#unix_socket_group = ''
#unix_socket_permissions = 0777
#virtual_host = ''
#krb_server_keyfile = ''
#
# Shared Memory Size
#
shared_buffers = 4096 # 2*max_connections, min 16
max_fsm_relations = 200 # min 10, fsm is free space map
max_fsm_pages = 10000 # min 1000, fsm is free space map
#max_locks_per_transaction = 64 # min 10
wal_buffers = 32 # min 4
#
# Non-shared Memory Sizes
#
sort_mem = 8192 # min 32
vacuum_mem = 32768 # min 1024
#
# Write-ahead log (WAL)
#
wal_files = 16 # range 0-64
wal_sync_method = fdatasync # the default varies across platforms:
# # fsync, fdatasync, open_sync, or open_datasync
#wal_debug = 0 # range 0-16
#commit_delay = 0 # range 0-100000
#commit_siblings = 5 # range 1-1000
#checkpoint_segments = 3 # in logfile segments (16MB each), min 1
checkpoint_timeout = 600 # in seconds, range 30-3600
fsync = false
#
# Optimizer Parameters
#
#enable_seqscan = true
#enable_indexscan = true
#enable_tidscan = true
#enable_sort = true
#enable_nestloop = true
#enable_mergejoin = true
#enable_hashjoin = true
#ksqo = false
#effective_cache_size = 2000 # default in 8k pages
#random_page_cost = 1
#cpu_tuple_cost = 0.01
#cpu_index_tuple_cost = 0.001
#cpu_operator_cost = 0.0025
#
# GEQO Optimizer Parameters
#
#geqo = true
#geqo_selection_bias = 2.0 # range 1.5-2.0
#geqo_threshold = 11
#geqo_pool_size = 0 # default based on #tables in query, range 128-1024
#geqo_effort = 1
#geqo_generations = 0
#geqo_random_seed = -1 # auto-compute seed
#
# Debug display
#
#silent_mode = false
#log_connections = false
#log_timestamp = false
#log_pid = false
#debug_level = 0 # range 0-16
#debug_print_query = false
#debug_print_parse = false
#debug_print_rewritten = false
#debug_print_plan = false
#debug_pretty_print = false
# requires USE_ASSERT_CHECKING
#debug_assertions = true
#
# Syslog
#
# requires ENABLE_SYSLOG
#syslog = 0 # range 0-2
#syslog_facility = 'LOCAL0'
#syslog_ident = 'postgres'
#
# Statistics
#
#show_parser_stats = false
#show_planner_stats = false
#show_executor_stats = false
#show_query_stats = false
# requires BTREE_BUILD_STATS
#show_btree_build_stats = false
#
# Access statistics collection
#
#stats_start_collector = true
#stats_reset_on_server_start = true
#stats_command_string = false
#stats_row_level = false
#stats_block_level = false
#
# Lock Tracing
#
#trace_notify = false
# requires LOCK_DEBUG
#trace_locks = false
#trace_userlocks = false
#trace_lwlocks = false
#debug_deadlocks = false
#trace_lock_oidmin = 16384
#trace_lock_table = 0
#
# Misc
#
#dynamic_library_path = '$libdir'
#australian_timezones = false
#authentication_timeout = 60 # min 1, max 600
#deadlock_timeout = 1000
#default_transaction_isolation = 'read committed'
#max_expr_depth = 10000 # min 10
#max_files_per_process = 1000 # min 25
#password_encryption = false
#sql_inheritance = true
#transform_null_equals = false
tcpip_socket = true
#ssl = false
max_connections =256
#port = 5432
#hostname_lookup = false
#show_source_port = false
#unix_socket_directory = ''
#unix_socket_group = ''
#unix_socket_permissions = 0777
#virtual_host = ''
#krb_server_keyfile = ''
#
# Shared Memory Size
#
shared_buffers = 8192 # 2*max_connections, min 16
max_fsm_relations = 200 # min 10, fsm is free space map
max_fsm_pages = 10000 # min 1000, fsm is free space map
#max_locks_per_transaction = 64 # min 10
wal_buffers = 32 # min 4
#
# Non-shared Memory Sizes
#
sort_mem = 8192 # min 32
vacuum_mem = 32768 # min 1024
#
# Write-ahead log (WAL)
#
wal_files = 16 # range 0-64
wal_sync_method = fdatasync # the default varies across platforms:
# # fsync, fdatasync, open_sync, or open_datasync
#wal_debug = 0 # range 0-16
#commit_delay = 0 # range 0-100000
#commit_siblings = 5 # range 1-1000
#checkpoint_segments = 3 # in logfile segments (16MB each), min 1
checkpoint_timeout = 600 # in seconds, range 30-3600
fsync = false
#
# Optimizer Parameters
#
#enable_seqscan = true
#enable_indexscan = true
#enable_tidscan = true
#enable_sort = true
#enable_nestloop = true
#enable_mergejoin = true
#enable_hashjoin = true
#ksqo = false
#effective_cache_size = 2000 # default in 8k pages
#random_page_cost = 1
#cpu_tuple_cost = 0.01
#cpu_index_tuple_cost = 0.001
#cpu_operator_cost = 0.0025
#
# GEQO Optimizer Parameters
#
#geqo = true
#geqo_selection_bias = 2.0 # range 1.5-2.0
#geqo_threshold = 11
#geqo_pool_size = 0 # default based on #tables in query, range 128-1024
#geqo_effort = 1
#geqo_generations = 0
#geqo_random_seed = -1 # auto-compute seed
#
# Debug display
#
#silent_mode = false
#log_connections = false
#log_timestamp = false
#log_pid = false
#debug_level = 0 # range 0-16
#debug_print_query = false
#debug_print_parse = false
#debug_print_rewritten = false
#debug_print_plan = false
#debug_pretty_print = false
# requires USE_ASSERT_CHECKING
#debug_assertions = true
#
# Syslog
#
# requires ENABLE_SYSLOG
#syslog = 0 # range 0-2
#syslog_facility = 'LOCAL0'
#syslog_ident = 'postgres'
#
# Statistics
#
#show_parser_stats = false
#show_planner_stats = false
#show_executor_stats = false
#show_query_stats = false
# requires BTREE_BUILD_STATS
#show_btree_build_stats = false
#
# Access statistics collection
#
#stats_start_collector = true
#stats_reset_on_server_start = true
#stats_command_string = false
#stats_row_level = false
#stats_block_level = false
#
# Lock Tracing
#
#trace_notify = false
# requires LOCK_DEBUG
#trace_locks = false
#trace_userlocks = false
#trace_lwlocks = false
#debug_deadlocks = false
#trace_lock_oidmin = 16384
#trace_lock_table = 0
#
# Misc
#
#dynamic_library_path = '$libdir'
#australian_timezones = false
#authentication_timeout = 60 # min 1, max 600
#deadlock_timeout = 1000
#default_transaction_isolation = 'read committed'
#max_expr_depth = 10000 # min 10
#max_files_per_process = 1000 # min 25
#password_encryption = false
#sql_inheritance = true
#transform_null_equals = false