如何提高Linux下块设备IO的整体性能?
《如何提高Linux下块设备IO的整体性能?》要点: 作者介绍 邹立巍
小编的话
据说仅有50%的人能坚持看完本文. 您仔细阅读了多少,学到了什么?欢迎参与文末投票 前言:本文主要讲解Linux IO调度层的三种模式:cfp、deadline和noop,并给出各自的优化和适用场景建议. IO调度发生在Linux内核的IO调度层.这个层次是针对Linux的整体IO层次体系来说的.从read()或者write()系统调用的角度来说,Linux整体IO体系可以分为七层,它们分别是:
有一个已经整理好的[Linux IO结构图],非常经典,一图胜千言: 我们今天要研究的内容主要在IO调度这一层. 它要解决的核心问题是,如何提高块设备IO的整体性能?这一层也主要是针对机械硬盘结构而设计的. 众所周知,机械硬盘的存储介质是磁盘,磁头在盘片上移动进行磁道寻址,行为类似播放一张唱片. 这种结构的特点是,顺序访问时吞吐量较高,但是如果一旦对盘片有随机访问,那么大量的时间都会浪费在磁头的移动上,这时候就会导致每次IO的响应时间变长,极大的降低IO的响应速度. 磁头在盘片上寻道的操作,类似电梯调度,实际上在最开始的时期,Linux把这个算法命名为Linux电梯算法,即:
这就是我们为什么要设计IO调度算法的原因. 目前在内核中默认开启了三种算法/模式:noop,cfq和deadline.严格算应该是两种:
目前内核中默认的调度算法应该是cfq,叫做完全公平队列调度.这个调度算法人如其名,它试图给所有进程提供一个完全公平的IO操作环境.
cfq为每个进程创建一个同步IO调度队列,并默认以时间片和请求数限定的方式分配IO资源,以此保证每个进程的IO资源占用是公平的,cfq还实现了针对进程级别的优先级调度,这个我们后面会详细解释. 查看和修改IO调度算法的方法是: cfq是通用服务器比较好的IO调度算法选择,对桌面用户也是比较好的选择. 但是对于很多IO压力较大的场景就并不是很适应,尤其是IO压力集中在某些进程上的场景.
deadline调度(最终期限调度)就是更适合上述场景的解决方案.deadline实现了四个队列:
不久前,内核还是默认标配四种算法,还有一种叫做as的算法(Anticipatory scheduler),预测调度算法.一个高大上的名字,搞得我一度认为Linux内核都会算命了. 结果发现,无非是在基于deadline算法做io调度的之前等一小会时间,如果这段时间内有可以合并的io请求到来,就可以合并处理,提高deadline调度的在顺序读写情况下的数据吞吐量.
但是在大多数场景下,这个调度不仅没有提高吞吐量,还降低了响应速度,所以内核干脆把它从默认配置里删除了.毕竟Linux的宗旨是实用,而我们也就不再这个调度算法上多费口舌了. 1、cfq:完全公平队列调度cfq是内核默认选择的IO调度队列,它在桌面应用场景以及大多数常见应用场景下都是很好的选择. 如何实现一个所谓的完全公平队列(Completely Fair Queueing)? 首先我们要理解所谓的公平是对谁的公平?从操作系统的角度来说,产生操作行为的主体都是进程,所以这里的公平是针对每个进程而言的,我们要试图让进程可以公平的占用IO资源. 那么如何让进程公平的占用IO资源?我们需要先理解什么是IO资源.当我们衡量一个IO资源的时候,一般喜欢用的是两个单位,一个是数据读写的带宽,另一个是数据读写的IOPS.
|