fsync、synchronous_commit 的简单测试

fsync、synchronous_commit 的简单测试fsync(boolean)如果打开这个参数,PostgreSQL服务器将尝试确保更新被物理地写入到磁盘,做法是发出fsync()系统调用或者使用多种等价的方法(见wal_sync_method)。这保证了数据库集簇在一次操作系统或者硬件崩溃后能恢复到一个一致的状态。虽然关闭fsync常常可以得到性能上的收益,但当发生断电或系统崩溃时可能造成不可恢复的数据损坏。因此,只有在能很容易地从外部数据中重

大家好,又见面了,我是你们的朋友全栈君。

fsync (boolean)

如果打开这个参数,PostgreSQL服务器将尝试确保更新被物理地写入到磁盘,做法是发出fsync()系统调用或者使用多种等价的方法(见wal_sync_method)。

这保证了数据库集簇在一次操作系统或者硬件崩溃后能恢复到一个一致的状态

虽然关闭fsync常常可以得到性能上的收益,但当发生断电或系统崩溃时可能造成不可恢复的数据损坏

因此,只有在能很容易地从外部数据中重建整个数据库时才建议关闭fsync。

能安全关闭fsync的环境的例子包括从一个备份文件中初始加载一个新数据库集簇、使用一个数据库集簇来在数据库被删掉并重建之后处理一批数据,

或者一个被经常重建并却不用于失效备援的只读数据库克隆。单独的高质量硬件不足以成为关闭fsync的理由。

当把fsync从关闭改成打开时,为了可靠的恢复,需要强制在内核中的所有被修改的缓冲区进入持久化存储。这可以在多个时机来完成:

在集簇被关闭时或在 fsync 因为运行initdb –sync-only而打开时、运行sync时、卸载文件系统时或者重启服务器时。

在很多情况下,为不重要的事务关闭synchronous_commit可以提供很多关闭fsync的潜在性能收益,并不会有的同时, 关闭fsync可以提供很多潜在的性能优势,

而不会有伴随着的数据损坏风险。

fsync只能在postgresql.conf文件中或在服务器命令行上设置。如果你关闭这个参数,请也考虑关闭full_page_writes。

简单的说 fsync 就是控制操作系统的缓存到磁盘。

synchronous_commit (enum)

指定在命令返回”success”指示给客户端之前,一个事务是否需要等待 WAL 记录被写入磁盘。合法的值是on、remote_write、localoff

默认的并且安全的设置是on。当设置为off时,在向客户端报告成功和真正保证事务不会被服务器崩溃威胁之间会有延迟(最大的延迟是wal_writer_delay的三倍)。

不同于fsync,将这个参数设置为off不会产生数据库不一致性的风险:一个操作系统或数据库崩溃可能会造成一些最近据说已提交的事务丢失,但数据库状态是一致的,

就像这些事务已经被干净地中止。因此,当性能比完全确保事务的持久性更重要时,关闭synchronous_commit可以作为一个有效的代替手段。更多讨论见第 30.3 节。

如果synchronous_standby_names被设置,这个参数也控制事务提交是否将等待事务的 WAL 记录被复制到后备服务器上。当这个参数被设置为on时,

直到来自于当前同步的后备服务器的一个回复指示该后备服务器已经收到了事务的提交记录并将其刷入了磁盘,主服务器上的事务才会提交。这保证事务将不会被丢失,

除非主服务器和后备服务器都遭受到了数据库存储损坏的问题。当这个参数被设置为remote_write时,提交将等待,直到来自当前同步的后备服务器的一个回复指示该服务器

已经收到了该事务的提交记录并且已经把该记录写出到后备服务器的操作系统,但是该数据并不一定到达了后备服务器上的稳定存储。这种设置足以保证数据在后备服务器的

PostgreSQL实例崩溃时得以保存,但是不能保证后备服务器遭受操作系统级别崩溃时数据能被保持。

当使用同步复制时,它将对等待本地刷写磁盘和 WAL 记录复制很敏感,或者对允许事务异步提交很敏感。不过,设置local可以用于希望等待本地刷写磁盘但不等待同步复制的事务。

如果没有设置synchronous_standby_names,设置on、remote_write和local都提供了同样的同步级别:事务提交只等待本地刷写磁盘。

这个参数可以随时被修改;任何一个事务的行为由其提交时生效的设置决定。因此,可以同步提交一些事务,同时异步提交其他事务。例如,当默认是相反时,

实现一个单一多语句事务的异步提交,在事务中发出SET LOCAL synchronous_commit TO OFF。

<<synchronous_commit 参数的再次说明>>

实验

mondb=# \d tmp_wal_compress
         Table "public.tmp_wal_compress"
   Column    |         Type          | Modifiers 
-------------+-----------------------+-----------
 id          | bigint                | 
 random_char | character varying(50) | 
 random_int  | bigint                | 
 
 
#####################################################

mondb=# truncate table tmp_wal_compress;
TRUNCATE TABLE
Time: 3.429 ms


mondb=# select name,setting from pg_settings ps where ps.name in ('synchronous_commit','fsync');
        name        | setting 
--------------------+---------
 fsync              | on
 synchronous_commit | on
(2 rows)

Time: 2.484 ms

mondb=# insert into tmp_wal_compress select generate_series(1, 10000000) as id, md5(random()::text) as info ,trunc(random()*10000000)
mondb-# ;
INSERT 0 10000000
Time: 48370.781 ms


#####################################################

mondb=# truncate table tmp_wal_compress;
TRUNCATE TABLE
Time: 39.273 ms


mondb=# select name,setting from pg_settings ps where ps.name in ('synchronous_commit','fsync');
        name        | setting 
--------------------+---------
 fsync              | off
 synchronous_commit | on

Time: 2.484 ms

mondb=# insert into tmp_wal_compress select generate_series(1, 10000000) as id, md5(random()::text) as info ,trunc(random()*10000000)
mondb-# ;
INSERT 0 10000000
Time: 40566.090 ms



#####################################################

mondb=# truncate table tmp_wal_compress;
TRUNCATE TABLE
Time: 3.429 ms


mondb=# select name,setting from pg_settings ps where ps.name in ('synchronous_commit','fsync');
        name        | setting 
--------------------+---------
 fsync              | on
 synchronous_commit | off
(2 rows)

Time: 2.559 ms


mondb=# insert into tmp_wal_compress select generate_series(1, 10000000) as id, md5(random()::text) as info ,trunc(random()*10000000)
;
INSERT 0 10000000
Time: 43026.087 ms


#####################################################

mondb=# truncate table tmp_wal_compress;
TRUNCATE TABLE
Time: 9.112 ms


mondb=# select name,setting from pg_settings ps where ps.name in ('synchronous_commit','fsync');
        name        | setting 
--------------------+---------
 fsync              | off
 synchronous_commit | off
(2 rows)

Time: 2.559 ms

mondb=# insert into tmp_wal_compress select generate_series(1, 10000000) as id, md5(random()::text) as info ,trunc(random()*10000000)
;
INSERT 0 10000000
Time: 40418.334 ms

通过简单实验可以看出
fsync 由 on 设置为 off 时,性能有大概 15% 的提升。虽然性能提高了,但是风险加大了。
synchronous_commit 由 on 设置为 off 时,性能提升并不是特别明显。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138414.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 视觉里程计原理_视觉定位和里程计辅助定位

    视觉里程计原理_视觉定位和里程计辅助定位注意到位姿节点之间的变换并不是位姿,之前一直有误解;一般地;路标节点:也就是观测方程【数学形式下见】的观测值,也就是特征点的像素坐标[u,v],或者该帧相机坐标系下的3d坐标[x,y,z];位姿

    2022年8月3日
    8
  • 第三方微信登录

    第三方微信登录

    2021年10月30日
    39
  • 网页幻灯片轮播代码_怎么快速实现对幻灯片的统一修改

    网页幻灯片轮播代码_怎么快速实现对幻灯片的统一修改   NetCMS有两种幻灯片显示方式:Flash幻灯片和轮换幻灯片。Flash幻灯片是通过将图片新闻中的图片合成Flash后再在页面上显示。轮换幻灯片则是使用脚本进行控制(准确地说,是使用VBScript)。   其实,这两种显示形式差不多,只不过Flash幻灯片是通过Flash实现图片的过渡效果,而轮换幻灯片是利用IE提供的Filter属性实现图片过渡效果的。   鉴于轮换幻灯片

    2022年9月30日
    2
  • python random.randint函数用法(random.randint()是什么意思)

    numpy.random.randint(low,high=None,size=None,dtype=’l’)函数的作用是,返回一个随机整型数,范围从低(包括)到高(不包括),即[low,high)。如果没有写参数high的值,则返回[0,low)的值。参数如下:low:int生成的数值最低要大于等于low。(hign=None时,生成的数值要在[0,low)区间内)high:i…

    2022年4月16日
    837
  • 数据库和数据仓库的区别与联系_大数据的四个特点

    数据库和数据仓库的区别与联系_大数据的四个特点1.概念方面.数据库:是一种逻辑概念,用来存放数据的仓库。通过数据库软件来实现。数据库由很多表组成,表是二维的,一张表里可以有很多字段。字段一字排开,对应的数据就一行一行写入表中。数据库的表,在于能够

    2022年8月5日
    4
  • php面向过程和面向对象的区别

    php面向过程和面向对象的区别PHP 语言是同时可以应用面向过程和面向对象方式的编程 面向过程与面向对象在许多编程语言中只能使用二者之一来进行编程 但是 PHP 语言与其他编程语言有不同之处 那就是我们可以自由的选择某种编程方式 或者将 PHP 面向过程和 PHP 面向对象二者混用 面向过程编程采用由上至下的程序设计方法 分析出解决问题所需要的步骤 然后用函数把这些步骤一步一步实现 使用的时候一个一个依次调用就可以了 面向对象是把整

    2025年9月17日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号