性能参数

pgtune pgconfig

日志参数

更多参数详解

管理

listen_addresses = "*"             # 连接访问控制,哪些ip可以访问, * 全部。 结合pg_hba.conf , iptables设置。
superuser_reserved_connections = 3 # 预留给超级管理员的连接数。
port = 5432                        # 默认访问端口
wal_keep_segments = 1024           # wal 日志保存数量

wal日志

wal_log_hints = on 
full_page_writes = on

成本因子

# - Planner Cost Constants -
#seq_page_cost = 1.0                    # measured on an arbitrary scale 顺序扫描
random_page_cost = 1.1                  # same scale as above            随机扫描。HDD 4 ;SSD 1.1; 由于SSD没有磁盘寻道时间,顺序扫描和随机扫描的差距不是那么大。比例设置的相近即可。 
#cpu_tuple_cost = 0.01                  # same scale as above
#cpu_index_tuple_cost = 0.005           # same scale as above
#cpu_operator_cost = 0.0025             # same scale as above
#parallel_tuple_cost = 0.1              # same scale as above
#parallel_setup_cost = 1000.0   # same scale as above
#min_parallel_table_scan_size = 8MB
#min_parallel_index_scan_size = 512kB
effective_cache_size = 666666          # 系统总内存减去数据库shared_buffer减去其他应用占有的内存。 理解为数据可加载到内存的大小。

TCP 连接

Linux 中tcp默认连接超时时间2小时,如果2个小时没有数据包则认为该连接为空闲状态,系统自动关闭。

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

#tcp_keepalives_idle = 60                # TCP_KEEPIDLE, in seconds;
                                        # 0 selects the system default
#tcp_keepalives_interval = 10            # TCP_KEEPINTVL, in seconds;  发个心跳数据包,告诉系统我没有空闲
                                        # 0 selects the system default
#tcp_keepalives_count = 6               # TCP_KEEPCNT;
                                        # 0 selects the system default

检查点checkpoint

具体根据磁盘的吞吐量进行设置 https://yq.aliyun.com/articles/582847

shared_buffers = 64GB                  # 1/4 内存 如果不使用huge page建议不要超过32GB   
checkpoint_timeout = 30min              # range 30s-1d  
max_wal_size = 124GB          # 2*shared_buffers  
min_wal_size = 32GB           # shared_buffers * 1/2  
checkpoint_completion_target = 0.9 

垃圾回收autovacuum

autovacuum_work_mem = -1 # autovacuum所能使用的内存大小,当其为-1时,使用maintenance_work_mem参数的值,值越大,使用的内存越多
autovacuum = on # 是否打开autovacuum
autovacuum_max_workers =3 # 最多能够有多少个autovaccum进程运行,值越大,使用的内存越多
autovacuum_naptime = 1min  # autovacuum进程间隔多长时间对表进行是否需要autovacuum操作
autovacuum_vacuum_threshold = 50 # 当表上dml操作达到多少行时执行autovacuum操作
autovacuum_analyze_threshold = 50  # 当表上dml操作达到多少行时执行autovacuum analyze操作
autovacuum_vacuum_scale_factor = 0.2 # 当表上dml操作达到多少比例时执行autovacuum操作
autovacuum_analyze_scale_factor = 0.1  # 当表上dml操作达到多少比例时执行autovacuum analyze操作
autovacuum_vacuum_cost_limit = -1  # autovacuum 的cost超过此值时,vacuum会sleep一段时间,使用vacuum_cost_limit参数的值,值越大对系统IO压力越大

并行计算

1. 控制整个数据库集群同时能开启多少个work process,必须设置。
max_worker_processes = 128              # (change requires restart)  

2. 控制一个并行的EXEC NODE最多能开启多少个并行处理单元,同时还需要参考表级参数parallel_workers,或者PG内核内置的算法,根据表的大小计算需要开启多少和并行处理单元。  
实际取小的。
max_parallel_workers_per_gather = 16    # taken from max_worker_processes

3. 计算并行处理的成本,如果成本高于非并行,则不会开启并行处理。
#parallel_tuple_cost = 0.1              # same scale as above
#parallel_setup_cost = 1000.0   # same scale as above

4. 小于这个值的表,不会开启并行。
#min_parallel_relation_size = 8MB

5. 告诉优化器,强制开启并行。
#force_parallel_mode = off

6. 表级参数,不通过表的大小计算并行度,而是直接告诉优化器这个表需要开启多少个并行计算单元。
parallel_workers (integer)

alter table t_table set(parallel_workers = 4)

同步提交synchronous_commit

同步提交参数, 控制事务提交后返回客户端是否成功的策略 可选值为:on, remote_write, local, off

on

1 为on且没有开启同步备库的时候,会当wal日志真正刷新到磁盘永久存储后才会返回客户端事务已提交成功, 
2 当为on且开启了同步备库的时候(设置了synchronous_standby_names),必须要等事务日志刷新到本地磁盘,并且还要等远程备库也提交到磁盘才能返回客户端已经提交.

off

写到缓存中就会向客户端返回提交成功,但也不是一直不刷到磁盘,延迟写入磁盘,延迟的时间为最大3倍的wal_writer_delay参数的(默认200ms)的时间,所有如果即使关闭synchronous_commit,
也只会造成最多600ms的事务丢失,此事务甚至包括已经提交的事务(会丢数据),但数据库确可以安全启动,不会发生块折断,只是丢失了部分数据,但对高并发的小事务系统来说,性能来说提升较大。

remote_write

当事务提交时,不仅要把wal刷新到磁盘,还需要等wal日志发送到备库操作系统(但不用等备库刷新到磁盘),因此如果备库此时发生实例中断不会有数据丢失,因为数据还在操作系统上,
而如果操作系统故障,则此部分wal日志还没有来得及写入磁盘就会丢失,备库启动后还需要想主库索取wal日志。

local

当事务提交时,仅写入本地磁盘即可返回客户端事务提交成功,而不管是否有同步备库
如果没有设置同步备库,则 on/remote_write/local都是一样的,仅等待事务刷新到本地磁盘.

此参数还可以局部设置,当有临时批量任务时可以这样设置:

SET LOCAL synchronous_commit TO OFF; 

这样局部事务可向备库异步的方式同步,而其他重要的事务以同步的方式向备库同步。

修改

postgresql.conf 服务器启动时默认读取的配置

postgresql.auto.conf 优先级高于postgresql.conf 9.4后引入,对标oracle sfile pfile 。 文件不能修改,需要通过ALTER SYSTE 修改,ALTER SYSTE RESET | DEFAULT 删除

策略 

postgresql.conf 参数为默认值,不做修改,优化参数通过 postgresql.auto.conf 修改,一目了然。(个人习惯)

查看

SELECT name,setting,vartype,boot_val,min_val,max_val,reset_val FROM pg_settings;

show all;

work_mem

这些内存大小被用来完成内部排序与哈希表操作。 如果未分配足够内存,会导致物理I/O。 work_mem这个值是针对每个session的,所以不能设置的过大。

实验

创建测试表
postgres=# create table myt (id serial);  
CREATE TABLE

插入测试数据  
postgres=# insert into myt select generate_series(1,1000000);  
INSERT 0 1000000  

设置当前session work_mem

postgres=#set work_me '64kb';
SET  
postgres=# show work_mem;  
 work_mem  
----------  
 64kB  
(1 row)

查看临时文件占用情况
select temp_files, temp_bytes from pg_stat_database
 temp_files | temp_bytes  
------------+------------  
          0 |          0  
(1 row)  

执行测试
select * from (select * from myt order by id) t limit 1000; 

再次查看临时文件占用情况
select temp_files, temp_bytes from pg_stat_database
 temp_files | temp_bytes
------------+------------
          1 |   14016512 
(1 row)

设置当前session work_mem

postgres=#set work_mem = '16MB';  
SET

执行测试
select * from (select * from myt order by id) t limit 1000;

再次查看临时文件占用情况
select temp_files, temp_bytes from pg_stat_database
 temp_files | temp_bytes
------------+------------
          1 |   14016512

没有新增临时文件 , 说明work_mem充足

maintainance_work_mem

主要用于analyzing,vacuum,create index, reindex等。

如需进行如上操作时请适当调整maintainance_work_mem 值,提高效率

实验

方法与上面类似,在统计表中观察临时文件使用情况。