再谈Load_Cycle_Count问题

昨天在IRC上跟人说到一个Ubuntu笔记本电源管理的Bug,之后有人给了个链接,是一个陈年老贴了,零七年的,说“Ubuntu正在成为我的笔记本硬盘杀手??”,之前我倒一直没有听说过这个问题,就知道Ubuntu的电源管理不怎么样,特耗电什么的。看了下贴子,Google了一下相关的内容,发现这个问题不光Ubuntu存在,Windows就连Mac OS X也存在同样的问题,而且也不能算是操作系统的Bug,总之用IRC里某人的话来说就是官方不可能解决

说明:这个问题只有用电池的笔记本才会出现,如果你的笔记本电池“英年早逝”或者你用的是台式机那就不用看了。

先来说一下到底什么是Load_Cycle_Count,这是一个描述硬盘使用情况的参数,就跟通电时间差不多,Ubuntu下可以通过安装smartmontools之后查看(Windows下可以用Everest查看SMART信息。同时还可以看到通电时间等。):

sudo apt-get install smartmontools
sudo smartctl -d ata -a /dev/sda

可以看到其中有两行是类似于下面这样的

9 Power_On_Hours 0x0012 093 093 000 Old_age Always - 3284
193 Load_Cycle_Count 0x0012 099 099 000 Old_age Always - 10520

可以看到我的Load_Cycle_Count数目是10520,然后Power_On_Hours是硬盘的通电时间,我的硬盘差不多用了两年。3284小时。通常,硬盘制造商规定的Load_Cycle_Count数目上限是600,000次,要是超过300,000次就会影响到正常的读写,再多的话就差不多要报废了。Load_Cycle_Count每小时增长15次左右应该算正常的,不过直接把上面那两项的数字相除(10520/3284≈3)也是不合理的(我又不是没电源线)。

下面科普一下相关的知识:

硬盘的数据传输是通过磁头读写磁盘上的数据来完成的。在工作过程中,磁头并不与磁盘的盘面直接接触,两者之间有一层很薄的空气薄膜,这层空气薄膜是由于磁盘的高速旋转产生的。如果磁盘停止旋转,空气薄膜消失,磁头则会直接接触到盘片,这无疑对盘片的寿命以及对存储在这块区域的数据造成不好的影响。因此在早期阶段,硬盘制造商一般会在对盘片的表面做特殊的处理。 但是随着人们对于硬盘传输速度和硬盘容量需求的不断增加,制造商需要不断提高硬盘的面密度,同时要求盘片表面尽可能地平滑,这无疑与之前采用的技术产生了冲突,再加上其他的一些因素,硬盘制造商迫切地需要一种新的方式来替代之前采用的磁头直接接触盘面的行为。这时IBM的工程师们提出了一种叫做 Load/Unload的技术。简单来说,Load/Unload技术有点像老式的点唱机,当盘片转速降低无法再产生空气薄膜的时候,就将磁臂以及磁头旋转一下,停靠到磁盘旁边的一个小斜坡上。这样就完全避免了磁头与盘片的直接接触。

简单来说,就是说为了使笔记本保持低功耗,采用了这样一种技术,在硬盘空闲的时候将磁头停靠到一边儿去,要使用的时候再复位,通常我们听到笔记本硬盘“咯吱”的声音就是磁头复位的声音。不过频繁的加载循环话势必会导致硬盘的寿命减损。

那磁头的这个动作又是由谁来控制的呢?

有的笔记本为了省电采用的直接就是频繁地park/unpark磁头的方法(具体如何实现我不清除,对底层I/O有兴趣的同学可以研究一下),不过同时,操作系统也有一套管理策略,所以最终的结果得看哪个更严格,就Ubuntu来说的话,默认是不会改变电源管理策略的,就是说沿用了硬件的设置。

说实话,这个Bug由来已久,差不多零七年就有人发现了,在ubuntu wiki上的Bug59695上有关于这个问题的详细介绍以及相应的解决方案,不过个人认为,这并不能算是一个Bug,应该算是一种矛盾,哪方面都没有错,只是权衡的问题。而且,正如你看完上面的介绍所知道的那样,这并不仅仅是Ubuntu的问题,Windows、Mac OS X同样没法儿幸免。

下面就我自己的情况来谈一下,Lenovo Y460 + Ubuntu 11.04。昨晚我使用电池一个小时左右,期间用smartmontools查看Load_Cycle_Count,多次都没有变化,都是10520,今天开机之后继续检测,变成了10521,加了一,属于完全正常(因为关机了一次)。然后再分别在插上电源跟使用电池两种情况下查看APM(Advanced Power Management)级别(APM即高级电源管理,值在0~255之间,0表示完全开启,硬盘连续8秒没有读写,磁头就会复位;255表示完全关闭,磁头除了再开关机时复位外,其他时间不复位。简单来说就是值越小越省电):

hdparm -I /dev/sda |grep Advanced

得到的结果分别是:插上电源之后是254,使用电池是128。完全合理。

好吧,几年过去了,这个Bug是不是就是这么解决了。