zoukankan      html  css  js  c++  java
  • pg几个重要的参数调优

    介绍

    pg数据库在不同的业务场景下,参数最好也需要进行针对的调整。默认值是在确保资源消耗最小的情况下,pg都能够运行起来,不会导致任何致命性的威胁。而实际中,默认的参数需要进行优化来达到性能的最大化,本文介绍一些常用的参数配置。

    参数

    pg数据库默认安装完后在data目录会有一个postgresql.conf文件,这个里面有非常多的参数来配置数据库。

    shared_buffers

    PostgreSQL既使用自身的缓冲区,也使用内核缓冲IO。这意味着数据会在内存中存储两次,首先是存入PostgreSQL缓冲区,然后是内核缓冲区。这被称为双重缓冲区处理。对大多数操作系统来说,这个参数是最有效的用于调优的参数。此参数的作用是设置PostgreSQL中用于缓存的专用内存量。

    shared_buffers的默认值设置得非常低,因为某些机器和操作系统不支持使用更高的值。但在大多数现代设备中,通常需要增大此参数的值才能获得最佳性能。

    建议的设置值为机器总内存大小的25%,但是也可以根据实际情况尝试设置更低和更高的值。实际值取决于机器的具体配置和工作的数据量大小。举个例子,如果工作数据集可以很容易地放入内存中,那么可以增加shared_buffers的值来包含整个数据库,以便整个工作数据集可以保留在缓存中。

    在生产环境中,将shared_buffers设置为较大的值通常可以提供非常好的性能,但应当时刻注意找到平衡点。

    查看当前shared_buffers的值:

    postgres=# show shared_buffers;
     shared_buffers 
    ----------------
     128MB
    
    

    wal_buffers

    PostgreSQL将其WAL(预写日志)记录写入缓冲区,然后将这些缓冲区刷新到磁盘。由wal_buffers定义的缓冲区的默认大小为16MB,但如果有大量并发连接的话,则设置为一个较高的值可以提供更好的性能。

    查看当前wal_buffers的值:

    postgres=# show wal_buffers;
     wal_buffers
    -------------
     4MB
    (1 行记录)
    

    effective_cache_size

    effective_cache_size提供可用于磁盘高速缓存的内存量的估计值。它只是一个建议值,而不是确切分配的内存或缓存大小。它不会实际分配内存,而是会告知优化器内核中可用的缓存量。在一个索引的代价估计中,更高的数值会使得索引扫描更可能被使用,更低的数值会使得顺序扫描更可能被使用。在设置这个参数时,还应该考虑PostgreSQL的共享缓冲区以及将被用于PostgreSQL数据文件的内核磁盘缓冲区。默认值是4GB。

    查看当前effective_cache_size的值:

    postgres=# show effective_cache_size;
     effective_cache_size
    ----------------------
     4GB
    (1 行记录)
    

    work_mem

    此配置用于复合排序。内存中的排序比溢出到磁盘的排序快得多,设置非常高的值可能会导致部署环境出现内存瓶颈,因为此参数是按用户排序操作。如果有多个用户尝试执行排序操作,则系统将为所有用户分配大小为work_mem *总排序操作数的空间。全局设置此参数可能会导致内存使用率过高,因此强烈建议在会话级别修改此参数值。默认值为4MB。

    查看当前work_mem的值:

    postgres=# show work_mem;
     work_mem
    ----------
     4MB
    (1 行记录)
    

    maintenance_work_mem

    maintenance_work_mem是用于维护任务的内存设置。默认值为64MB。设置较大的值对于VACUUM,RESTORE,CREATE INDEX,ADD FOREIGN KEY和ALTER TABLE等操作的性能提升效果显著。

    查看当前maintenance_work_mem的值:

    postgres=# show maintenance_work_mem;
     maintenance_work_mem
    ----------------------
     64MB
    (1 行记录)
    
    

    synchronous_commit

    此参数的作用为在向客户端返回成功状态之前,强制提交等待WAL被写入磁盘。这是性能和可靠性之间的权衡。如果应用程序被设计为性能比可靠性更重要,那么关闭synchronous_commit。这意味着成功状态与保证写入磁盘之间会存在时间差。在服务器崩溃的情况下,即使客户端在提交时收到成功消息,数据也可能丢失。

    查看当前synchronous_commit的设置值:

    postgres=# show synchronous_commit;
     synchronous_commit
    --------------------
     on
    (1 行记录)
    

    checkpoint_timeout和checkpoint_completion_target

    PostgreSQL将更改写入WAL。检查点进程将数据刷新到数据文件中。发生CHECKPOINT时完成此操作。这是一项开销很大的操作,整个过程涉及大量的磁盘读/写操作。用户可以在需要时随时发出CHECKPOINT指令,或者通过PostgreSQL的参数checkpoint_timeout和checkpoint_completion_target来自动完成。

    checkpoint_timeout参数用于设置WAL检查点之间的时间。将此设置得太低会减少崩溃恢复时间,因为更多数据会写入磁盘,但由于每个检查点都会占用系统资源,因此也会损害性能。此参数只能在postgresql.conf文件中或在服务器命令行上设置。

    checkpoint_completion_target指定检查点完成的目标,作为检查点之间总时间的一部分。默认值是 0.5。 这个参数只能在postgresql.conf文件中或在服务器命令行上设置。高频率的检查点可能会影响性能。

    查看当前checkpoint_timeout和checkpoint_completion_target的值:

    PostgreSQL将更改写入WAL。检查点进程将数据刷新到数据文件中。发生CHECKPOINT时完成此操作。这是一项开销很大的操作,整个过程涉及大量的磁盘读/写操作。用户可以在需要时随时发出CHECKPOINT指令,或者通过PostgreSQL的参数checkpoint_timeout和checkpoint_completion_target来自动完成。

    checkpoint_timeout参数用于设置WAL检查点之间的时间。将此设置得太低会减少崩溃恢复时间,因为更多数据会写入磁盘,但由于每个检查点都会占用系统资源,因此也会损害性能。此参数只能在postgresql.conf文件中或在服务器命令行上设置。

    checkpoint_completion_target指定检查点完成的目标,作为检查点之间总时间的一部分。默认值是 0.5。

    这个参数只能在postgresql.conf文件中或在服务器命令行上设置。高频率的检查点可能会影响性能。

    查看当前checkpoint_timeout和checkpoint_completion_target的值:

    postgres=# show checkpoint_timeout;
     checkpoint_timeout
    --------------------
     5min
    (1 行记录)
    
    
    postgres=# show checkpoint_completion_target;
     checkpoint_completion_target
    ------------------------------
     0.5
    (1 行记录)
    

    wal_keep_segments

    该参数主要是控制wal文件的数量,对于频繁的更改数据库的业务场景下,wal日志短时间会非常多,对应的目录是pg_xlog,有时候,该目录的大小可能为几十上百G,很快就将磁盘变满。因此为了合理控制该目录的大小,一般会将wal_keep_segments控制在一个合理的范围内。因为该参数如果过小的话,会影响到数据库的启动或者流复制。如果过大的话,就是前面所说的,导致wal日志非常多,占用的空间会非常大,默认系统是为0,表示数据库不保存任何wal日志,但是实际中还是会有少量的产生。

    查看当前的wal_keep_segments值:

    postgres=# show wal_keep_segments;
     wal_keep_segments
    -------------------
     0
    (1 行记录)
    
    

    总结

    当然,还要很多其他的参数,本文参考了网上的一些资料进行了整理。pg数据库目前在中国远没有mysql那么流行,但是作为oracle的最佳替代开源数据库,pg一直在改进,相信pg相关的资料会越来越多,这也需要大家不断去尝试,不断共享自己使用pg的经验。

  • 相关阅读:
    达梦数据库学习(二、管理数据库实例)
    达梦数据库学习(一、linux操作系统安装及数据库安装)
    SQL Server 数据库还原进度查看
    关于索引的学习(主要是聚集索引与非聚集索引)
    SQL Server批量向表中插入多行数据语句
    最大流-前置push-relabel算法实现
    调度算法(二)
    调度算法(一)
    软件工程:提问回顾
    软件工程:个人阅读作业与总结
  • 原文地址:https://www.cnblogs.com/easonbook/p/11810268.html
Copyright © 2011-2022 走看看