延迟写

传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行。当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作。这种输出方式被称为延迟写(delayed write)(Bach [1986]第3章详细讨论了缓冲区高速缓存)。

"延迟写"减少了磁盘读写次数,但是却降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间内并没有写到磁盘上。当系统发生故障时,这种延迟可能造成文件更新内容的丢失。为了保证磁盘上实际文件系统与缓冲区高速缓存中内容的一致性,UNIX系统提供了sync、fsync和fdatasync三个函数。
sync函数只是将所有修改过的块缓冲区排入写队列,无需等待写磁盘操作便返回。系统守护进程(update)会周期性(30秒)调用sync函数来刷新内存缓冲区。

fsync函数只对由文件描述符filedes指定的单一文件起作用,需要等待写磁盘操作结束后才返回,确保修改过的数据被写入到磁盘。fsync不但更新数据,还更新指定文件元数据(如修改时间和访问时间)。

fdatasync函数与fsync函数类似,但fdatasync函数只更新数据,而不更新指定文件的属性。

由于fsync函数除需要更新数据外,还需要更新文件元数据(metadata,包括文件大小/访问时间/修改时间等),因此fsync函数需要两次写,而fdatasync函数值需要一次写。

Unfortunately fsync() will alwaysalways initialize two write operations: one for the newly written data and another one in order to update the modification time stored in the inode. 
If the modification time is not a part of the transaction concept fdatasync() can be used to avoid unnecessary inode disk write operations.

参数innodb_flush_method

参数innodb_flush_method有在Unix上有6个可选值:fsync/O_DSYNC/littlesync/nosync/O_DIRECT/O_DIRECT_NO_FSYNC,由于littlesync/nosync风险较高,常用的下面4种:

fsync:默认值,使用fsync()系统调用来刷新数据文件和日志文件

O_DSYNC:使用O_SYNC打开和刷新日志文件,使用fsync()刷新数据文件。(在很多UNIX版本上直接使用O_DSYNC会存在问题)

O_DIRECT:使用O_DIRECT打开数据文件,使用fsync()来刷新数据文件和日志文件。(O_DIRECT在大部分UNIX系统上可用)

O_DIRECT_NO_FSYNC:在Flush IO操作时使用O_DIRECT,但在每次write操作时跳过fsync()系统调用。(O_DIRECT_NO_FSYNC在MySQL 5.6.6版本引入,但不适合XFS和EXT4文件系统)

生产环境中使用innodb_flush_method=O_DIRECT

The innodb_flush_method options for Unix-like systems include:

fsync: InnoDB uses the fsync() system call to flush both the data and log files. fsync is the default setting.

O_DSYNC: InnoDB uses O_SYNC to open and flush the log files, and fsync() to flush the data files. InnoDB does not use O_DSYNC directly because there have been problems with it on many varieties of Unix.

littlesync: This option is used for internal performance testing and is currently unsupported. Use at your own risk.

nosync: This option is used for internal performance testing and is currently unsupported. Use at your own risk.

O_DIRECT: InnoDB uses O_DIRECT (or directio() on Solaris) to open the data files, and uses fsync() to flush both the data and log files. This option is available on some GNU/Linux versions, FreeBSD, and Solaris.

O_DIRECT_NO_FSYNC: InnoDB uses O_DIRECT during flushing I/O, but skips the fsync() system call after each write operation.

This setting is not suitable for file systems such as XFS and EXT4, which require an fsync() system call to synchronize file system metadata changes. If you are not sure whether your file system requires an fsync() system call to synchronize file system metadata changes, use O_DIRECT instead.

On storage devices with cache, data loss is possible if data files and redo log files reside on different storage devices, and a crash occurs before data file writes are flushed from the device cache. If you use or intend to use different storage devices for redo logs and data files, use O_DIRECT instead.

如果使用带缓存的RAID控制器,推荐使用O_DIRECT来避免操作系统和存储系统两次缓存。

如果使用SAN存储来存放数据文件和日志文件,对于读负载较高的存储系统,使用fsync()或O_DSYNC可能更快。

摘抄连接:

https://www.cnblogs.com/gomysql/p/3595806.html

https://www.cnblogs.com/bhlsheji/p/5222271.html

https://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html

MySQL Config--参数innodb_flush_method的更多相关文章

  1. mysql服务器参数

    mysql服务器参数: 配置是从上往下读取,同一个参数项,后边的配置项会覆盖前边的配置项 mysql获取配置信息路径: 命令行参数    mysqld_safe  --datadir=/data/sq ...

  2. mysql核心参数优化

    MySQL数据库服务器配置CPU的优化内存的优化IO的优化连接的优化数据一致性的优化 1.描述back_log参数的作用? back_log = 500 要求 MySQL 能有的连接数量.当主要MyS ...

  3. 【查阅】mysql配置文件/参数文件重要参数笔录(my.cnf)

    持续更新,积累自己对参数的理解 [1]my.cnf参数 [client]port = 3306socket = /mysql/data/3306/mysql.sockdefault-character ...

  4. Mysql性能参数优化

    1.Max_connections (1)简介 Mysql的最大连接数,如果服务器的并发请求量比较大,可以调高这个值,当然这是要建立在机器能够支撑的情况下,因为如果连接数越来越多,mysql会为每个连 ...

  5. 1201MySQL配置文件mysql.ini参数详解

    转自http://www.cnblogs.com/feichexia/archive/2012/11/27/mysqlconf.html my.ini(Linux系统下是my.cnf),当mysql服 ...

  6. (转)MySQL配置文件mysql.ini参数详解、MySQL性能优化

    本文转自:http://www.cr173.com/html/18331_1.html my.ini(Linux系统下是my.cnf),当mysql服务器启动时它会读取这个文件,设置相关的运行环境参数 ...

  7. MySQL配置文件mysql.ini参数详解、MySQL性能优化

    my.ini(Linux系统下是my.cnf),当mysql服务器启动时它会读取这个文件,设置相关的运行环境参数. my.ini分为两块:Client Section和Server Section.  ...

  8. MySQL配置文件mysql.ini参数详解

    my.ini(Linux系统下是my.cnf),当mysql服务器启动时它会读取这个文件,设置相关的运行环境参数. my.ini分为两块:Client Section和Server Section. ...

  9. 在Linux最大打开文件数限制下 MySQL 对参数的调整

    http://www.actionsky.com/docs/archives/78  2016年4月7日  周文雅 目录 1 起因 2 说明 3 MySQL调整参数的方式 3.1 计算 request ...

随机推荐

  1. vue监听当前页面的地址变化/路由变化

    转载自: Heap Stack(Pingbook) https://pingbook.top/vue-watch-current-url-route-change/

  2. JavaScript插件开发

    一.前言 通过 "WWW" 原则我们来了解 JavaScript 插件这个东西 第一个 W "What" -- 是什么?什么是插件,我就不照搬书本上的抽象概念了 ...

  3. sort排序与二分查找

    #include<iostream> #include<vector> #include<algorithm> #include<string> usi ...

  4. 【技术博客】移动端的点击事件与Sticky Hover问题

    目录 移动端的点击事件与Sticky Hover问题 TL;DR 前言 问题描述 背景 实现方式 问题 关于移动端浏览器的点击事件 初次发现问题后各种解决尝试:从点击事件本身下手 cursor: po ...

  5. Sql Server 数据库出现“可疑”的解决办法

    问题:数据库名称出现“可疑”字样 解决: 方法一: 重新还原数据库 方法二: 贴上语句:(DB_CS:你的数据库名) 第一步: ALTER DATABASE DB_CS SET EMERGENCY 第 ...

  6. maven 向私服部署jar

    1.有源码的情况下 首先需要在要deploy的项目pom中添加私服地址 <distributionManagement> <repository> <id>nexu ...

  7. docker 学习操作记录 4

    记录3 [BEGIN] // :: Connecting to ... Connection established. To escape to local shell, press Ctrl+Alt ...

  8. 关于Linux TCP "SACK PANIC" 远程拒绝服务漏洞的修复

    Linux 内核被曝存在TCP "SACK PANIC" 远程拒绝服务漏洞(漏洞编号:CVE-2019-11477,CVE-2019-11478,CVE-2019-11479),攻 ...

  9. AKKA HTTP 简单示例

    AKKA HTTP 简单示例 依赖包: compile("com.typesafe.akka:akka-http_2.13:10.1.8") compile("com.t ...

  10. 【LeetCode】缺失的第一个正数【原地HashMap】

    给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9,11 ...