最近一直在使用pgbench对pg进行压测,在压测的过程中,发现checkpoint的发生会对数据库的性能产生极大的影响.
想看到最近有没有发生checkpoint,有两种比较简单的方式:
一个是不停的刷新pg_stat_bgwriter这个视图,这个视图中两个字段checkpoints_timed和checkpoints_req直接反映了PG已经发生或是正在发生的checkpoint次数,如果这两个字段的值发生了变化,就说明发生了checkpoint。如果凑巧正在做checkpoint,可以查询这个视图的另外的一个字段buffers_checkpoint,这个字段表明了checkpoint进程刷回了多少个脏的block回磁盘,在做checkpoint的过程中这个字段的结果将会不断累积。在PG的checkpoint进程内部的实现中,如果要做checkpoint,会首先将checkpoints_timed或是checkpoints_req字段关联的统计值加一,然后再来把脏块挨个写回(write)磁盘,每写一个就把相关的统计值加1。一般来说,如果checkpoint_segments设置得足够大(例如128个)并且脏数据块很多,那么在一次做checkpoint的过程可以持续100多秒都是可能的,因此是可以看到buffers_checkpoint这个字段在不断增加的。
另外一个就是在postgresql.conf中打开log_checkpoints配置项,然后查看日志文件。在checkpoint开始时,会在日志文件中打印一行说checkpoint开始了,然后结束之后也会将本次checkpoint的统计信息打印出来,例如:
LOG: checkpoint starting: time LOG: checkpoint complete: wrote 0 buffers (0.0%); 0 transaction log file(s) added, 0 removed, 0 recycled; write=0.002 s, sync=0.000 s , total=0.011 s; sync files=0, longest=0.000 s, average=0.000 s
注意这段日志里面第一行提到了是因为到点了(time)才做的checkpoint。
前面提到的pg_stat_bgwriter视图中两个字段checkpoints_timed和checkpoints_req,在官方的英文文档中说得有些过于简洁,而被翻译成中文之后,结果有些晦涩。对于checkpoints_timed的解释,中文翻译过来是定期执行的检查点数这个基本上是对的,而对于checkpoints_req,英文文档是:Number of requested checkpoints that have been performed。应该是执行被请求的检查点数。至于被谁、在什么情况下请求的?都没有说明。
对于checkpoints_timed统计的检查点,很容易理解,就是在过了checkpoint_timeout这个配置项指定的时间之后执行的检查点,这个实际上是checkpoint进程主动发起的检查点。他在日志中输出就是上面日志的内容。
而对于checkpoints_req统计的检查点,实际上可以分为三种:一种是写的WAL距离上次的checkpoint位置已经超过了checkpoint_segments个WAL,那么这个时候需要做一个检查点了;另外一种就是做了比较重量的DML,例如创建了一个database,或是删除了一个database,或是修改了tablespace;最后一种就是用户直接通过SQL执行checkpoint这个命令而触发的检查点。
checkpoints_req统计的检查点实际上就是checkpoint进程被动执行的。如何来触发checkpoint进程来执行这些检查点呢?很简单:我们知道PG是个多进程的程序,checkpoint的进程信息(包括进程ID)存在了共享内存的hash表中的,是通过名字可以查到的,那么可以获得checkpoint进程的ID、直接通过kill调用来发生某个特定的信号来告诉checkpoint进程需要执行检查点了。实际上也是这样实现的,大家可以看具体的源码。
那么有个问题:如果过了checkpoint_timeout并且也接到了其他进程做checkpoint的请求了,那么该把谁加一呢?实际代码中是把checkpoints_req加一的。
另外:PG中发生的checkpoint是否都会被checkpoints_timed和checkpoints_req统计呢?答案是否定的:在PG启动的过程中,postmaster做完了恢复会做一个checkpoint,这个时候还没有其他进程,参见StartupXLOG函数;另外,当PG退出时,checkpoint进程会做一个检查点,这个检查点也是不被统计的。但是,如果打开了log_checkpoints配置项,这两种情况都是会被记录下来的。
相关推荐
Linux 中检查点 (Checkpoint) 的核心支持 ——ckpt 文件系统的设计 Linux 操作系统中,检查点 (Checkpoint) 机制是提高系统可靠性、减少运算损失的重要技术。检查点机制的核心支持是实现高效的进程迁移和负载平衡的...
完全检查点工作过程可以分成三个不同的阶段:第一阶段,checkpoint 进程开始一个 checkpoint 事件,并记录下 checkpoint RBA,这个通常是当前的 RBA。第二阶段,checkpoint 进程通知 DBWn 进程将所有 checkpoint RBA...
在 QTP 中,可以通过 insert→checkpoint→standard checkpoint 等方法添加检查点。在添加检查点时,QTP 会基于检查点内的信息分配名称。即使您随后修改了其所基于的信息,检查点名称也不会改变。 在关键字视图中...
在Oracle数据库管理中,Checkpoint是一种关键机制,用于确保数据的一致性和安全性。Checkpoint的主要功能是在数据库发生故障时,能够快速恢复到一个一致的状态,而无需进行全量的重做日志回放。以下是对Checkpoint...
增量检查点是Oracle 8及以后版本中引入的一种优化机制,旨在减少因频繁执行完全检查点而导致的大规模I/O操作。在这种机制下,脏块被放置在一个检查点队列中,并按其首次被修改时的RBA排序。这样,越早被修改的数据块...
2. **增量检查点(Incremental Checkpoint)**:这是一种优化策略,仅写入自上次完全检查点以来修改过的脏数据块,从而减少了I/O操作,提高了系统性能。 #### 四、Checkpoint 相关概念 在深入了解Checkpoint的工作...
在LoadRunner中,检查点(Checkpoint)是一种重要的验证机制,用于验证在虚拟用户执行过程中,应用程序是否按照预期的方式响应。检查点可以帮助测试人员确认特定的操作是否成功完成,或者页面是否正确加载。 本文...
物理Checkpoint是指将数据库缓冲区缓存(database buffer cache)中的脏页(dirty blocks)写入到数据文件中,并更新控制文件和重做日志文件,使其包含最新的检查点信息。这个过程通常由后台进程CKPT来触发,也可以...
在检查点过程中,系统会将内存中的缓冲区内容刷新到磁盘上,并在日志中记录一个检查点标记。这意味着,当系统再次启动时,可以跳过检查点之前的重做操作,只处理检查点之后未完成的事务。 **1.4 MSSQL Server检查点...
Oracle检查点(Checkpoint)是数据库管理系统中的一个关键概念,它涉及到数据一致性、恢复机制和性能优化。检查点的主要目的是确保在实例失败后,数据库能够快速地恢复到一致性的状态。 检查点分为增量检查点...
检查点是QTP自动化测试中的基础组成部分,除了文本检查点,还有图像、数据库、对象等多种类型的检查点。熟练掌握检查点的创建和使用,对于编写高效、可靠的自动化测试脚本至关重要。同时,合理地利用检查点可以帮助...
3. **位图检查点(Bitmap Checkpoint)**:用于检查屏幕上的图像或控件的外观是否符合预期,例如位置、大小、颜色等。 - 在UFT中选择【Bitmap Checkpoint】。 - 点击你想要检查的对象。 - 设置检查点条件,例如比较...
`tensorflow-checkpoint-reader`是一个Python库,专为处理TensorFlow框架中的检查点(checkpoint)文件而设计。这些检查点文件存储了模型训练过程中的权重和参数,以便在后续的训练或者部署中恢复模型的状态。下面...
本教程主要关注如何在测试过程中创建检查点(Checkpoint),以确保网页内容或状态符合预期。在自动化测试中,检查点是一种重要的验证手段,用于比对实际测试结果与预期结果是否一致,从而确保应用程序的正确运行。 ...
检查点SCN(System Change Number)是Oracle数据库中用于数据一致性与恢复的关键概念。SCN是一个全局递增的序列号,记录了数据库发生的每一次变化,确保在实例故障或崩溃后,能够通过重做日志恢复到一致性的状态。 ...
Oracle 检查点(Checkpoint)是数据库管理系统中一种关键的优化策略,它涉及到数据库的稳定性和恢复机制。检查点的主要目标是确保在系统崩溃或意外停机后,数据库能够快速恢复到一致的状态,减少恢复过程中的数据...