设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 手机 数据 公司
当前位置: 首页 > 服务器 > 安全 > 正文

如何提高Linux下块设备IO的整体性能?

发布时间:2021-01-04 22:01 所属栏目:53 来源:网络整理
导读:《如何提高Linux下块设备IO的整体性能?》要点: 本文介绍了如何提高Linux下块设备IO的整体性能?,希望对您有用。如果有疑问,可以联系我们。 作者介绍 邹立巍 Linux系统技术专家.目前在腾讯SNG社交网络运营部 计算资源平台组,负责内部私有云平台的建设和架

《如何提高Linux下块设备IO的整体性能?》要点:
本文介绍了如何提高Linux下块设备IO的整体性能?,希望对您有用。如果有疑问,可以联系我们。

作者介绍

邹立巍

Linux系统技术专家.目前在腾讯SNG社交网络运营部 计算资源平台组,负责内部私有云平台的建设和架构规划设计.

曾任新浪动态应用平台系统架构师,负责微博、新浪博客等重点业务的内部私有云平台架构设计和运维管理工作.

小编的话

本文主要讲解Linux IO调度层的三种模式:cfp、deadline和noop,并给出各自的优化和适用场景建议.

据说仅有50%的人能坚持看完本文.

您仔细阅读了多少,学到了什么?欢迎参与文末投票

前言:本文主要讲解Linux IO调度层的三种模式:cfp、deadline和noop,并给出各自的优化和适用场景建议.

IO调度发生在Linux内核的IO调度层.这个层次是针对Linux的整体IO层次体系来说的.从read()或者write()系统调用的角度来说,Linux整体IO体系可以分为七层,它们分别是:

  1. VFS层:虚拟文件系统层.由于内核要跟多种文件系统打交道,而每一种文件系统所实现的数据结构和相关方法都可能不尽相同,所以,内核抽象了这一层,专门用来适配各种文件系统,并对外提供统一操作接口.
  2. 文件系统层:不同的文件系统实现自己的操作过程,提供自己特有的特征,具体不多说了,大家愿意的话自己去看代码即可.
  3. 页缓存层:负责真对page的缓存.
  4. 通用块层:由于绝大多数情况的io操作是跟块设备打交道,所以Linux在此提供了一个类似vfs层的块设备操作抽象层.下层对接各种不同属性的块设备,对上提供统一的Block IO请求标准.
  5. IO调度层:因为绝大多数的块设备都是类似磁盘这样的设备,所以有必要根据这类设备的特点以及应用的不同特点来设置一些不同的调度算法和队列.以便在不同的应用环境下有针对性的提高磁盘的读写效率,这里就是大名鼎鼎的Linux电梯所起作用的地方.针对机械硬盘的各种调度方法就是在这实现的.
  6. 块设备驱动层:驱动层对外提供相对比较高级的设备操作接口,往往是C语言的,而下层对接设备本身的操作方法和规范.
  7. 块设备层:这层就是具体的物理设备了,定义了各种真对设备操作方法和规范.

有一个已经整理好的[Linux IO结构图],非常经典,一图胜千言:

我们今天要研究的内容主要在IO调度这一层.

它要解决的核心问题是,如何提高块设备IO的整体性能?这一层也主要是针对机械硬盘结构而设计的.

众所周知,机械硬盘的存储介质是磁盘,磁头在盘片上移动进行磁道寻址,行为类似播放一张唱片.

这种结构的特点是,顺序访问时吞吐量较高,但是如果一旦对盘片有随机访问,那么大量的时间都会浪费在磁头的移动上,这时候就会导致每次IO的响应时间变长,极大的降低IO的响应速度.

磁头在盘片上寻道的操作,类似电梯调度,实际上在最开始的时期,Linux把这个算法命名为Linux电梯算法,即:

如果在寻道的过程中,能把顺序路过的相关磁道的数据请求都“顺便”处理掉,那么就可以在比较小影响响应速度的前提下,提高整体IO的吞吐量.

这就是我们为什么要设计IO调度算法的原因.

目前在内核中默认开启了三种算法/模式:noop,cfq和deadline.严格算应该是两种:

因为第一种叫做noop,就是空操作调度算法,也就是没有任何调度操作,并不对io请求进行排序,仅仅做适当的io合并的一个fifo队列.

目前内核中默认的调度算法应该是cfq,叫做完全公平队列调度.这个调度算法人如其名,它试图给所有进程提供一个完全公平的IO操作环境.

注:请大家一定记住这个词语,cfq,完全公平队列调度,不然下文就没法看了.

cfq为每个进程创建一个同步IO调度队列,并默认以时间片和请求数限定的方式分配IO资源,以此保证每个进程的IO资源占用是公平的,cfq还实现了针对进程级别的优先级调度,这个我们后面会详细解释.

查看和修改IO调度算法的方法是:

cfq是通用服务器比较好的IO调度算法选择,对桌面用户也是比较好的选择.

但是对于很多IO压力较大的场景就并不是很适应,尤其是IO压力集中在某些进程上的场景.

因为这种场景我们需要更多的满足某个或者某几个进程的IO响应速度,而不是让所有的进程公平的使用IO,比如数据库应用.

deadline调度(最终期限调度)就是更适合上述场景的解决方案.deadline实现了四个队列:

  • 其中两个分别处理正常read和write,按扇区号排序,进行正常io的合并处理以提高吞吐量.因为IO请求可能会集中在某些磁盘位置,这样会导致新来的请求一直被合并,可能会有其他磁盘位置的io请求被饿死.
  • 另外两个处理超时read和write的队列,按请求创建时间排序,如果有超时的请求出现,就放进这两个队列,调度算法保证超时(达到最终期限时间)的队列中的请求会优先被处理,防止请求被饿死.

不久前,内核还是默认标配四种算法,还有一种叫做as的算法(Anticipatory scheduler),预测调度算法.一个高大上的名字,搞得我一度认为Linux内核都会算命了.

结果发现,无非是在基于deadline算法做io调度的之前等一小会时间,如果这段时间内有可以合并的io请求到来,就可以合并处理,提高deadline调度的在顺序读写情况下的数据吞吐量.

其实这根本不是啥预测,我觉得不如叫撞大运调度算法,当然这种策略在某些特定场景差效果不错.

但是在大多数场景下,这个调度不仅没有提高吞吐量,还降低了响应速度,所以内核干脆把它从默认配置里删除了.毕竟Linux的宗旨是实用,而我们也就不再这个调度算法上多费口舌了.

1、cfq:完全公平队列调度

cfq是内核默认选择的IO调度队列,它在桌面应用场景以及大多数常见应用场景下都是很好的选择.

如何实现一个所谓的完全公平队列(Completely Fair Queueing)?

首先我们要理解所谓的公平是对谁的公平?从操作系统的角度来说,产生操作行为的主体都是进程,所以这里的公平是针对每个进程而言的,我们要试图让进程可以公平的占用IO资源.

那么如何让进程公平的占用IO资源?我们需要先理解什么是IO资源.当我们衡量一个IO资源的时候,一般喜欢用的是两个单位,一个是数据读写的带宽,另一个是数据读写的IOPS.

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读