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

it2022-05-05  178

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

修改配置文件方法 默认配置文件postgresql.conf。每一行代表一个参数,#代表注释。为PG提供默认值,除非被下面方法覆盖。 postgresql.auto.conf。不能手工编辑,文件保存了Alter SYSTEM命令提供的设置。优先级 > postgresql.conf。 SQL命令修改参数。 ALTER SYSTEM命令改变全局默认值,等同修改配置文件。 ALTER DATABASE命令允许针对一个数据库覆盖其全局设置。 ALTER ROLE命令允许用用户指定的值来覆盖全局设置和数据库设置 4,修改会话级别的参数。SHOW/SET SHOW===current_setting(setting_name text) 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 2 3 重新加载配置文件 不重启修改配置文件 sudo -u postgres /usr/pgsql-11/bin/pg_ctl reload -D $PGDATA SQL函数pg_reload_conf() 重启服务是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已经够用了。

作者:如何在3年拿到50K 来源: 原文:https://blog.csdn.net/kouryoushine/article/details/88852153 版权声明:本文为博主原创文章,转载请附上博文链接!


最新回复(0)