1一个块IO的一生

从page cache到bio到request

当APP打开一个文件,内核为文件维护一个pagecache(磁盘的一个副本);

读写文件时如果page cache命中,只会读写内存不操作磁盘;没有命中,才操作磁盘。

在内核用file结构体表示,可见其包含一个inode结构体,一个地址空间;

相关的几个结构体在内核对应关系如下:

可见,当多个进程同时打开同一个文件时,不同的file结构体对应同一个inode和同一个地址空间,地址空间是由一颗radix
tree维护(即pagecache),读写文件时,查看对应内存页在page
cache中是否命中,若命中直接从内存空间读写;若不命中,申请一个内存页,从磁盘读入数据,挂到page
cache的radix tree中。

另外,page cache与磁盘的同步由地址空间操作函数readpage/writepage完成

对磁盘访问,有两种方法:

a.裸磁盘直接访问;

b.通过文件系统访问;

它们在内核page cached对应关系如下:

一个address_space对应一个inode。

free命令统计的buffer/cached,只是统计上的区别;

buffer=操作裸分区的地址空间+文件系统的元数据地址空间;

cached=文件系统的地址空间(page cached)缓存;

但是对同一个磁盘,裸磁盘和文件系统两种方式同时操作的时候,同一个数据块会被映射到不同的address_space,会产生同步的问题;

在用dd的时候,最好不要操作文件系统数据。

2 O_DIRECT和O_SYNC

直接操作裸磁盘分区用O_DIRECT,内核没有任何cache,直接操作磁盘;用户可以根据数据特点,在用户空间做cache。O_DIRECT申请内存要用posix_memalign接口;

而O_SYNC依然通过page cache,但是会立即写入同步磁盘;

App通过page cache访问文件和直接操作裸磁盘的模型,与CPU通过cache访问内存和DMA直接访问内存的模型非常类似;

这里page cache是内存,file是磁盘分区数据块;

当有一个进程启用O_DIRECT模式,其他进程最好也用O_DIRECT;

3 BIO 流程blktrace

对于一个pagecache地址空间,指向的是page页,文件系统ext4读取inode,将page转化为磁盘数据块,变成BIO请求;

BIO最终要转化成request,然后request被块设备驱动程序调用完成;

Bio经过三个队列变成request,三进三出

step1:原地蓄势

把bio转化为request,把request放入进程本进程的plug队列;蓄势多个request后,再进行泄洪。

可能合并相邻bio为一个request;

Bio数量>=request数量;

多个进程,泄洪request到电梯;

step2.电梯排序

进程本地的plug队列的request进入到电梯队列,进行再次的合并、排序,执行QoS的排队,之后按照QoS的结果,分发给dispatch队列。电梯内部的实现,可以有各种各样的队列。

比如两个进程需要读邻近的数据块,可以合并为一个request

电梯调度层可以做QoS,设定进程访问IO的优先级;

step3.分发执行dispatch

电梯分发的request,被设备驱动的request_fn()挨个取出来,派发真正的硬件读写命令到硬盘。这个分发的队列,一般就是我们在块设备驱动里面见到的request_queue了。request_queue完成真正的硬件操作;

工具ftrace

do.sh

#!/bin/bashdebugfs=/sys/kernel/debug
echo nop > $debugfs/tracing/current_tracer
echo 0 > $debugfs/tracing/tracing_on
echo `pidof read` > $debugfs/tracing/set_ftrace_pid
echo function_graph > $debugfs/tracing/current_tracer
echo vfs_read > $debugfs/tracing/set_graph_function
echo 1 > $debugfs/tracing/tracing_on

执行./read读文件

查看trace过程

sudo cat /sys/kernel/debug/tracing/trace > t.txt

用VIM查看t.txt,用.funcgrahp.vim插件打开可以合并/展开对应函数调用

vim -S ~/.funcgrahp.vim

4 IO调度算法,CFQ和ionice

查看当前系统的IO调度算法

(base) leon\@pc:/sys/block/sda/queue\$ cat schedulernoop deadline [cfq]

修改调度算法:

sudo echo cfg > scheduler

CFQ调度算法:类似进程调度的CFS算法

ionice –helpionice –c 2 –n 0 dd if=/dev/sda of=/dev/null &  //设置nice值=0ionice –c 2 –n 8 dd if=/dev/sda of=/dev/null &  //设置nice值=8

iotop查看IO读写速度,有明显差异

改成deadline策略

echo deadline > scheduler

此时尽管优先级不同,但两个进程IO速度相近了;

5 cgroup与IO

cd /sys/fs/cgroup/blkio

a.创建群组A,B

Mkdir A;makedir B

cat blkiolweight //默认是500

分别把两个进程放到A和B执行

cgexec -g blkio:A dd if=/dev/sda of=/dev/null iflag=direct &

cgexec -g blkio:B dd if=/dev/sda of=/dev/null iflag=direct &

查看io占用iotop

默认是相近

b.修改群权重

echo 50 > blkio.weight

两个进程优先级一样,但IO速度差别很大;

c.cgroup还可以控制阀门,限制最大读速度:

8:0磁盘的主次设备号

echo "8:0 1048576" > /sys/fs/cgroup/blkio/A/blkio.throttle.read_bps_device

带cache读写,这里的限速不起作用;direct方式才生效;

cgroup v2版本支持带cache限速

6 IO性能调试:iotop, iostat

blktrace跟踪硬盘的各个读写点

blktrace –d /dev/sda –o - |blkparse –I –

dd if=main.c of=t.txt oflag=syncdebugfs –R ‘ickeck xxxx’ /dev/sda1debugfs –R ‘nckeck inode’ /dev/sda1blkcat /dev/sda1 xxx

Linux内核之IO4:块I/O流程与I/O调度器相关推荐

  1. linux中流设备_[快速上手Linux设备驱动]之块设备驱动流程详解一

    [快速上手Linux设备驱动]之块设备驱动流程详解一 walfred已经在[快速上手Linux设备驱动]之我看字符设备驱动一 文中详细讲解了linux下字符设备驱动,并紧接着用四篇文章描述了Linux ...

  2. linux 内核协议栈 NAPI机制与处理流程分析(图解)

    目录 1 NAPI 机制 1.1 NAPI 缺陷 1.2 使用 NAPI 先决条件 1.3 非NAPI帧的接收 1.3.1 netif_rx - 将网卡中收到的数据包放到系统中的接收队列中 1.3.2 ...

  3. ARM64 Linux 内核页表的块映射

    作者 | 宋宝华  责编 | 张文 头图 | CSDN 下载自视觉中国 出品 | CSDN(ID:CSDNnews) 内核文档 Documentation/arm64/memory.rst 描述了 A ...

  4. Linux内核学习笔记十一——I/O层和I/O调度机制

    一 块I/O基本概念 字符设备:按照字符流的方式被有序访问的设备.如串口.键盘等. 块设备:系统中不能随机(不需要按顺序)访问固定大小的数据片(chunk 块)的设备. 如:硬盘.软盘.CD-ROM驱 ...

  5. Linux开机启动过程(14):start_kernel()->sched_init()调度器初始化

    Kernel initialization. Part 8. 在原文的基础上添加了5.10.13部分的源码解读. Scheduler initialization This is the eighth ...

  6. Linux调度器及CFS调度器

    Linux调度器及CFS调度器 调度器 调度器类sched_class结构体 进程的优先级 调度策略 CFS调度器 实际运行时间 虚拟运行时间 调度器结构分析 调度器 ​ 调度:就算按照某种调度的算法 ...

  7. linux内核技术文章

    Linux 引导过程内幕 从主引导记录到第一个用户空间应用程序的指导 引导 Linux® 系统的过程包括很多阶段.不管您是引导一个标准的 x86 桌面系统,还是引导一台嵌入式 的 PowerPC® 机 ...

  8. linux cookie 地址,SYN Cookie原理及其在Linux内核中的实现

    在目前以IPv4为支撑的网络协议上搭建的网络环境中,SYN Flood是一种非常危险而常见的DoS攻击方式.到目前为止,能够有效防范SYN Flood攻击的手段并不多,而SYN Cookie就是其中最 ...

  9. Linux内核系统架构介绍

    28年前(1991年8月26日)Linus公开Linux的代码,开启了一个伟大的时代.这篇文章从进程调度,内存管理,设备驱动,文件系统,网络等方面讲解Linux内核系统架构.Linux的系统架构是一个 ...

最新文章

  1. python中sample是什么意思_基于Python中random.sample()的替代方案
  2. python数据比例_#python# #数据分析# 性别比例分析
  3. android 页卡切换实现,TabLayout+ViewPager实现选项卡切换效果
  4. Tracer Druid 记录sql 以及参数
  5. C#中你想象的Task,很简单?
  6. 数据库系统内部体系结构与外部体系结构
  7. 【Elasticsearch】Lucene 8 新特性
  8. 理解WidowManager
  9. OpenGL超级宝典(第7版)笔记18 位移、旋转、缩放、观察、透视矩阵 代码实现
  10. 磁力计椭球拟合使用篇 IMU 加速度、电子罗盘校准
  11. 验证性因素分析AVE和CR值
  12. 丢掉上半年全球新能源汽车销冠的特斯拉,烦恼不止比亚迪
  13. 案例分析:从误删除数据库血案看数据库系统的安全设计
  14. Android 自定义字体
  15. linux 脚本录制软件,linux下运行脚本蜀门录制
  16. HTML学生个人网站作业设计:旅游景点网站设计——北京故宫(9页) HTML+CSS+JavaScript 简单DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
  17. 蓝本(blueprint)
  18. regulator linux,关于linux regulator dirver(1) fixed regulator:
  19. 精制糖行业采用树脂工艺进行脱色技术分析
  20. stm8s001 - SWIM复用为ADC输入 ADC电压值不准确?

热门文章

  1. Unity3d Ugui 15 TextMeshPro
  2. springboot萌宠宠物网店的开发与设计 毕业设计-附源码011042
  3. 关于万象跑步机游戏演示
  4. WBO第一届区块链高峰论坛新闻发布会盛大召开
  5. 2018首届传神者大会:“语言+新技术”将推动语言产业生态化发展
  6. TrueCrypt 6.2a原理及代码分析
  7. 小蚁正式发布双目VR全景相机,便宜、高像素只售2499元。
  8. 「工具推荐」2019最实用的10大免费工具,你值得拥有
  9. Docker pull unexpected EOF Retrying in 10 seconds
  10. mysql8 设置binlog过期时间