[转帖]Linux磁盘I/O(一):Cache,Buffer和sync

linux,磁盘,cache,buffer,sync · 浏览次数 : 0

小编点评

| 项 | Cache | Buffer | |---|---|---| | 使用方式 | 文件系统交互 | 磁盘交互 | | 读取数据 | 通过文件系统,由文件系统负责与磁盘交互 | 经过文件系统,由文件系统负责与磁盘交互 | | 写入数据 | 经过文件系统,由文件系统负责与磁盘交互 | 经过文件系统,由文件系统负责与磁盘交互 | | 同步I/O | 延迟写 | 立即写 | | 文件内容更新速度 | 降低 | 提高 | | sync(1)的作用 | 同步Cache写入到磁盘 | 同步所有修改过的块缓冲区写入磁盘 | | sync(2)的作用 | 同步Cache写入到磁盘 | 同步所有修改过的块缓冲区写入磁盘 | | 同步I/O的规定 | sync() 仅排入输出队列 | sync(2) 函数等待实际写磁盘操作结束才返回 |

正文

CacheBuffer的区别

磁盘是一个块设备,可以划分为不同的分区;在分区之上再创建文件系统,挂载到某个目录,之后才可以在这个目录中读写文件。Linux 中“一切皆文件”,我们平时查看的“文件”是普通文件,磁盘是块设备文件,我们可以通过执行 “ls -l <路径>” 查看它们的区别:

$ ls -l /bin/pwd 
-rwxr-xr-x 1 root root 31472 3月   3  2017 /bin/pwd
$ ls -l /dev/sda1
brw-rw---- 1 root disk 8, 1 5月  28 14:04 /dev/sda1

    第一个符号是“-”表示普通文件,“b”表示块设备文件。在读写普通文件时,会经过文件系统,由文件系统负责与磁盘交互,使用的缓存是Cache(也就是Page Cache);而读写磁盘或者分区时,就会跳过文件系统,也就是所谓的“裸I/O“,使用的缓存是Buffer(也就是Block Buffer)。

    同步I/Osync函数和命令

    当将数据写入普通文件时,Linux内核通常先将该数据复制到其中一个Cache中,如果该Cache尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该Cache以便存放其他磁盘块数据时,再将该Cache排入输出队列,然后待其到达队首时,才进行实际的I/O操作。这种输出方式被称为延迟写(delayed write)。
    延迟写减少了磁盘读写次数,但是却降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间内并没有写到磁盘上。当系统发生故障时,这种延迟可能造成文件更新内容的丢失。为了保证磁盘上实际文件系统与Cache内容的一致性,Linux系统提供了sync(2)函数。通常称为update的系统守护进程会周期性地(一般每隔30秒)调用sync函数。这就保证了定期冲洗内核的块缓冲区。命令sync(1)也调用sync(2)函数。我们通过man命令来查看下sync(1)命令:

    $ man 1 sync
    NAME
           sync - Synchronize cached writes to persistent storage
    

      sync(1)命令的作用是同步Cache写入到磁盘,接下来我们来查看下改命令调用的sync(2)函数:

      $ man 2 sync
      NAME
             sync, syncfs - commit buffer cache to disk
      BUGS
             According  to the standard specification (e.g., POSIX.1-2001), sync() schedules the writes, but may return before the actual writing is done.  However, since version 1.3.20 Linux does actually wait.  (This still does not guarantee data integrity: modern disks have large caches.)
      

        sync(2)函数当然也是同步Cache写入到磁盘。不过我们可以看到POSIX.1-2001规定该函数只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束。但是在最新的Linux中,该函数需要等待实际写磁盘操作结束才返回。通常我们往U盘拷贝大文件后,可以通过如下命令查看数据同步到U盘的过程:

        $ sync &
        $ watch -d grep -e Dirty: /proc/meminfo
        

          一开始Dirty数字会很​​大,接下来我们看到在sync(1)完成的同时接近0。

          文章知识点与官方知识档案匹配,可进一步学习相关知识
          CS入门技能树Linux入门初识Linux31175 人正在系统学习中

          与[转帖]Linux磁盘I/O(一):Cache,Buffer和sync相似的内容:

          [转帖]Linux磁盘I/O(一):Cache,Buffer和sync

          Cache和Buffer的区别 磁盘是一个块设备,可以划分为不同的分区;在分区之上再创建文件系统,挂载到某个目录,之后才可以在这个目录中读写文件。Linux 中“一切皆文件”,我们平时查看的“文件”是普通文件,磁盘是块设备文件,我们可以通过执行 “ls -l <路径>” 查看它们的区别: $ ls

          [转帖]Linux 性能优化和内核观测 - 文件系统与磁盘I/O篇(一)

          文件系统索引节点和目录项为了方便管理,Linux 文件系统为每个文件都分配了两个数据结构,即​​索引节点(index node)​​​和​​目录项(directory entry)​​。它们主要用来记录文件的元信息和目录结构。索引节点(简称 inode):用于记录文件的元数据,比如 inode 编号

          [转帖]Linux查看硬件信息超强命令sar,以及可视化工具ksar

          https://juejin.cn/post/6947470401135968286 一、概述 sar(System Activity Reporter,系统活动情况报告)是Linux下系统运行状态统计工具,可从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU

          [转帖]linux性能检测之sar详解

          http://blog.51niux.com/?id=99 sar也是sysstat中的一员。 一、介绍 1.1 简介 sar是一个优秀的一般性能监视工具,它可以输出Linux所完成的几乎所有工作的数据。sar命令在sysetat rpm中提供。 sar可以显示CPU、运行队列、磁盘I/O、分页(交

          [转帖]《Linux性能优化实战》笔记(十五)—— 磁盘IO的工作原理

          前一篇介绍了文件系统的工作原理,这一篇来看看磁盘IO的工作原理 一、 磁盘 1. 按存储介质分类 磁盘是可以持久化存储的设备,根据存储介质的不同,常见磁盘可以分为两类:机械磁盘和固态磁盘。 机械磁盘,也称为硬盘驱动器(Hard Disk Driver,HDD),主要由盘片和读写磁头组成,数据存储在盘

          【转帖】Linux性能优化(一)——stress压力测试工具

          https://blog.csdn.net/a642960662/category_11641226.html 一、stress简介 1、stress简介 stress是Linux的一个压力测试工具,可以对CPU、Memory、IO、磁盘进行压力测试。 2、stress安装 安装: sudo yum

          [转帖]Linux 磁盘I/O 调度算法 说明

          2022-08-23 13:031361转载Linux 1 Linux 4.0 IO协议栈框架图 I/O 调度算法在各个进程竞争磁盘I/O的时候担当了裁判的角色。他要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体I/O性能。 Linux 4.0 IO协议栈框架图 I/O调度程序的总结 当向

          [转帖]Linux磁盘I/O(二):使用vm.dirty_ratio和vm.dirty_background_ratio优化磁盘性能

          文件缓存是一项重要的性能改进,在大多数情况下,读缓存在绝大多数情况下是有益无害的(程序可以直接从RAM中读取数据)。写缓存比较复杂,Linux内核将磁盘写入缓存,过段时间再异步将它们刷新到磁盘。这对加速磁盘I/O有很好的效果,但是当数据未写入磁盘时,丢失数据的可能性会增加。 当然,也存在缓存被写爆的

          [转帖]「Linux性能调优」磁盘I/O队列调度策略

          https://zhuanlan.zhihu.com/p/450329513 傻瓜化说明 简单地说,对于磁盘I/O,Linux提供了cfq, deadline和noop三种调度策略 cfq: 这个名字是Complete Fairness Queueing的缩写,它是一个复杂的调度策略,按进程创建多个

          [转帖]如何监测 Linux 的磁盘 I/O 性能

          https://bbs.huaweicloud.com/blogs/379242 在我之前的文章:《探讨 Linux 的磁盘 I/O》中,我谈到了 Linux 磁盘 I/O 的工作原理,我们了解到 Linux 存储系统 I/O 栈由文件系统层(file system layer)、通用块层( gen