Chinaunix首页 | 论坛 | 博客
  • 博客访问: 716761
  • 博文数量: 67
  • 博客积分: 994
  • 博客等级: 准尉
  • 技术积分: 1749
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-03 14:10
文章分类
文章存档

2014年(11)

2013年(14)

2012年(14)

2011年(28)

分类: LINUX

2013-05-06 18:03:47

现在系统中主要耗能的部位基本在CPU 、磁盘、显示设备、网卡等处。随着linux系统的不断流行,有必要研究下linux下内核对磁盘能耗的支持。
在讲linux对磁盘能耗支持之前,有必要介绍下磁盘的工作原理以及当前业界针对磁盘有哪些研究成果。这里主要介绍传统磁盘的相关信息。

磁盘主要由:磁盘片、磁头、磁头臂、永磁铁、音圈马达、主轴以及空气过滤片等部件构成。磁盘的工作原理是在马达的转动下引起磁头的转动,然后磁头定位之后利用特定的磁粒子的极性来记录数据。
    磁盘的工作状态分为活动状态、空闲状态以及待机状态。1给出了Seagate ST3500630AS类型磁盘的不同工作状态的能量消耗模型


1 Seagate ST3500630AS工作状态能耗模型

磁盘处于活动状态时,盘片高速旋转,同时磁头在寻道、定位以及存取数据,这种状态磁盘能耗最大;当磁盘处于空闲状态时,盘片保持高速旋转,磁头锁定在停泊位,此时磁盘的能耗稍低;当磁盘处于待机状态时,电子器件关闭,盘片停止旋转,磁头归位,此时磁盘的能耗最低。但是磁盘从待机状态返回到数据存取状态需要很长时间且能耗比较大。

    磁盘的主要能耗部位在磁头臂、盘片等处定位到磁盘的主要能耗部位就可以对磁盘系统能耗降低的方法或途径进行分析通过图1得出结论,降低磁盘能耗的方法主要是延长磁盘在待机状态的时间。

    当前针对磁盘能耗提出的成果主要分为单磁盘和磁盘阵列:
    单磁盘能耗研究:

Carrera等人和Gurumurthi等人针对服务器在空闲周期较短从而使磁盘进入待机状态的问题,提出了动态转速磁盘(DRPM)的概念,即将磁盘的盘片转速分为多个不同速度等级,在系统负载较轻时使磁盘运行在低速旋转状态;当系统负载较重时,调整磁盘运行在高速旋转状态下。其研究表明,动态转速磁盘模型可以有效降低磁盘能耗。密歇根大学的H.Huang等人提出了FS?FreeSpace Filesystem)模型。该模型主要是为了降低磁头定位延迟对磁盘性能和能耗的影响。
    磁盘阵列研究:

D.Li等人提出的EERAID模型eRAID模型EERAID模型主要挖掘磁盘阵列的冗余信息并将冗余信息和I/O调度策略、阵列控制器级Cache管理策略等结合起来,采用非易失缓存作为写回策略的Cache来优化写操作请求。eRAID模型充分利用了RAID1的冗余特性来重定向I/O请求,通过停止旋转部分或者整个冗余组的磁盘来降低能耗,同时将系统性能的降低控制在一个可接受的范围。

Q Zhu等人提出的Hibernator模型,该模型基于动态转速磁盘模型的基础上,在有多种不同转速的磁盘组成的存储系统里,Hibernator将数据迁移到合适转速的磁盘上从而在保证满足性能要求的前提下达到节能目的。

C.Weddle等人提出的PARAID模型,该模型依据系统负载的轻重变化自动调整组成磁盘阵列的活动成员个数,形成一种可动态变换的多档磁盘阵列组织方法,从而在满足性能的前提下实现最大程度的节能。

D.Colarelli等人提出的MAIDMassive Arrays of idle Disk,MAID)模型,该模型采用额外的磁盘作为缓冲磁盘,将热点访问的数据置于新添加的缓存磁盘上,从而最大限度的减少定向到后端磁盘的I/O数量,延长后端磁盘的空闲时间,实现磁盘能耗的降低。

    E.Pinheiro等人提出的PDCPopular Data Concentration)模型,该模型主要针对存储系统的访问频率,周期性的将访问频率比较高的数据迁移到少数磁盘上,并将访问频率较低的数据集中于剩下的磁盘上。这样绝大部分的I/O请求集中在了少数磁盘上,从而可以降低磁盘能耗。



通过上面的研究成果可以看出降低磁盘能耗的主要途径还是尽量的延长磁盘的空闲时间。那么linux对磁盘能耗的分析就要重点从能延长磁盘空闲时间的模块来分析。
linux里面和磁盘能耗相关的部位主要有:底层的驱动程序、磁盘的调度程序、以及针对I/O的基本机制预读和回写。
底层的驱动程序主要实现了硬件和系统之间的响应处理。
现在内核(3.5.4)里面磁盘的I/O调度程序主要有3种:可以通过shell命令cat  /sys/block/sda/queue/scheduler查看得到磁盘调度的4种策略,分别为noopanticipatorydeadlinecfqLinux默认的调度策略是cfq。现在虽然结果显示有anticipatory调度程序,但是内核里面没有源码支持了。这几种调度程序可以在网上查找出具体的工作原理,这里不再叙述。
主要和磁盘能耗关系比较密切的部分在I/O处理这一块。可以重点通过分析预读和回写机制。

预读的工作原理是在对文件进行读操作时,首先在页缓存中查找是否存在要读取的数据,如果存在则读取,否则从磁盘读取文件数据然后将数据复制到内存缓存以便后续读取相同数据可以快速读取预读的主要实现源码见/mm/readahead.c

预读主要对顺序请求有良好的处理能力,对随机请求性能就不那么完美了。预读分析主要点在预读算法、预读的时机如何选取以及和页缓存的结合使用。

回写策略的主要思想是将要写入磁盘的数据直接写入缓存中,后端存储不会立即更新,内核将页高速缓存中的被写入的页标记为,并且将脏页维护在脏页链表中,然后通过回写进程周期性的将脏页链表中的页写回磁盘。主要实现源码见:fs/fs-writeback.c、mm/page-writeback.c。

Linux内核中有一个常驻内存的线程bdi_forker_thread,该线程负责bdi对象创建writeback线程进行周期性的回写操作。如果系统中的回写线程长时间处于空闲状态,该线程就会将其销毁。
回写过程中主要了解以下几个结构体的作用:backing_dev_info、bdi_writeback、wb_writeback_work、writeback_control等,读者自行查找相关结构体解释。


了解了系统和磁盘能耗相关部分之后,系统也通过shell命令提供了对磁盘性能的简单显示。主要命令有Hdparm、iostat、dd等命令。具体命令使用见man手册。

上面说的不对的地方希望大家指正,没有分析到的地方欢迎补充。

阅读(2315) | 评论(0) | 转发(0) |
0

上一篇:了解systemtap

下一篇:sizeof和strlen之比较

给主人留下些什么吧!~~