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 时,性能提升并不是特别明显。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • RTMP协议

    目录简介概念rtmp协议握手过程rtmp通信过程简介RTMP协议是RealTimeMessageProtocol(实时信息传输协议)的缩写,它是由Adobe公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题。     RTMP消息块流和RTMP一起适用于多样性音视频应用程序,从…

  • idea配置Tomcat_tomcat docbase

    idea配置Tomcat_tomcat docbaseidea配置tomcaterror:duplicatecontextpath 解决方法:    在editconfig中部署tomcat,     server         tomcathome            D:\software……\apache-tomcat-7.0.65   …

  • Headless模式_java throwable

    Headless模式_java throwableHeadless模式是在缺少显示屏、键盘或者鼠标时的系统配置。在java.awt.toolkit和java.awt.graphicsenvironment类中有许多方法,除了对字体、图形和打印的操作外还可以调用显示器、键盘和鼠标的方法。但是有一些类中,比如Canvas和Panel,可以在headless模式下执行。系统属性配置为了启用headless模式,需要使用setProperty方法去设置相…

    2022年10月23日
  • 做饭给自己一人吃,如何最快速,且营养有保证?

    做饭给自己一人吃,如何最快速,且营养有保证?二六 ,又土又木的设计师792 人赞同作为一个长期一个人的单身狗,这个我非常有经验啊。下面介绍一下我这三四年独居生活总结下来的经验。1.周末在家多屯点儿菜放冰箱,按照每顿饭一荤一素一个汤的组合,大致估摸着买菜。肉类肯定是要一些的,肉买多了不要紧可以速冻放的久些。蔬菜就不能买多了,绿叶的尤其不能多,因为它两三天就蔫了。所以以两天内的绿叶菜再搭上一天的瓜类豆类蔬菜为宜。2.

  • ubuntu下pycharm安装_pycharm激活成功教程版linux

    ubuntu下pycharm安装_pycharm激活成功教程版linuxlinux中安装pycharm的方法:1、获取PyCharm你可以通过下面网站获取PyCharm。屏幕中央有一个很大的’Download’按钮。https://www.jetbrains.com/pycharm/download/#section=linux你可以选择下载专业版或者社区版。如果你刚刚接触Python编程那么推荐下载社区版。然而,如果你打算发展到专业化的编程,那么专业版…

    2022年10月18日
  • python 进行socket 通信

    python 进行socket 通信

    2021年11月10日

发表回复

您的电子邮箱地址不会被公开。

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