在使用postgresql过程当中如果并发比较高,并且数据量也比较大的时候需要对配置项做一些优化
实际的postgresql默认配置比较保守,所以如果机器硬件配置还可以的话可以大幅度改动
不同版本下的配置默认值是不一样的,具体以官方文档为准
以下配置是pg14版本
max_connectionsshared_buffers128MBPostgreSQL用于缓存数据IO压力很大的情况下,提高该值可以减少磁盘IOwork_mem加快查询排序
默认4M
设置在写入临时磁盘文件之前查询操作(例如排序或哈希表)可使用的基础最大内存容量
ORDER BY、DISTINCT和归并连接都要用到排序操作,哈希连接、基于哈希的聚集以及基于哈希的IN子查询处理中都要用到哈希表,
使内部排序和一些复杂的查询都在这个buffer中完成,有助提高排序等操作的速度,并且降低IO
这个参数和max_connections有关,如果100个查询并发,最坏情况下就很快就达到400M的内存使用,
work_mem * max_connections需要小于内存,推荐乘积可以保持在内存的1/2和3/4之间
effective_cache_size4G,该配置不实际占用内存,优化器假设一个查询可以用的最大内存,保守推荐配置为物理内存的1/2,更加推荐配置为内存的3/4max_wal_sizeIO1Gwal全称是write ahead log,是postgresql中的online redo log,保证数据的一致性和事务的完整性WAL 检查点之间允许 WAL 增长到的最大尺寸wal可以显著减少磁盘写操作的数量,因为只需要将日志文件刷新到磁盘以确保提交事务,而不是事务更改的每个数据文件,日志文件是按顺序写入的,因此同步日志的成本要比刷新数据页的成本低得多consider increasing the configuration parameter "max_wal_size",则确实需要增大该参数,在高负载情况下,日志很快就会达到1G,推荐把该参数配置为32G或者以上wal_buffers4Mwal使用的共享内存大小,可以改成1G修改数据库配置可以通过修改postgresql.conf文件或者修改启动命令等方式
在postgresql的docker容器当中
postgresql.conf的文件位置是/var/lib/postgresql/data/postgresql.conf,如果找不到可以执行如下命令搜索一下
$ find / -name "postgresql.conf" 2>/dev/null
在修改完成该配置文件之后直接挂载进去启动容器就行
该方式简单直接
比如修改最大连接数量,配置启动命令为postgres -c max_connections=500即可
最终经过优化,修改pg的启动命令改为
$ postgres -c max_connections=500 -c shared_buffers=1GB -c work_mem=128MB -c max_wal_size=64GB -c wal_buffers=1GB
进入到psql环境下面执行show命令验证
500 (1 row)
或者使用show all 查看所有配置
postgresql检查点checkpoint产生原因
wal日志文件,保证足够的速度wal会占用大量磁盘,并且故障恢复的时候redo的wal日志太多导致故障恢复速度变慢checkpoint概述
wal缓冲区,提交后,更改被追加到磁盘上面的wal日志,永久生效wal日志中的更改被应用于数据文件checkpoint执行的时候会识别共享缓冲区的脏页,把数据写入数据文件当中(脏页刷入),然后删除这个检查点位置之前的wal文件触发条件
checkpoint命令wal文件的总大小超过了max_wal_size配置的大小checkpoint_timeout配置的超时时间pg_start_backup备份的时候本文作者:Kevin@灼华
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!