当前位置 : 主页 > 编程语言 > 其它开发 >

OpenStack平台I/O优化

来源:互联网 收集:自由互联 发布时间:2022-05-30
以上就是I/O策略的优化,无论是单队列还是多队列,都可以使用echo命令去修改当前的I/O策略。选择何种策略,也需要根据当前使用的硬盘与应用场景来决定,不能盲目修改 为什么需要
OpenStack平台I/O优化 以上就是I/O策略的优化,无论是单队列还是多队列,都可以使用echo命令去修改当前的I/O策略。选择何种策略,也需要根据当前使用的硬盘与应用场景来决定,不能盲目修改

为什么需要IO调度呢?在最开始的时候,Linux存储在磁盘上。磁盘盘片高速旋转,通过磁臂的移动读取数据。磁臂的移动是物理上的机械上的移动,它无法瞬移,这速度是很慢的。如果我们读取的数据位置很随机,一会在A地点,一会在隔着老远的B地点,移动的时间就全做了无用功,这也就是我们说的随机读写性能慢的原因。如果读取的数据地址是连续的,即使不是连续的也是地址接近的,那么移动磁臂的时间损耗就少了。在最开始,IO调度的作用就是为了合并相近的IO请求,减少磁臂的移动损耗。

单队列I/O调度介绍

登录物理OpenStack平台的Controller节点,查看I/O调度策略

[root@controller ~]# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq

#有的路径是/sys/block/vda/queue/scheduler,可以用cd一步一步进入

可以看到,物理节点默认使用的是deadline算法。常用的单队列算法就是noop、deadline和cfq,关于这三种调度算法的详细解释如下:
(1)noop

noop只会对请求做一些简单的排序,其本质就是一个FIFO的队列,只会简单地合并临近的I/O请求后,本质还是按先来先处理的原则提交给磁盘。

根据它的原理,我们可以发现它倾向于饿死读利于写,为什么呢?异步写是把数据直接放到page cache的,也就意味着可以通过page cache缓存大量的写数据,再一次性往下提交I/O请求。而读呢?读一般是同步的,也就意味着必须在读完一笔后再读下一笔,两次读之间是可能被写请求插足的。

(2)cfq

CFQ全称Completely Fair Scheduler,中文名称完全公平调度器,它是现在许多Linux发行版的默认调度器,CFQ是内核默认选择的I/O调度器。它将由进程提交的同步请求放到多个进程队列中,然后为每个队列分配时间片以访问磁盘。对于通用的服务器是最好的选择,CFQ均匀地分布对I/O带宽的访问。CFQ为每个进程和线程,单独创建一个队列来管理该进程所产生的请求,以此来保证每个进程都能被很好的分配到I/O带宽,I/O调度器每次执行一个进程的4次请求。该算法的特点是按照I/O请求的地址进行排序,而不是按照先来后到的顺序来进行响应。简单来说就是给所有同步进程分配时间片,然后才排队访问磁盘。

(3)deadline

deadline确保请求在一个用户可配置的时间内得到响应,避免请求饿死。其分别为读I/O和写I/O提供不同的FIFO队列,读FIFO队列的最大等待时间是500ms,写FIFO队列的最大等待时间是5s。deadline会把提交时间相近的请求放在一批。在同一批中,请求会被排序。当一批请求达到了大小上限或着定时器超时,这批请求就会提交到设备队列上去。

总体来讲,deadline算法对request进行了优先权控制调度,主要表现在如下几个方面:

读写请求分离,读请求具有高优先调度权,除非写请求即将被饿死的时候,才会去调度处理写请求。这种处理可以保证读请求的延迟时间最小化。

对请求的顺序批量处理。对那些地址临近的顺序化请求,deadline给予了高优先级处理权。例如一个写请求得到调度后,其临近的request会在紧接着的调度过程中被处理掉。这种顺序批量处理的方法可以最大程度的减少磁盘抖动。

保证每个请求的延迟时间。每个请求都赋予了一个最大延迟时间,如果达到延迟时间的上限,那么这个请求就会被提前处理掉,此时,会破坏磁盘访问的顺序化特征,回影响性能,但是,保证了每个请求的最大延迟时间。

对于这三种调度算法的总结如下:

● noop

对于闪存设备和嵌入式系统是最好的选择。对于固态硬盘来说使用noop是最好的,deadline次之,而CFQ效率最低。

● cfq

为所有进程分配等量的带宽,适用于有大量进程的多用户系统,CFQ是一种比较通用的调度算法,它是一种以进程为出发点考虑的调度算法,保证大家尽量公平,为所有进程分配等量的带宽,适合于桌面多任务及多媒体应用。

● deadline

适用于大多数环境,特别是写入较多的文件服务器,从原理上看,DeadLine是一种以提高机械硬盘吞吐量为思考出发点的调度算法,尽量保证在有I/O请求达到最终期限的时候进行调度,非常适合业务比较单一并且I/O压力比较重的业务,比如Web服务器,数据库应用等。

多队列I/O调度介绍

现在有多种multi-queue(多队列)调度器,分别为bfq,none,kyber和mq-deadline。下面对常用调度器的进行介绍:

(1)mq-deadline

mq-deadline调度器跟单队列的deadline调度器发挥的功能很相似。它有个insert_request()函数,不会使用多个staging队列,而是把请求放到两个全局的基于时间的队列中,一个放读请求,一个放写请求,先尝试把该新请求与已经存在的请求合并,如果合并不了,则把这个新请求放到队列尾部。dispatch_request()函数会从这些队列中返回第一个请求:基于时间的队列,基于请求批大小,以及避免写饥饿的队列。

(2)none

多队列无操作I/O调度程序。不对请求进行重新排序,最小的开销。NVME等快速随机I/O设备的理想选择。

I/O调度策略修改

查看当前使用的调度算法

[root@controller ~]# cat /sys/block/vda/queue/scheduler
[mq-deadline] kyber none

可以看到当前的I/O调度算法为mq-deadline,如果当前全是用的是SSD硬盘,那么显然none算法更合适,修改算法为none

[root@test ~]# echo none > /sys/block/vda/queue/scheduler
[root@test ~]# cat /sys/block/vda/queue/scheduler
[none] mq-deadline kyber

可以看到当前的I/O调度算法为none模式。

以上就是I/O策略的优化,无论是单队列还是多队列,都可以使用echo命令去修改当前的I/O策略。选择何种策略,也需要根据当前使用的硬盘与应用场景来决定,不能盲目修改

【本文由:高防cdn http://www.558idc.com/gfcdn.html 复制请保留原URL】
上一篇:集合、列表和数组的概念与区别
下一篇:没有了
网友评论