浅析 Linux 文件 IO 读写

Linux的文件IO子系统是Linux中最复杂的一个子系统(没有之一)。读者可以参考以下这个图:

https://www.thomas-krenn.com/de/wikiDE/images/2/2d/Linux-storage-stack-diagram_v4.0.pdf

Block Layer的运行调度模型

数据从 Page Cache 同步到磁盘上,发出的请求称为一个request,一个request包含一组 bio,每个bio包含要同步的数据pages,你要把Page和磁盘的数据进行同步。

和网络子系统不同,磁盘的调度是有要求的,不是说你发一个page,我就帮你写进去,你再发一个page,我就给你再写一个进去。你要写磁盘的一个地方,磁盘要先把磁头物理上移动到那个轨道上,然后才能写,你让磁头这样移来移去的,磁盘的性能就很难看了。

Linux的IO调度器称为evelator(电梯),因为Linus开始实现这个系统的时候,使用的就是电梯算法。

坐过电梯很容易理解什么是电梯算法,电梯的算法是:电梯总是从一个方向,把人送到有需要的最高的位置,然后反过来,把人送到有需要的最低一个位置。这样效率是最高的,因为电梯不用根据先后顺序,不断调整方向,走更多的冤枉路。

为了实现这个算法,我们需要一个plug的概念。这个概念类似马桶的冲水器,你先把冲水器用塞子堵住,然后开始接水,等水满了,你一次把塞子拔掉,冲水器中的水就一次冲出去了。在真正冲水之前,你就有机会把数据进行合并,排序,保证你的“电梯”可以从一头走到另一头,然后从另一头回来。

我们前面讲IO系统的时候就提过磁盘调度子系统的ftrace跟踪,这里我们深入看看blktrace跟踪到的事件的含义:

请求相关

Q - queued:bio请求进入调度
G - get request:分配request
I - inserted:request进入io调度器

调度相关

B - bounced:硬件无法访问内存,需要把内存降低到硬件可访问
M - back merge:请求和前一个从后面合并
F - front merge:请求和前一个从前面合并
X - split:请求分析为多个request(很可能是因为硬件不支持太大的请求)
A - remap:基于分区等,重新映射request的位置
R - requeue: Request重新回到调度队列
S - sleep:调度器进入休眠P - plug:调度队列插入设备(准备合并)
U - unplug:调度队列离开设备(全部一次写入设备中)
T - unplug due to timer超时,而不是数据足够发起的unplug

发出相关

C - complete:完成一个request的调度(无论成功还是失败)
D - issued:发送到设备,这个是从下层硬件驱动发起的

我们通过对这些事件的跟踪,对照硬件的特性大概就可以知道运行的模型是否正常了。

Block Layer 中的 IO Scheduler 三个调度算法:

  • noop,是 no operation,就是不调度的算法。有什么请求都直接写下去。这通常用于两种情形:你的磁盘是比如SSD那样的内存存储设备,根本不需要调度,往下写就对了。第二种情形是你的磁盘比较高级,自带调度器,OS不需要自作聪明,有什么请求直接往下扔就好了。这两种情况就应该选noop算法。

  • deadline,是一个改良的电梯算法,基本上和电梯算法一样,但加了一条,如果部分请求等太久了(deadline到了,默认读请求500ms,写请求5s),电梯就要立即给我掉头,先处理这个请求。

  • cfg,CPU调度器,完全公平调度器。这个算法按任务分成多个队列,按队列的“完全公平”进行调度。利用这个算法,可以通过ionice设定每个任务不同的优先级,提供给调度器进行分级调度。https://zhuanlan.zhihu.com/p/22604682

首先来看一下一般的IO调用。在传统的文件IO操作中,我们都是调用操作系统提供的底层标准IO系统调用函数 read()、write() ,此时调用此函数的进程(在JAVA中即java进程)由当前的用户态切换到内核态,然后OS的内核代码负责将相应的文件数据读取到内核的IO缓冲区,然后再把数据从内核IO缓冲区拷贝到进程的私有地址空间中去,这样便完成了一次IO操作。如下图所示:

注意两点:

  • OS的read函数会在内核IO缓冲区中预读取数据,减少磁盘IO操作。
  • Java的BufferedReader或BufferedInputStream的缓冲区的作用是减少系统调用。

http://www.taodudu.cc/news/show-5965347.html

相关文章:

  • 马桶堵塞所想到的
  • 用html制作一个华为页面,Web前端项目实战——华为荣耀商城(学完html+css就可以做)...
  • 高清音视频采集卡的混音功能(LCC380)
  • MS2131 USB 3.0 高清音视频采集+HDMI 环出+混音处理芯片
  • python合并音频和视频_ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
  • python合并音频和视频_ffmpeg+Python实现B站MP4格式音频与视频的合并
  • Symbian Series60上实现混音的办法
  • 短视频中解决音视频混音出现杂音的问题
  • c++实现16进制转为8进制
  • Python根据用户输入的2进制字符串转8进制
  • Python 直接读取 16进制 8进制 整数
  • 有趣的数据结构算法9——利用栈完成2进制到8进制的转换
  • 利用栈的基本操作,将一个十进制数转换成8进制数
  • 各进制之间的关联 --计数制de基本要素:基数和位权 (2进制,10进制,8进制,16进制)
  • 【python初级】10进制与2进制8进制16进制的转换
  • 八进制与十六进制的算法
  • Cesium是什么
  • JAVA基础 多线程
  • 数据、传感器、打车服务,哪个才是未来无人车制胜关键?
  • 一体教学电脑鸿蒙,华为P50曝光,超级一体屏+双6000万+鸿蒙OS,真香
  • photoshop cs6去掉人物双下巴
  • 计算机视觉入门-梯度、算子、Canny边缘检测、非极大值抑制、双门限法
  • 一个牛逼到惊掉你下巴的工具类 -- AndroidUtilCode
  • freemarker根据模板生成word,并插入图片
  • php 图片 mysql_php显示MySQL图片
  • 网游实名制今日实施 玩家对此意见不一
  • 《具身认知》听书笔记
  • HANA 与 Exalytics 的对比
  • 一段简短的自我告白
  • 色彩三刀流 如何调节颜色

浅析 Linux 文件 IO 读写相关推荐

  1. 查看linux服务器硬盘IO读写负载

    最近一台linux服务器出现异常,系统反映很慢,相应的应用程序也无法反映,而且还出现死机的情况,经过几天的观察了解,发现服务器压力很大,主要的压力来自硬盘的IO访问已经达到100% 为了方便各位和自己 ...

  2. Linux 文件 IO

    参考:http://blog.csdn.net/wanxiao009/article/details/5648583 C 和 C++ 文件操作详解:http://blog.csdn.net/freek ...

  3. 漫谈linux文件io,Linux文件IO与通用块层的请求合并

    本文参考https://mp.weixin.qq.com/s/Imt4BW-zoHPpcOpcKZs_AQ, 公众号"Linux阅码场" 请求合并就是将进程内或者进程间产生的在物理 ...

  4. 2.Linux文件IO编程

    2.1Linux文件IO概述 2.1.0POSIX规范 POSIX:(Portable Operating System Interface)可移植操作系统接口规范. 由IEEE制定,是为了提高UNI ...

  5. linux的每次IO大小控制,linux文件io缓冲

    linux文件io缓冲 出于速度和效率考虑,系统io调用(即内核)和标准 C语言库的io函数(即 stdin 函数)在操作磁盘文件时会对数据进行缓冲. read(),write()系统调用在操作磁盘文 ...

  6. Linux文件IO深入剖析

    文章目录 1 linux文件系统基本概念 1.1 文件系统基本概念 1.2 文件系统缓存 2 文件IO访问方式概述 2.1 标准文件IO 2.2 直接IO 2.3 缓存同步 1 linux文件系统基本 ...

  7. Linux文件IO(文件的读写)

    内容源于朱友鹏老师的课程笔记的学习整理,如有侵权,请告知删除. 一.linux中如何管理文件 (1)硬盘中的静态文件和iNode(i节点) 内容管理表 + 真正存储的内容: 内容管理表以文件为单位进行 ...

  8. linux服务器读写硬盘io,查看linux服务器硬盘IO读写负载

    今天一台Centos服务器出了问题,客户端访问非常慢,电影播放间歇性卡壳,web访问也是很慢.首先看了服务器的流量,然后从网上找了一些方法查看服务器的IO读写负载,记录下来分享: 1. 用top命令查 ...

  9. 漫谈linux文件IO

    在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用 ...

最新文章

  1. 使用Cacti监控你的网络Cacti的安装
  2. Transformer又出新变体∞-former:无限长期记忆,任意长度上下文
  3. linux c 判断路径是 目录还是文件
  4. TreeMap实现权重随机数Java
  5. Oracle SQL Developer中进行存储过程调试
  6. CM: webservice 元数据在word template中的存储
  7. Java数组,Wat!
  8. 何小鹏谈财务自由:痛苦彷徨,7块钱的快餐只能偷偷吃
  9. vSAN一次人肉工程师踩过的坑
  10. 电子换向电动机行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  11. 关于ipxe启动的几个疑问
  12. 【每日算法Day 73】学妹大半夜私聊我有空吗,然后竟然做出这种事!
  13. voyage java_Voyage:Java 实现的基于 Netty 的轻量、高性能分布式 RPC 服务框架
  14. 强力回击 跨境侵权(TRO)卖家通过诉讼大获全胜,还净赚数万?
  15. 专家议微软黑屏:目的正当 手段未必正当
  16. 苹果8.1系统无服务器,iOS9强制降级iOS8教程
  17. 【基于时间特征交互和引导细化的遥感变化检测 】2022TGRS
  18. 前端开箱即用的中后台管理模版,建议收藏
  19. Failed to install metadata com.weiwen.common:weiwen-common-core/maven-metadata.xml: Could not parse
  20. 计算机电源启动时序,控制电源启动及关断时序

热门文章

  1. 面试——王道408数据结构知识点总结
  2. 图像处理基础学习笔记——OpenCV已学API汇总
  3. 图形学基础|皮肤渲染
  4. 上海嘉定做网站,嘉定网站建设-品划网站怎么才能帮企赚钱?
  5. 菲涅尔公式实现边缘光效果
  6. 84. 柱状图中最大的矩形
  7. phpCMS后台getshell
  8. 双u服务器显示屏不亮,汽车显示屏不亮原因 汽车显示屏不亮怎么办
  9. 目前最全的支付宝O2O解决方案
  10. ELK日志分析监控平台