概述

为了保证数据可靠性,同时还要保证好的读写性能,以及读写的一致性,经过多年的积累,REDO日志,shared buffer等基本成为关系型数据库的标配。postgres也不例外。

为了保证数据的可靠性,通常在将脏页面写入硬盘前,先将wal日志先写入硬盘,然后将修改的数据异步分批写入。

为了保证好的读写性能,修改的数据先写到shared buffer中,而不是直接写入硬盘,因为数据页很离散(修改的数据分布在不同的表中)。数据库会把wal日志顺序写入硬盘中。

postgres提供两种方式写:write和fsync。区别是:

write:数据库会将buffer中的脏页根据写入策略将老化的脏页面写到OS,OS再根据自己的调度算法将脏页写入硬盘。
fsync:数据库直接调用OS的fsync函数,直接写入硬盘。

OS层面

涉及到几个内核参数,同时还涉及到文件系统。

dirty_background_ratio

设置方法

1、修改systctl:vm.dirty_background_ratio
2、修改文件/proc/sys/vm/dirty_background_ratio

含义

在尝试执行writeback操作(即OS触发background flush线程刷脏页)之前内存脏页面比例。
控制文件系统的pdflush进程,在何时刷新磁盘。
单位是百分比,当写缓冲使用到系统内存多少时,pdflush开始向磁盘写出数据。
增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。
但当需要持续、恒定的写入场合时,应该降低其数值。缺省值5。

dirty_expire_centisecs

设置方法

1、修改systctl:vm.dirty_writeback_centisecs
2、修改文件/proc/sys/vm/dirty_expire_centisecs

含义

background flush线程将存活时间超过该值的脏页刷盘(类似LRU)。
数据可以保持为dirty状态的最大时间,超过该值pdflush进程就开始考虑写到磁盘中去。
单位是1/100s。缺省30000,也就是30s。
对于特别重载的写操作来说,这个值适当缩小也是好的,但也不能缩小太多,因为缩小太多也会导致IO提高太快。
建议设置为1500,也就是15秒算旧。

dirty_ratio

设置方法

1、修改systctl:vm.dirty_ratio
2、修改文件/proc/sys/vm/dirty_ratio

含义

控制文件系统的文件系统写缓冲区的大小,单位是百分比。
当脏页比例达到该值,用户进程在调用write时,会触发flush磁盘的操作。表示当写缓冲使用到系统内存多少时,开始向磁盘写出数据。
当一个任务(或者进程)在脏页面过多的环境中执行文件写操作时,如果脏页面占用总内存的百分比高于dirty_ratio值,那么系统就执行脏页面写入硬盘操作。
增大会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。
但当需要持续、恒定的写入场合时,应该降低其数值,缺省值10。

dirty_writeback_centisecs

设置方法

1、修改systctl:vm.dirty_writeback_centisecs
2、修改文件/proc/sys/vm/dirty_writeback_centisecs

含义

控制内核的脏数据刷新进程pdflush的运行间隔,执行background flush线程的唤醒间隔。
单位是1/100s。缺省值是500,也就是5s。
适当减少该值有写操作削峰作用,如果系统是持续地写入动作,那么降低该值比较好,可以把尖峰写操作削平成多次写操作。
该参数值应小于dirty_expire_centisecs,但太小I/O太频繁,反而使系统性能下降。
据说1:6 (dirty_expire_centisecs: dirty_writeback_centisecs )的比例比较好。

dirty_background_bytes

如果内存非常大,当触发后台线程刷脏页时,可能需要刷很多脏页,导致尖锐的IO需求。

可以通过修改内核参数vm.dirtybackgroundbytes达到削尖的目的。

vm.dirtybackgroundbytes
= 102400000 当脏页数达到了100MB,系统触发background flush线程刷脏页

数据库层面

wal日志写入方式fsync

fsync = on
开启后强制把wal日志同步更新到磁盘,可以保证数据库将在OS或者硬件崩溃的后恢复到一个一致的状态。
虽然关闭,可以提升数据库性能,但无法保证数据库崩溃后数据一致性。
通常情况下需要打开这个参数,除非能经受掉电或硬件故障带来的数据丢失,否则不要关闭。

backend_flush_after

单位:BLCKSZ
当某backend process脏数据超过配置阈值时,触发调用OS sync_file_range,告诉os backend flush线程异步刷盘。
从而削减os dirty page堆积。

bgwriter_flush_after

单位:BLCKSZ
当bgwriter process脏数据超过配置阈值时,触发调用OS sync_file_range,告诉os backend flush线程异步刷盘。
从而削减os dirty page堆积。

checkpoint_flush_after

单位:BLCKSZ
当checkpointer process脏数据超过配置阈值时,触发调用OS sync_file_range,告诉os backend flush线程异步刷盘。
从而削减os dirty page堆积。

wal_writer_flush_after

单位:BLCKSZ
当wal writer process脏数据超过配置阈值时,触发调用OS sync_file_range,告诉os backend flush线程异步刷盘。
从而削减os dirty page堆积。

Postgres间隔大量写IO的解决办法的更多相关文章

  1. Android HttpURLConnection.connect找不到源 HttpURLConnection连接失败 HttpURLConnection.connect IO异常 解决办法

    Android HttpURLConnection.connect找不到源  HttpURLConnection连接失败 HttpURLConnection.connect IO异常 解决办法 以下代 ...

  2. Delphi7程序调用C#写的DLL解决办法(转)

    近来,因工作需要,必须解决Delphi7写的主程序调用C#写的dll的问题.在网上一番搜索,又经过种种试验,最终证明有以下两种方法可行:    编写C#dll的方法都一样,首先在vs2005中创建一个 ...

  3. Delphi7程序调用C#写的DLL解决办法

     近来,因工作需要,必须解决Delphi7写的主程序调用C#写的dll的问题.在网上一番搜索,又经过种种试验,最终证明有以下两种方法可行:    编写C#dll的方法都一样,首先在vs2005中创建一 ...

  4. python中导入模块的本质, 无法导入手写模块的解决办法

    最近身边一些朋友发生在项目当中编写自己模块,导入的时候无法导入的问题. 下面我来分享一下关于python中导入模块的一些基本知识. 1 导入模块时寻找路径 在每一个运行的python程序当中,都维护了 ...

  5. 需要序列化的类中没有写serialVersionUID的解决办法

    由于没赋值serialVersionUID 只是警告,不是错误,造成先前没留意设定serialVersionUID,网络两端上线运行一段时间也感觉正常.如果再增减修改field,没赋值好serialV ...

  6. [C#]使用 C# 代码实现拓扑排序 dotNet Core WEB程序使用 Nginx反向代理 C#里面获得应用程序的当前路径 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法 .Net程序员 初学Ubuntu ,配置Nignix 夜深了,写了个JQuery的省市区三级级联效果

    [C#]使用 C# 代码实现拓扑排序   目录 0.参考资料 1.介绍 2.原理 3.实现 4.深度优先搜索实现 回到顶部 0.参考资料 尊重他人的劳动成果,贴上参考的资料地址,本文仅作学习记录之用. ...

  7. kafka启动时出现FATAL Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer) java.io.IOException: Permission denied错误解决办法(图文详解)

    首先,说明,我kafk的server.properties是 kafka的server.properties配置文件参考示范(图文详解)(多种方式) 问题详情 然后,我启动时,出现如下 [hadoop ...

  8. li 与 li 之间有空白间隔是什么原因引起的,有什么解决办法

    li 与 li 之间有空白间隔是什么原因引起的,有什么解决办法 原因 浏览器会把inline元素间的空白字符(空格.换行.Tab等)渲染成一个空格.而为了美观,我们通常是一个 放在一行,这导致 换行后 ...

  9. 块级标签包含行内标签底部出现3px间隔的解决办法

    当块级标签(如div)内包含了行内标签(如img),则外层元素与内层元素底部会出现3px的间隔: 代码如下: <!doctype html> <html lang="en& ...

随机推荐

  1. 虚拟机 VMware Workstation12 安装Ubuntu系统

    Ubuntu 系统是一款优秀的.基于GNU/Linux 的平台的桌面系统. 当然,目前为止很多应用程序还完全不能允许运行在 Ubuntu 系统上,而且 Ubuntu 的界面.使用方法会让大部分Wind ...

  2. linux命令(15):mount/umount命令

    使用挂盘之前可以先使用fdisk -l查看硬盘分区情况. 命令格式: mount [-t vfstype] [-o options] device dir -t vfstype 指定文件系统的类型.常 ...

  3. POJ - 2478

    Farey Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12802   Accepted: 4998 D ...

  4. poj 1962(并查集+带权更新)

    Corporative Network Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 3664   Accepted: 13 ...

  5. NYOJ 201 作业题

    作业题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 小白同学这学期有一门课程叫做<数值计算方法>,这是一门有效使用数字计算机求数学问题近似解的方法与过 ...

  6. 用ab进行POST,GET压力测试,且定义header及json的内容

    这个以前没作过,找了文档.搞定. 要求时间的单curl测试的方式如下: time curl http://xxxxx/hq/restapi/isStart curl用来用post请求,且有header ...

  7. 【JBPM4】任务节点-任务分配assignment-Handler

    JPDL <?xml version="1.0" encoding="UTF-8"?> <process key="task&quo ...

  8. OpenStack 计算服务 Nova计算节点部署 (九)

    如果使用vmware虚拟机进行部署,需要开启虚拟化:如果是服务器需要在bios上开启. Nova Compute nova-compute 一般运行在计算节点上,通过Messages Queue接收并 ...

  9. Kerberos KDC not reachable

    水贴..我这里出现这个问题的原因是服务器上安装的是 oracle  jdk, 但是没有安装 JCE 拓展包. 解决方式有两个: 1. 换成 openJDK 2. 安装上 JCE 拓展包 java 8 ...

  10. MFC获取句柄

    CWnd *pWnd = GetDlgItem(ID_***); // 取得控件的指针 HWND hwnd = pWnd->GetSafeHwnd(); // 取得控件的句柄