暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

postgres相关参数学习1(vacuum和autovacuum)

开源喵 2021-06-23
1509

1 基于开销的清理延迟

  在 VACUUM 和 ANALYZE 命令执行过程中,系统维护一个内部的记数器,跟踪所执行的各种 I/O 操作的近似开销。如果积累的开销达到了 vacuum_cost_limit 声明的限制,那么执行这个操作的进程将睡眠 vacuum_cost_delay 指定的时间。然后它会重置记数器然后继续执行。


     这个特性的目的是允许管理员减少这些命令在并发活动的数据库上的 I/O 影响。比如,像 VACUUM 和 ANALYZE 这样的维护命令并不需要迅速完成,并且不希望它们严重干扰系统执行其它的数据库操作。基于开销的清理延迟为管理员提供了一个实现这个目的的手段。


  这个特性是缺省关闭的。要想打开它,把 vacuum_cost_delay 变量设置为一个非零值

 

    acuum_cost_delay (integer)
    以毫秒计的时间长度,如果超过了开销限制,那么进程将睡眠一会儿。
    缺省值 0 关闭基于开销的清理延迟特性。正数值打开基于开销的清理。
    不过,要注意在许多系统上,睡眠的有效分辨率是 10 毫秒;
    把 vacuum_cost_delay 设置为一个不是 10 的整数倍的数值与将它设置为下一个 10 的整数倍作用相同。

    vacuum_cost_limit (integer)
    导致清理进程休眠的积累开销。缺省是 200 。

    注:即如果vacuum和analyze的开销达到vacuum_cost_limit,则休眠vacuum_cost_delay

    #以下是vacuum的成本
    vacuum_cost_page_hit (integer)
    清理一个在共享缓存里找到的缓冲区的预计开销。它代表锁住缓冲池、查找共享的 Hash 表、
    扫描页面内容的开销。缺省值是 1

    vacuum_cost_page_miss (integer)
    清理一个要从磁盘上读取的缓冲区的预计开销。它代表锁住缓冲池、查找共享 Hash 表、
    从磁盘读取需要的数据块、扫描它的内容的开销。缺省值是 10

    vacuum_cost_page_dirty (integer)
    清理修改一个原先是干净的块的预计开销。它代表把一个脏的磁盘块再次刷新到磁盘上
    的额外开销。缺省值是 20


    【注意】有些操作会持有关键的锁,并且应该尽快结束。在这样的操作过程中,
    基于开销的清理延迟不会发生作用。为了避免在这种情况下的长延时,实际的延迟是 vacuum_cost_delay*accumulated_balance/vacuum_cost_limit 与 vacuum_cost_delay*4
    两者之间的最大值。


    2  自动清理相关参数

    1. autovacuum (boolean)

    2. 控制服务器是否应该启动 autovacuum 子进程。缺省是关闭的。要想启动这个进程,

    3. stats_start_collector 和 stats_row_level 也必须是打开的。

    4. 这个选项只能在服务器启动的时候或者在 postgresql.conf 文件里设置。

    5.  

    6. #建议不要太高频率,否则会因为vacuum产生较多的XLOG

    7. autovacuum_naptime (integer)

    8. 声明 autovacuum 子进程的活跃周期之间的延迟。在每次运行的周期里,

    9. 子进程都会检查一个数据库,并根据需要为该数据库的表发出 VACUUM 和 ANALYZE 命令。

    10. 这个延迟是以秒计的,缺省为 60 。这个选项只能在服务器启动的时候或者在 postgresql.conf

    11. 文件里设置。

    12.  

    13.  

    14. #触发vacuum条件1:

    15. #表上(update,delete 记录) >= autovacuum_vacuum_scale_factor* reltuples(表上记录数) +autovacuum_vacuum_threshold

    16.  

    17.  (1)autovacuum_vacuum_threshold清理常数

    18.  (2)autovacuum_vacuum_scale_factor 清理的缩放系数

    19.  

    20. autovacuum_vacuum_threshold (integer) #

    21. 声明在任何表里触发 VACUUM 所需最小的行更新或删除数量。缺省是 500 。

    22. 这个选项只能在服务器启动的时候或者在 postgresql.conf 文件里设置。

    23. 此处的设置可以针对每个表被 pg_autovacuum 表中的项改写。

    24.  

    25. autovacuum_vacuum_scale_factor (floating point)

    26. 声明在判断是否触发一个 VACUUM 时增加到 autovacuum_vacuum_threshold

    27.  参数里面的表尺寸的分数。缺省是 0.2(20%)。这个选项只能在

    28. 服务器启动的时候或者在 postgresql.conf 文件里设置。此处的设置可以

    29. 针对每个表被 pg_autovacuum 表中的项改写。

    30.  

    31. #触发vacuum条件2:

    32. #当表表上事务的最大年龄配置参数autovacuum_freeze_max_age,默认为2亿,达到这个阀值将触发 autovacuum进程

    33.  

    34. autovacuum_freeze_max_age (integer)

    35. 指定表的 pg_class在事务中的最大寿命。relfrozenxid 字段能够在

    36. 强制 VACUUM 操作以防止事务 ID在表内循环重复之前完成。需要注意的是

    37. ,即使 autovacuum 被禁止系统也会调用 autovacuum 进程来防止循环

    38. 重复。默认值是 200000000(2亿)。该参数只能在服务器启动时设置,

    39. 但是此处的设置可以针对每个表被 pg_autovacuum 表中的项减少。

    40.  

    41.  

    42. #触发autovacuum的analyze条件:

    43. #表上(插入、更新、删除数量)>=autovacuum_analyze_threshold+autovacuum_analyze_scale_factor* reltuples(表上记录数)

    44.  

    45. autovacuum_analyze_threshold (integer)

    46. 声明在任何表里触发 ANALYZE 所需最小的行插入、更新、删除数量。缺省是 250 。

    47. 这个选项只能在服务器启动的时候或者在 postgresql.conf 文件里设置。

    48. 此处的设置可以针对每个表被 pg_autovacuum 表中的项改写。

    49.  

    50.  

    51. autovacuum_analyze_scale_factor (floating point)

    52. 声明在判断是否触发一个 ANALYZE 时增加到 autovacuum_analyze_threshold 

    53. 参数里面的表尺寸的分数。缺省是 0.1(10%)。这个选项只能在服务器启动的时

    54. 候或者在 postgresql.conf 文件里设置。此处的设置可以针对每个表被 pg_autovacuum 表中的项改写。

    55.  

    56.  

    57.  

    58. #vacuum的延迟清理,如果为-1则默认使用vacuum_cost_delay

    59. autovacuum_vacuum_cost_delay (integer)

    60. 声明将在自动 VACUUM 操作里使用的开销延迟数值。-1(缺省值)将使用普通

    61. 的 vacuum_cost_delay 数值。这个选项只能在服务器启动的时候或者在 

    62. postgresql.conf 文件里设置。此处的设置可以针对每个表被 pg_autovacuum 表中的项改写。

    63.  

    64. #vacuum的延迟清理,如果为-1则默认使用vacuum_cost_limit

    65. autovacuum_vacuum_cost_limit (integer)

    66. 声明将在自动 VACUUM 操作里使用的开销限制数值。-1(缺省值)将使用普通的

    67.  vacuum_cost_limit 数值。这个选项只能在服务器启动的时候或者在

    68.  postgresql.conf 文件里设置。此处的设置可以针对每个表被 pg_autovacuum 表中的项改写。

    69.  

    70. autovacuum_work_mem

    71. 声明自动vacuum的内存设置,如果为设置,则等于maintenance_work_mem。

    72. 内存被用于记录垃圾tupleid,vacuum进程在进行表扫描时,当扫描到的垃圾

    73. 记录ID占满了整个内存(autovacuum_work_mem或maintenance_work_mem),

    74. 那么会停止扫描表,开始INDEX的扫描。扫描INDEX时,清理索引中的哪些tuple,

    75. 实际上是从刚才内存中记录的这些tupleid来进行匹配。当所有索引都扫描并清理了一遍后,

    76. 继续从刚才的位点开始扫描表



    文章转载自开源喵,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论