Ser*_*udo 5 postgresql performance pgpool
我已经使用以下链接配置了一个带有 pgpool2 的 postgres 集群。
复制好像没问题,但是我跑了一些基准测试(pg_bench),性能比单节点低,例如:
pgbench -c 16 -j 16 -T 600 -S bench2 -h "ONE SINGLE POSTGRES NODE" -p 5432 实际处理的事务数:7752147 tps = 12920.095988(包括建立连接)tps = 12921.6(不包括建立连接)48
pgbench -c 16 -j 16 -T 600 -S bench2 -h "PGPOOLNODE" -p 5432 实际处理的事务数:389800 tps = 648.857810(包括建立连接) tps = 648.886713(不包括建立连接)
pgbench -c 16 -j 16 -T 600 -S bench2 -h "MASTERNODE" -p 5432 实际处理的事务数:7093473 tps = 11822.379159(包括建立连接) tps = 11823.337051(不包括建立连接)
每个节点都是默认配置的。所有节点都是相同的虚拟机并在同一网络上。
这是我的 pgpool.conf:
listen_addresses = '*'
port = 5432
socket_dir = '/var/run/postgresql'
pcp_port = 9898
pcp_socket_dir = '/var/run/postgresql'
backend_hostname0 = '192.168.1.177'
backend_port0 = 5432
backend_weight0 = 0
backend_data_directory0 = '/var/lib/postgresql/9.1/main'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_hostname1 = '192.168.1.175'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/var/lib/postgresql/9.1/main'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_hostname2 = '192.168.1.176'
backend_port2 = 5432
backend_weight2 = 1
backend_data_directory2 = '/var/lib/postgresql/9.1/main'
backend_flag2 = 'ALLOW_TO_FAILOVER'
enable_pool_hba = off
authentication_timeout = 60
ssl = off
num_init_children = 32
max_pool = 4
child_life_time = 300
child_max_connections = 0
connection_life_time = 0
client_idle_limit = 0
log_destination = 'stderr'
print_timestamp = on
log_connections = on
log_hostname = off
log_statement = on
log_per_node_statement = on
log_standby_delay = 'none'
syslog_facility = 'LOCAL0'
syslog_ident = 'pgpool'
debug_level = 0
pid_file_name = '/var/run/postgresql/pgpool.pid'
logdir = '/var/log/postgresql'
connection_cache = on
reset_query_list = 'ABORT; DISCARD ALL'
replication_mode = off
replicate_select = off
insert_lock = on
lobj_lock_table = ''
replication_stop_on_mismatch = off
failover_if_affected_tuples_mismatch = off
load_balance_mode = on
ignore_leading_white_space = on
white_function_list = ''
black_function_list = 'nextval,setval'
master_slave_mode = on
master_slave_sub_mode = 'stream'
sr_check_period = 0
sr_check_user = 'ZZZ'
sr_check_password = 'YYY'
delay_threshold = 0
follow_master_command = ''
parallel_mode = off
enable_query_cache = off
pgpool2_hostname = ''
system_db_hostname = 'localhost'
system_db_port = 5432
system_db_dbname = 'pgpool'
system_db_schema = 'pgpool_catalog'
system_db_user = 'pgpool'
system_db_password = 'zzz'
health_check_period = 0
health_check_timeout = 20
health_check_user = 'pgpool'
health_check_password = 'zzz'
failover_command = '/var/lib/postgresql/bin/failover.sh %d %M %m'
failback_command = ''
fail_over_on_backend_error = on
recovery_user = 'nobody'
recovery_password = ''
recovery_1st_stage_command = ''
recovery_2nd_stage_command = ''
recovery_timeout = 90
client_idle_limit_in_recovery = 0
relcache_expire = 0
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?谢谢
小智 0
max_pool 参数配置每个子进程缓存的连接数。因此,如果 num_init_children 配置为 100,max_pool 配置为 3,那么 pgpool 可能会打开 300 (=3*100) 个到后端数据库的连接。
仅当请求的 [用户,数据库] 对尚未在缓存中时,子进程才会打开新的后端连接。因此,如果应用程序仅使用一个用户连接到一个数据库,例如 [pguser1,pgdb1],那么每个子级将继续重用第一个连接,并且永远不会打开第二个连接,因此实际上 pgpool 将打开不超过 100 个连接即使 max_pool 设置为 3 后端连接
你的配置
num_init_children = 32
max_pool = 4
Run Code Online (Sandbox Code Playgroud)
这意味着您的 pgpool 实例最多可以打开 128 个连接 (4*32)。但是 pgbench 仅使用一个用户,并且以并发数 16 执行。根据上面引用的第二段,pgpool 不会打开新的后端连接,因为连接缓存中已经存在用户、数据库组合。
此外,pgpool 测试中的 tps 数量比其他两个测试低约 16 倍(比这多一点)。
不幸的是我对 pgpool 不太熟悉,我不知道如何提高性能。