如何进行Linux设备IO研究与数据库性能调优

62次阅读
没有评论

共计 2573 个字符,预计需要花费 7 分钟才能阅读完成。

本篇文章给大家分享的是有关如何进行 Linux 设备 IO 研究与数据库性能调优,丸趣 TV 小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着丸趣 TV 小编一起来看看吧。

如何在 Linux 系统里对数据库及设备 IO 库进行调优?

数据库系统是基于文件系统的,其性能和设备读写的机制有密切的关系。和数据库性能密切相关的文件 I / O 操作的三个操作:

open  打开文件

write  写文件

fdatasync   flush 操作(将文件缓存刷到磁盘上)。

一、Open 操作

open(test.file ,O_WRONLY|O_APPDENT|O_SYNC))

系统调用 Open 会为该进程一个文件描述符 fd。这里使用了 O_WRONLY|O_APPDENT|O_SYNC 打开文件:

1. O_WRONLY 表示我们以 写 的方式打开,告诉内核我们需要向文件中写入数据;

2. O_APPDENT 告诉内核以 追加 的方式写文件;

3. O_DSYNC 告诉内核,当向文件写入数据的时候,只有当数据写到了磁盘时,写入操作才算完成(write 才返回成功)。

4. 和 O_DSYNC 同类的文件标志,还有 O_SYNC,O_RSYNC,O_DIRECT。

(1) O_SYNC 比 O_DSYNC 更严格,不仅要求数据已经写到了磁盘,而且对应的数据文件的属性(例如文件长度等)也需要更新完成才算 write 操作成功。可见 O_SYNC 较之 O_DSYNC 要多做一些操作。

(2) O_RSYNC 表示文件读取时,该文件的 OS cache 必须已经全部 flush 到磁盘了;

(3)  如果使用 O_DIRECT 打开文件,则读 / 写操作都会跳过 OS cache,直接在 device(disk)上读 / 写。因为没有了 OS cache,所以会 O_DIRECT 降低文件的顺序读写的效率。

二、Write 操作

write(fd,buf,6)

在使用 open 打开文件获得文件描述符之后,我们就可以调用 write 函数来写入数据了,write 会根据前面的 open 参数不同,而表现不同。

三、Flush 阶段

fdatasync(fd) == -1

write 操作后,我们还调用了 fdatasync 来确保文件数据 flush 到了 disk 上。fdatasync 返回成功后,那么可以认为数据已经写到了磁盘上。像这样的 flush 的函数还有 fsync、sync。

1. Fsync 和 fdatasync 的区别等同于 O_SYNC 和 O_DSYNC 的区别。

2. Sync 函数表示将文件在 OS cache 中的数据排入写队列,并不确认是否真的写磁盘了,所以 sync 并不可以靠。

忽略文件打开的过程,通常我们会说“写文件”有两个阶段,一个是调用 write 我们称为写数据阶段(其实是受 open 的参数影响),调用 fsync(或者 fdatasync)我们称为 flush 阶段。Linux 上的块设备的操作可以分为两类:

*** 类是使用 C 标准库中的 fopen/fread/fwrite 系列的函数,我们可以称其为 buffered I/O。

具体的 I /O path 如下:

Application - Library Buffer - Operation System Cache - File System/Volume Manager - Device

library buffer 是标准库提供的用户空间的 buffer,可以通过 setvbuf 改变其大小。

第二类是使用 Linux 的系统调用的 open/read/write 系列的函数,我们可以称其为 non-buffered I/O。

Application -  Operation System Cache  - File System/Volume Manager - Device

此外,我们可以通过设置 open 的 O_DIRECT 标志来实现 Direct I/O(或者叫 Raw I/O), 即绕过 OS Cache, 直接读取 Device (that s what we want^o^), 等于将 OS cache 换成自己管理的 cache。不过,Linus 在邮件列表中建议不这么做,而是使用 posix_fadvice, madvice。中表明 Direct I/ O 比 buffered I/ O 的性能高很多。

在 MySQL 中,参数 Innodb_flush_method(Linux) 可以设定为:Fdatasync、O_DSYNC、O_DIRECT。我们看看这个三个参数是如何影响程序 MySQL 对日志和数据文件的操作:

Open logFlush logOpen datafileFlush dataFdatasync
fsync()
fsync()O_DSYNCO_SYNC
 
 fsync()O_DIRECT
 fsync()O_DIRECT Fsync()

fdatasync 被认为是安全的,因为在 MySQL 总会调用 fsync 来 flush 数据。使用 O_DSYNC 是有些风险的,有些 OS 会忽略该参数 O_SYNC。

我们看到 O_DIRECT 和 fdatasync 和很类似,但是它会使用 O_DIRECT 来打开数据文件。有数据表明,如果是大量随机写入操作,O_DIRECT 会提升效率。但是顺序写入和读取效率都会降低。所以使用 O_DIRECT 需要谨慎。

mysql  innodb 对应相关参数:

innodb_flush_method 有三个值,分别是 fdatasync,O_DSYNC 和 O_DIRECT,其中 fdatasync 是默认值。

它们控制了 InnoDB 刷新日志和数据的模式。

fdatasync:InnoDB 使用 fsync() 函数去更新日志和数据文件。

O_DSYNC:InnoDB 使用 O_SYNC 模式打开并更新日志文件,用 fsync() 函数去更新数据文件。

O_DIRECT:InnoDB 使用 O_DIRECT 模式打开数据文件,用 fsync() 函数去更新日志和数据文件。

我们看到 O_DIRECT 和 fdatasync 和很类似,但是它会使用 O_DIRECT 来打开数据文件。有数据表明,如果是大量随机写入操作,O_DIRECT 会提升效率。但是顺序写入和读取效率都会降低。所以使用 O_DIRECT 需要谨慎。

以上就是如何进行 Linux 设备 IO 研究与数据库性能调优,丸趣 TV 小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-04发表,共计2573字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)