PostgreSQL11生产环境常用参数配置参考

背景

搭建日期:20190327
版本:Postgresql-11
服务器配置:8核cpu 16GB 内存。※比较小,下面配置都按照这个标准作为示例。
Postgresql服务状态:单机yum安装,数据TB级别,但是并发不高,主要用于数据分析。没有做主从。

修改配置文件方法

  1. 默认配置文件postgresql.conf。每一行代表一个参数,#代表注释。为PG提供默认值,除非被下面方法覆盖。
  2. postgresql.auto.conf。不能手工编辑,文件保存了Alter SYSTEM命令提供的设置。优先级 > postgresql.conf。
  3. SQL命令修改参数。
    1. ALTER SYSTEM命令改变全局默认值,等同修改配置文件。
    2. ALTER DATABASE命令允许针对一个数据库覆盖其全局设置。
    3. ALTER ROLE命令允许用用户指定的值来覆盖全局设置和数据库设置
      4,修改会话级别的参数。SHOW/SET
    4. SHOW===current_setting(setting_name text)
    5. SET ===set_config(setting_name, new_value, is_local)
 SET configuration_parameter TO DEFAULT;
 等效于:
 UPDATE pg_settings SET setting = reset_val WHERE name = 'configuration_parameter';

重新加载配置文件

  1. 不重启修改配置文件
    sudo -u postgres /usr/pgsql-11/bin/pg_ctl reload -D $PGDATA
  2. SQL函数pg_reload_conf()
  3. 重启服务是SINGUP信号。

重点:生产参数配置参考

各个参数的默认值可以参考我的另一片文章,默认参数。

max_connections = 300

决定数据库的最大并发连接数。

  • 参考值:不超过物理内存(GB)*50。
shared_buffers =4GB

设置数据库服务器将使用的共享内存缓冲区量。默认通常是 128 兆字节(128MB)

  • 参考值: 1/4 主机内存
work_mem = 16MB
  • 写到临时磁盘文件之前被内部排序操作和哈希表使用的内存量。
    排序、去重、归并需要排序,再生成临时变落入磁盘之前,会在内存中占用一部分空间。同一个时刻,可能有很多排序的工作都会按此参数分配内存,所以这个值不能太大。
    如果要使用语句中有较大的排序操作,可以在会话级别设置该参数,set work_men = ‘2GB’,提高执行速度。
  • 参考值:# 1/4 主机内存 / 256 (假设256个并发同时使用work_mem)
maintenance_work_mem =1GB

指定在维护性操作(例如VACUUM、CREATE INDEX和ALTER TABLE ADD FOREIGNKEY)中使用的最大的内存量。这样的操作并不频繁,所以可以比work_men大很多。

  • 参考值
    内存的1/4除以autovacuum_max_workers数量。
    系统内存超过32G时,建议设置为1GB。超过64GB时,建议设置为2GB。超过128GB时,建议设置为4GB。主要作用是改进清理和恢复数据库转储的性能,设定一个autovacuum_max_workers匹配值就好。

下面三个参数主要控制并发工作者数量,对于性能有不小影响。

max_worker_processes = 32

系统能够支持的后台进程的最大数量,很多processes都需要获取的根源,所以尽可能保证充足的线程数量。

max_parallel_workers = 4

并行工作者数量,从max_worker_processes获取,所以不能大于后者。

  • 参考值:cpu-4
max_parallel_workers_per_gather=4

每个查询并行工作者数量,不能大于上面两个

  • 参考值:cpu-4
effective_cache_size

设置规划器对一个单一查询可用的有效磁盘缓冲区尺寸的假设
更高的数值会使得索引扫描更可能被使用,更低的数值会使
得顺序扫描更可能被使用。它只用于估计的目的

  • 参考值:内存一半

日志相关

logging_collector = on

启动日志收集器

log_destination = ‘csvlog’

stderr, csvlog, syslog, and eventlog(windows)
日志记录格式,默认是stderr。csvlog可以以csv格式输出,便于分析。如果没有分析需求,个人推荐默认就好。

log_directory = ‘log’

log存放相遇于PGDATA的位置

log_filename = ‘postgresql-%a.log’

log 日志文件名,控制日志输出频率。上面是保存一周,每天一个log日志文件。

SQL审计相关日志记录

log_min_duration_statement = 5s; (重要)

慢查询日志记录,运行超过5s的语句被认为是慢查询。根据业务情况设定。

log_duration = off

每一个语句的时间都被记录。

log_statement = ‘mod’
  • ddl =数据定义语句,例如CREATE、ALTER和 DROP语句。
  • mod = ddl+数据修改语句例如INSERT, UPDATE、DELETE、TRUNCATE, 和COPY FROM。
  • all = 所有语句,但不包含语法错误的语句
log_lock_waits = on

当一个会话为获得一个锁等到超过deadlock_timeout时,是否记录日志。

deadlock_timeout = 1s

死锁检测之前在一个锁上等待的总时间。

检查点相关参数

checkpoint_warning =30s 检查点频率检查

如果检查点触发的频率小于30s,则log日志中会提醒你增加max_wal_size。

  • 参考设置:如果硬盘的性能很好可以设置小一些,如果硬盘性能差就设置大一些。这个参数不影响性能。只是用来检查实际checkpoint发生的频率。
checkpoint_timeout = 30 mins 检查点触发时间间隔

自动检查点出发的时间,增加这个参数的值会增加崩溃恢复所需的时间。磁盘性能好的话可以适当减小。这个值减小会增加检查点频率,降低性能。

max_wal_size = 8GB
  • 参考值:主机内存1/2
    在自动WAL检查点使得WAL增长到最大尺寸,到了这个尺寸,检查点就开始工作。
min_wal_size = 1GB

WAL磁盘使用率低于这个设置,旧的WAL文件总数被回收,确保预留足够的WAL空间处理WAL使用中的峰值。

  • 参考值:主机内存1/8

附录

log_duration=on 和 log_min_duration_statement=0的区别
前者所有查询时间都被记录,后者查询时间>0都被记录。听起来一个意思。

区别:log_min_duration_statement强制记录SQL文本,而log_duration不记录SQL文本。

也就是说,如果log_duration=on 同时log_min_duration_statement=5s时。

所有的语句都被记录时间,但是只有查询超过5s的语句才被记录SQL文。

个人认为log_duration只有在特殊场景才有意义。log_min_duration_statement已经够用了。

本文参数设定主要作为参考,未出现的参数并不意味着不需要设定。当你设定一个参数不知道参数意义和如何设定时可以参考这个文章。

猜你喜欢

转载自blog.csdn.net/kouryoushine/article/details/88852153