Block层也是有IO的优先级的
---恢复内容开始---
今天查看iotop的原理,竟然发现了IO优先级一说,IO是block层cfs调度器中的概念
block层也有一个类似于CPU的调度算法
对进程分成三个级别:RT,BE,IDLE
其中,RT就是最高优先级的调度,类似与CPU调度中的RT调度,当有RT进程在的时候,其他的进程不会享受到磁盘的带宽;
BE:相当于CPU中的cfs调度器,可以保证公平高效地让进程共享IO资源;
IDLE:就是CPU中的最高一级的调度器了,当没有RT和BE的进程在的时候,才会让IDLE策略的进程去使用IO资源;
//-------------
通用块层和电梯调度层的区别【】
目前内核中的算法叫做CFQ,试图为所有进程提供一个完全公平的调度环境,以此保证每个进程的IO资源的占用是公平的,同时也设计了进程级别的优先级调度,在这里我们只需要知道,时间片分好了,优先级调好了,block层肯定能给所有的进程一个公平的IO资源占用(实现进程级别的IO资源按照权重分配)。
blkio中的cgroup资源的划分就是在cfq的基础上做的。所以如果想要使用权重比例分配,应该先确认对应的磁盘使用的是cfq调度算法.
cfq是比较好的IO调度算法,对桌面用户也是比较好的选择。但是对于很多IO压力较大的场景就并不是很适用,尤其在IO压力集中在某些进程上的场景。因为这些场景我们需要满足某几个进程的执行速度,而不是让全部进程公平想用IO的带宽。
deadline更适应这样的场景的解决方案。deadline有四个通用的
//-----------
调度器:
block层可
在哪里更新iops的值
blk_throtl_bio
generic_make_request_check --> blkcg_bio_issue_check --> blk_throtl_bio
在哪里更新IO信息?add_acct_request
blk_queue_bio --> add_acct_request 【IO经过层层检查并且已经进入了某个等待队列】
各种方法各有利弊,cfq是一种比较通用的调度算法,是一种以进程为出发点考虑的算法,以尽量保证大家的公平。deadline只有当IO请求达到一定期限的时候才进行调度,因此非常适合业务比较单一且IO压力比较重的业务。
当然,IO贮存是以分区为单位,还是以磁盘为单位呢?
---恢复内容结束---
今天查看iotop的原理,竟然发现了IO优先级一说,IO是block层cfs调度器中的概念
block层也有一个类似于CPU的调度算法
对进程分成三个级别:RT,BE,IDLE
其中,RT就是最高优先级的调度,类似与CPU调度中的RT调度,当有RT进程在的时候,其他的进程不会享受到磁盘的带宽;
BE:相当于CPU中的cfs调度器,可以保证公平高效地让进程共享IO资源;
IDLE:就是CPU中的最高一级的调度器了,当没有RT和BE的进程在的时候,才会让IDLE策略的进程去使用IO资源;
//-------------
通用块层和电梯调度层的区别【】
目前内核中的算法叫做CFQ,试图为所有进程提供一个完全公平的调度环境,以此保证每个进程的IO资源的占用是公平的,同时也设计了进程级别的优先级调度,在这里我们只需要知道,时间片分好了,优先级调好了,block层肯定能给所有的进程一个公平的IO资源占用(实现进程级别的IO资源按照权重分配)。
blkio中的cgroup资源的划分就是在cfq的基础上做的。所以如果想要使用权重比例分配,应该先确认对应的磁盘使用的是cfq调度算法.
cfq是比较好的IO调度算法,对桌面用户也是比较好的选择。但是对于很多IO压力较大的场景就并不是很适用,尤其在IO压力集中在某些进程上的场景。因为这些场景我们需要满足某几个进程的执行速度,而不是让全部进程公平想用IO的带宽。
deadline更适应这样的场景的解决方案。deadline有四个通用的
//-----------
调度器:
block层可
在哪里更新iops的值
blk_throtl_bio
generic_make_request_check --> blkcg_bio_issue_check --> blk_throtl_bio
在哪里更新IO信息?add_acct_request
blk_queue_bio --> add_acct_request 【IO经过层层检查并且已经进入了某个等待队列】
各种方法各有利弊,cfq是一种比较通用的调度算法,是一种以进程为出发点考虑的算法,以尽量保证大家的公平。deadline只有当IO请求达到一定期限的时候才进行调度,因此非常适合业务比较单一且IO压力比较重的业务。
当然,IO贮存是以分区为单位,还是以磁盘为单位呢?
---恢复内容开始---
今天查看iotop的原理,竟然发现了IO优先级一说,IO是block层cfs调度器中的概念
block层也有一个类似于CPU的调度算法
对进程分成三个级别:RT,BE,IDLE
其中,RT就是最高优先级的调度,类似与CPU调度中的RT调度,当有RT进程在的时候,其他的进程不会享受到磁盘的带宽;
BE:相当于CPU中的cfs调度器,可以保证公平高效地让进程共享IO资源;
IDLE:就是CPU中的最高一级的调度器了,当没有RT和BE的进程在的时候,才会让IDLE策略的进程去使用IO资源;
//-------------
通用块层和电梯调度层的区别【】
目前内核中的算法叫做CFQ,试图为所有进程提供一个完全公平的调度环境,以此保证每个进程的IO资源的占用是公平的,同时也设计了进程级别的优先级调度,在这里我们只需要知道,时间片分好了,优先级调好了,block层肯定能给所有的进程一个公平的IO资源占用(实现进程级别的IO资源按照权重分配)。
blkio中的cgroup资源的划分就是在cfq的基础上做的。所以如果想要使用权重比例分配,应该先确认对应的磁盘使用的是cfq调度算法.
cfq是比较好的IO调度算法,对桌面用户也是比较好的选择。但是对于很多IO压力较大的场景就并不是很适用,尤其在IO压力集中在某些进程上的场景。因为这些场景我们需要满足某几个进程的执行速度,而不是让全部进程公平想用IO的带宽。
deadline更适应这样的场景的解决方案。deadline有四个通用的
//-----------
调度器:
block层可
在哪里更新iops的值
blk_throtl_bio
generic_make_request_check --> blkcg_bio_issue_check --> blk_throtl_bio
在哪里更新IO信息?add_acct_request
blk_queue_bio --> add_acct_request 【IO经过层层检查并且已经进入了某个等待队列】
各种方法各有利弊,cfq是一种比较通用的调度算法,是一种以进程为出发点考虑的算法,以尽量保证大家的公平。deadline只有当IO请求达到一定期限的时候才进行调度,因此非常适合业务比较单一且IO压力比较重的业务。
当然,IO贮存是以分区为单位,还是以磁盘为单位呢?
---恢复内容结束---
今天查看iotop的原理,竟然发现了IO优先级一说,IO是block层cfs调度器中的概念
block层也有一个类似于CPU的调度算法
对进程分成三个级别:RT,BE,IDLE
其中,RT就是最高优先级的调度,类似与CPU调度中的RT调度,当有RT进程在的时候,其他的进程不会享受到磁盘的带宽;
BE:相当于CPU中的cfs调度器,可以保证公平高效地让进程共享IO资源;
IDLE:就是CPU中的最高一级的调度器了,当没有RT和BE的进程在的时候,才会让IDLE策略的进程去使用IO资源;
//-------------
通用块层和电梯调度层的区别【】
目前内核中的算法叫做CFQ,试图为所有进程提供一个完全公平的调度环境,以此保证每个进程的IO资源的占用是公平的,同时也设计了进程级别的优先级调度,在这里我们只需要知道,时间片分好了,优先级调好了,block层肯定能给所有的进程一个公平的IO资源占用(实现进程级别的IO资源按照权重分配)。
blkio中的cgroup资源的划分就是在cfq的基础上做的。所以如果想要使用权重比例分配,应该先确认对应的磁盘使用的是cfq调度算法.
cfq是比较好的IO调度算法,对桌面用户也是比较好的选择。但是对于很多IO压力较大的场景就并不是很适用,尤其在IO压力集中在某些进程上的场景。因为这些场景我们需要满足某几个进程的执行速度,而不是让全部进程公平想用IO的带宽。
deadline更适应这样的场景的解决方案。deadline有四个通用的
//-----------
调度器:
block层可
在哪里更新iops的值
blk_throtl_bio
generic_make_request_check --> blkcg_bio_issue_check --> blk_throtl_bio
在哪里更新IO信息?add_acct_request
blk_queue_bio --> add_acct_request 【IO经过层层检查并且已经进入了某个等待队列】
各种方法各有利弊,cfq是一种比较通用的调度算法,是一种以进程为出发点考虑的算法,以尽量保证大家的公平。deadline只有当IO请求达到一定期限的时候才进行调度,因此非常适合业务比较单一且IO压力比较重的业务。
当然,IO贮存是以分区为单位,还是以磁盘为单位呢?
///-------->
内核
每次同步的读操作都会触发这样的操作,在这个读操作中会触发:__blk_run_queue_uncond,干哈子啊这是,也就是说我一个读的操作,要刷回目前device等待队列里的所有的IO!天啊,如果系统中此时有等待的IO,那么这个时候要刷回系统中所有的IO?
【突然有个想法:其实对于block来说,每个进程都是同步!无论是同步读,调用sync/directIO,还是kworker异步的进程,都是一个进程带着IO进入设备的等待队列,对于上面这些线程来说,都是同步的】
#0 scsi_dispatch_cmd (cmd=0xffff88007d351380) at drivers/scsi/scsi_lib.c:1578
#1 0xffffffff814ba3ae in scsi_request_fn (q=0xffff88007c4d0000) at drivers/scsi/scsi_lib.c:1769
#2 0xffffffff813521a3 in __blk_run_queue_uncond (q=<optimized out>) at block/blk-core.c:325
#3 __blk_run_queue (q=0xffff88007c4d0000) at block/blk-core.c:343
#4 0xffffffff81356738 in blk_queue_bio (q=0xffff88007c4d0000, bio=0xffff88007c4dfb00) at block/blk-core.c:1799
#5 0xffffffff81354900 in generic_make_request (bio=0xffff88007c4dfb00) at block/blk-core.c:2062
#6 0xffffffff81354a1e in submit_bio (bio=0xffff88007d351380) at block/blk-core.c:2122
#7 0xffffffff811b35e4 in submit_bh_wbc (op=<optimized out>, op_flags=2087354696, bh=0xffff88007d351380, bio_flags=18446612134400221448,
wbc=<optimized out>) at fs/buffer.c:3101
#8 0xffffffff811b4115 in submit_bh (bh=<optimized out>, op_flags=<optimized out>, op=<optimized out>) at fs/buffer.c:3114
#9 ll_rw_block (op=0, op_flags=48, nr=<optimized out>, bhs=<optimized out>) at fs/buffer.c:3164
#10 0xffffffff811fd5f8 in ext4_bread (handle=<optimized out>, inode=<optimized out>, block=<optimized out>, map_flags=<optimized out>)
at fs/ext4/inode.c:998
#11 0xffffffff81206834 in __ext4_read_dirblock (inode=0xffff88007c14f120, block=0, type=DIRENT, func=<optimized out>, line=960)
at fs/ext4/namei.c:99
#12 0xffffffff81207177 in htree_dirblock_to_tree (dir_file=<optimized out>, dir=0xffff88007c14f120, block=<optimized out>,
hinfo=0xffffc9000025bd90, start_hash=<optimized out>, start_minor_hash=<optimized out>) at fs/ext4/namei.c:960
#13 0xffffffff81207f86 in ext4_htree_fill_tree (dir_file=0xffff88007d351380, start_hash=2087354696, start_minor_hash=<optimized out>,
next_hash=<optimized out>) at fs/ext4/namei.c:1079
#14 0xffffffff811f5e40 in ext4_dx_readdir (ctx=<optimized out>, file=<optimized out>) at fs/ext4/dir.c:574
#15 ext4_readdir (file=0xffff88007c4df900, ctx=0xffffc9000025bef0) at fs/ext4/dir.c:121
#16 0xffffffff81192339 in iterate_dir (file=0xffff88007c4df900, ctx=0xffffc9000025bef0) at fs/readdir.c:50
#17 0xffffffff811927c8 in SYSC_getdents (count=<optimized out>, dirent=<optimized out>, fd=<optimized out>) at fs/readdir.c:230
#18 SyS_getdents (fd=<optimized out>, dirent=<optimized out>, count=32768) at fs/readdir.c:211
#19 0xffffffff8186bd60 in entry_SYSCALL_64 () at arch/x86/entry/entry_64.S:209
#20 0x00007f9cc87a4698 in ?? ()
什么情况下已经合并到电梯里面了,但是却并没有下发,竟然给了合并的机会。感觉都是直接下发去了. plug只是很少的情况吧:
[昨晚睡觉之前想出来的答案:非plugin的进程,每个进程来了之后,就是会直接通过run_blk_queue下去刷自己的包,在函数blk_peek_request中取request去下发,但是这个时候scsi的处理速度也不是一定,所以会有大量的包在堆积在电梯中的情况,因为去取包的时候是加锁的吗?接着朝下看]
spin_unlock_irq(q->queue_lock);
上面这个锁用的太恶心了,因为散落在各处的 lock VS unlock ,也就是说在进程A去刷自己的东西的时候,进程B也可能去刷掉,进程C也有可能把自己的一个bio插入到某一个队列中去,好了,那现在进程可以排队这个没有疑问了,那么新的疑问是:我进程A是一个读的进程,那么我通过__run_blk_queue方法进入到这个函数中去了,然后这个函数是一个循环,他要刷掉所有的要等待的IO才算数,我去,真的是这个样子吗?并且这样也不合理呀,我只要保证我的读下去了不就行了,为什么要保证别的读,甚至是别的写的IO要下去呀,
Block层也是有IO的优先级的的更多相关文章
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #13 使用Block I/O控制器设置I/O优先级
HACK #13 使用Block I/O控制器设置I/O优先级 本节介绍使用Block I/O控制器的功能设置I/O优先级的方法.Block I/O控制器可以将任意进程分组,并对该分组设置I/O的优先 ...
- BLOCK层基本概念:bio,request,request_queue
Summary bio 代表一个IO 请求 request 是bio 提交给IO调度器产生的数据,一个request 中放着顺序排列的bio 当设备提交bio 给IO调度器时,IO调度器可能会插入bi ...
- 限制容器的 Block IO - 每天5分钟玩转 Docker 容器技术(29)
前面学习了如何限制容器对内存和CPU的使用,本节我们来看 Block IO. Block IO 是另一种可以限制容器使用的资源.Block IO 指的是磁盘的读写,docker 可通过设置权重.限制 ...
- 第 4 章 容器 - 029 - 限制容器的 Block IO
限制容器的 Block IO Block IO 是另一种可以限制容器使用的资源. Block IO 指的是磁盘的读写,docker 可通过设置权重.限制 bps 和 iops 的方式控制容器读写磁盘的 ...
- 27-限制容器的 Block IO
Block IO 是另一种可以限制容器使用的资源.Block IO 指的是磁盘的读写,docker 可通过设置权重.限制 bps 和 iops 的方式控制容器读写磁盘的带宽,下面分别讨论. 注:目前 ...
- Linux文件IO与通用块层的请求合并
本文参考https://mp.weixin.qq.com/s/Imt4BW-zoHPpcOpcKZs_AQ, 公众号“Linux阅码场” 请求合并就是将进程内或者进程间产生的在物理地址上连续的多个IO ...
- 转 Linux 性能优化之 IO 子系统
本文介绍了对 Linux IO 子系统性能进行优化时需要考虑的因素,以及一些 IO 性能检测工具. 本文的大部分内容来自 IBM Redbook - Linux Performance and Tun ...
- Linux 性能优化之 IO 子系统
本文介绍了对 Linux IO 子系统性能进行优化时需要考虑的因素,以及一些 IO 性能检测工具. 本文的大部分内容来自 IBM Redbook - Linux Performance and Tun ...
- Linux 性能优化之 IO 子系统 系列 图
http://blog.sina.com.cn/s/articlelist_1029388674_11_1.html Linux 性能优化之 IO 子系统(一) 本文介绍了对 Linux IO 子系统 ...
随机推荐
- Siamese Network
摘抄自caffe github的issue697 Siamese nets are supervised models for metric learning [1]. [1] S. Chopra, ...
- CSS-DOM
在所有的产品设计中,选择最适用的工具去解决问题是最基本的原则. ①使用(X)HTML去搭建文档的结构. ②使用CSS 去设置文档的呈现效果. ③使用DOM脚本去实现文档的行为. 文档中的每个元素都是一 ...
- 永久免费开源的卫星地形图地图下载工具更新Somap2.13版本功能更新 更新时间2019年2月22日13:59:05
一.下载地址 最新版本下载地址:SoMap2.13点击此处下载 二.系统自主开发特色功能展示 1.上百种地图随意下载 高德.百度.arcgis.谷歌.bing.海图.腾讯.Openstreet.天地 ...
- chisel(安装)
github地址 先安装homeBrew ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/m ...
- this以及执行上下文概念的重新认识
在理解this的绑定过程之前,必须要先明白调用位置,调用位置指的是函数在代码中被调用的位置,而不是声明所在的位置. (ES6的箭头函数不在该范围内,它的this在声明时已经绑定了,而不是取决于调用时. ...
- BFS算法入门--POJ3984
迷宫问题–POJ3984 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22008 Accepted: 12848 Descri ...
- Element-ui组件--pagination分页
一般写后台系统都会有很多的列表,有列表就相应的要用到分页,根据项目中写的几个分页写一下我对分页的理解,就当是学习笔记了. 这是Element-ui提供的完整的例子 <template> ...
- c#字符显示转换{0:d} string.Format()
这一篇实际和前几个月写的没什么本质上的区别.但是这篇更明确一点,学起来easy c#字符显示转换{0:d} C#:String.Format数字格式化输出 : int a = 12345678; // ...
- 【转载】VS2015 + EF6连接MYSQL5.6
引用文章:https://jingyan.baidu.com/article/ce09321b9cc43f2bff858fbf.html 安装包注意点说明: 1.程序名称:mysql-for-visu ...
- ECSHOP快递物流单号查询插件
本ECSHOP快递物流单号跟踪插件提供国内外近2000家快递物流订单单号查询服务例如申通快递.顺丰快递.圆通快递.EMS快递.汇通快递.宅急送快递.德邦物流.百世快递.汇通快递.中通快递.天天快递等知 ...