磁盘坏道,是所有人都不希望遇到的事情……

磁盘坏道,轻则磁盘性能下降,重则系统启动失败,数据丢失。所以我们要时刻关注磁盘健康状况,及时备份重要数据。

什么是S.M.A.R.T?

全称为 Self-Monitoring Analysis and Report Technology ,用于磁盘自我检测,并向用户报告磁盘状态。这项技术需要主板支持,且检测结果不一定准确。

linux上可以使用gnome-disk-utility查看磁盘的S.M.A.R.T相关信息。

您也可以安装

sudo pacman -S libatasmart smartmontools gsmartcontrol

 

启用smart图形化界面(gsmartcontrol)/cli工具(smartctl)进行查看。

  • 温彻斯特磁盘:(硬盘原理)

大致原理就是非工作时间磁头停留在landing zone;需要读取数据时,磁头离开landing zone,依靠盘片的旋转产生升力悬浮在盘片表面读取数据。

 

因为盘片旋转速度非常快,且磁头与盘片距离非常近(头发丝的千分之一),如果剧烈震动或者外力冲击,甚至电压不稳,均有可能导致磁头与高速旋转的盘片产生物理接触,造成不可修复性物理损坏。

当您的磁盘:

  1. 在读取某一文件或运行某一程序时,硬盘反复读盘且出错,提示文件损坏等信息,或者要经过很长时间才能成功;有时甚至会出现死机;
  2. io wait 无故增高或居高不下;
  3. 硬盘声音突然由原来正常的摩擦音变成了怪音;
  4. 系统无法正常启动,出现“IO error”等提示信息;
  5. mkfs时,到某一进度停止不前,最后报错,无法完成;
  6. 每次系统开机都会自动运行fsck扫描磁盘错误;
  7. 对硬盘执行FDISK时,到某一进度会反复进进退退;

如果您的磁盘出现如上状况,您就需要及时对磁盘进行坏道检测以测试磁盘可用性,并立即备份数据。

  • 磁盘坏道检测

我的原帖

建议使用livecd或者liveusb对本地磁盘进行检测。如果是对移动存储设备进行检测,请umount后再进行检测,以免数据受损。

umount /dev/sd*

 

对磁盘进行read-only检测:

sudo badblocks -s  -v  /dev/sd*

 

因为需要对磁盘进行检测,所以速度非常缓慢,在检测过程中注意不要断电,不要对硬盘进行任何操作,不要移除硬盘,不要物理损伤,不要震动等。

检测过程可以中途终止,也可以指定区块重新开始。

sudo badblock -s -v  /dev/sd*   last  start

 

 

 
如果您检测完成后看到
Pass completed, 0 bad blocks found.

那么恭喜,此磁盘通过测试,没有坏道(坏块)。您可以放心使用。 :)

  • 磁盘有坏道了……

但是,如果您检测过程中再某一个区块停滞不前,而后报告中提示有坏块,那么杯具了……您的磁盘有坏道了。

不论是什么类型的坏道,均建议您首先进行数据备份!把重要数据进行备份然后再尝试修复。如果您有重要数据却无法读取(磁盘出现异常),那么请立即停止使用此磁盘并找专业人员进行修复

  • 坏道的修复/屏蔽

常见坏道分为以下几种类型:

    • 逻辑坏道
    • 0磁道损坏
    • 物理坏道

坏道一般以单独或者组合形式出现。

  • 逻辑坏道修复:
  • fsck -a /dev/sd*

  • 就这么简单。

更多fsck用法您可以查看这里或者查看man手册。

  • 0磁道损坏修复:

使用1磁道代替零磁道(操作危险需谨慎)

大致流程就是全盘格式化,然后重新分区,编辑分区表使用1磁道,从而复活硬盘。

操作手册(123

  • 物理坏道

物理坏道没有修复可能性,只能进行屏蔽。

如果您已经进行了坏道检测,那么您肯定已经知道坏道(坏块)大致位置以及坏块大小,您需要:

  1. 备份硬盘数据
  2. 删除所有硬盘分区
  3. 根据坏块位置以及大小,估算出所占空间(例如共100个区块,磁盘大小为100g,20-30损坏,则坏块在20-30g这个区间)
  4. 进行分区(接上:分区应为 0-15|15-35|35-100,中间的15-35g为有坏道的分区。要对有坏道的分区进行扩容处理,数值不要过小,以免坏道被分到其他分区。)
  5. 隔离15-35g这个分区(即不挂载,不读写,不操作)
  6. 您的磁盘可用空间减少,但是剩余空间均可用(坏道已经屏蔽)

由于物理坏道具有扩散性,所以建议尽早让磁盘“退休”才是……

  • 分区表修复工具

如果您的分区表已经被损坏,建议使用testdisk进行修复。他可以快速回复分区表,真的非常好用(修复我的硬盘n次!利器也~)

安装

sudo pacman -S testdisk

基本用法(12

  • 珍爱磁盘,爱护数据

磁盘有价,数据无价

不要等磁盘出现问题了才想到数据还没有备份;不到等论文丢了才想起来明天就要交;不要等rm了才想起来把重要文件删除了。备份数据并不是多么困难,也不需要多少时间,所以请您及时备份,保护无价的数据吧!

转自:https://www.deleak.com/blog/2010/06/07/hard-disk-scan/

 

 

http://mycnarms.blog.51cto.com/614646/787586

Linux检测硬盘坏道
使用SMART检测硬盘 
SMART是一种磁盘自我分析检测技术,早在90年代末就基本得到了普及每一块硬盘(包括IDE、SCSI),在运行的时候都会将自身的若干参数记录下来,这些参数包括型号、容量、温度、密度、扇区、寻道时间、传输、误码率等。硬盘运行了几千小时后,很多内在的物理参数都会发生变化,某一参数超过报警阈值,则说明硬盘接近损坏,此时硬盘依然在工作,如果用户不理睬这个报警继续使用,那么硬盘将变得非常不可靠,随时可能故障。
启用SMART
SMART是和主板BIOS上相应功能配合的,要使用SMART,必须先进入到主板BIOS设置里边启动相关设置。一般从Pentium2级别起的主板,都支持SMART,BIOS启动以后,就是操作系统级别的事情了(Windows没有内置SMART相关工具,需要安装第三方工具软件),好在Linux上很早就有了SMART支持了,如果把Linux装在VMware等虚拟机上,在系统启动时候可以看到有个服务启动报错:smartd。这个服务器就是smart的daemon进程(因为vmware虚拟机的硬盘不支持SMART,所以报错)。smartd是一个守护进程(一个帮助程序),它能监视拥有自我监视,分析和汇报技术(Self-Monitoring, Analysis, and Reporting Technology - SMART)的硬盘。SMART体系使得硬盘能监视并汇报自己的运行状况.它的一个重要特性是能够预测失败,使得系统管理员能避免数据丢失。 
smartctl简单用法
smartctl -a <device> 检查该设备是否已经打开SMART技术。 smartctl -s on <device> 如果没有打开SMART技术,使用该命令打开SMART技术。 smartctl -t short <device> 后台检测硬盘,消耗时间短; smartctl -t long <device> 后台检测硬盘,消耗时间长; smartctl -C -t short <device> 前台检测硬盘,消耗时间短; smartctl -C -t long <device> 前台检测硬盘,消耗时间长。其实就是利用硬盘SMART的自检程序。 smartctl -X <device> 中断后台检测硬盘。 smartctl -l selftest <device> 显示硬盘检测日志。 smartctl -l error <device> 显示硬盘错误汇总。
首先通过dmesg工具,确认一下硬盘的设备符号。例如一个IDE硬盘连接到Primary IDE 总线上的Slave位置,硬盘设备符号是/dev/hdb,hdb中的h代表IDE,如果显示为sdb,则代表SATA和SCSI,最后一个字幕b代表Primary总线,第二块硬盘即Slave位置,确认硬盘是否打开了SMART支持:
# smartctl -i /dev/sda
smartctl 5.40 2010-10-16 r3189 [i386-redhat-linux-gnu] (local build)
Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net
 
=== START OF INFORMATION SECTION ===
Device Model:     HITACHI HTS543225L9SA00
Serial Number:    090131FB2F32YLG28JEA
Firmware Version: FBEZC48C
User Capacity:    250,059,350,016 bytes
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   8
ATA Standard is:  ATA-8-ACS revision 3f
Local Time is:    Wed May 25 10:10:39 2011 CST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled                          //表示启用了smart支持
如果看到SMART support is: Disabled表示SMART未启用,执行如下命令,启动SMART
# smartctl --smart=on --offlineauto=on --saveauto=on /dev/sda
smartctl 5.40 2010-10-16 r3189 [i386-redhat-linux-gnu] (local build)
Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net
=== START OF ENABLE/DISABLE COMMANDS SECTION ===
SMART Enabled.
SMART Attribute Autosave Enabled.
SMART Automatic Offline Testing Enabled every four hours.
现在硬盘的SMART功能已经被打开,执行如下命令查看硬盘的健康状况
# smartctl -H /dev/sda
smartctl 5.40 2010-10-16 r3189 [i386-redhat-linux-gnu] (local build)
Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
请注意result后边的结果:PASSED,这表示硬盘健康状态良好;如果这里显示Failure,那么最好立刻给服务器更换硬盘。SMART只能报告磁盘已经不再健康,但是报警后还能继续运行多久是不确定的。通常,SMART报警参数是有预留的,磁盘报警后,不会当场坏掉,一般能坚持一段时间,有的硬盘SMART报警后还继续跑了好几年,有的硬盘SMART报错后几天就坏了。但是一旦出现报警,侥幸心里是万万不能的……
#smartctl -A   /dev/sda  查看硬盘的详细信息
#smartctl -s on  /dev/sda  如果没有打开SMART技术,使用该命令打开SMART技术。
#smartctl -t short  /dev/sda  后台检测硬盘,消耗时间短;
#smartctl -t long  /dev/sda   后台检测硬盘,消耗时间长;
#smartctl -C -t  /dev/sda   short前台检测硬盘,消耗时间短;
#smartctl -C -t  /dev/sda   long前台检测硬盘,消耗时间长。其实就是利用硬盘SMART的自检程序。
#smartctl -X   /dev/sda      中断后台检测硬盘。
#smartctl -l selftest  /dev/sda  显示硬盘检测日志。
#smartctl -l error   /dev/sda    显示硬盘错误汇总。
如果需要定期登录到服务器上运行smartctl比较麻烦时,linux还提供了系统进程smartd,编辑配置文件:1    vi  /etc/smartd.conf
这个配置文件中大部分可能是注释掉的说明,只需要写入和当前硬盘相关的配置即可:
/dev/sda -H  -m  test@test123123.com  //监控磁盘的健康状态,当SMART中报告PASSED的时候不理睬。一旦出现Failure,立刻用邮件通知用户指定的邮箱
 /dev/sda -a -m  admin@example.com,root@localhost  //监控磁盘的所有属性,当SMART中报告PASSED的时候不理睬。一旦出现Failure,立刻用邮件通知用户指定的邮箱 
 /dev/twa0 -d 3ware,0 -a -s L/../../7/00 //监控3ware 9000控制器上的第一个ATA磁盘的所有属性,在每个礼拜天的00:00--01:00进行长格式的自我检测
 /dev/sg2 -d areca,1 -a  -s L/../(01|15)/./22 //监控Areca Raid控制器上的第一个SATA磁盘的所有属性,在每个礼拜月的第1天和第15天的22:00--23:00进行长格式的自我检测
 -s (O/../.././(00|06|12|18)|S/../.././01|L/../../6/03) //在每天的00:00,06:00,12:00,18:00进行离线的自检,并在每天的01:00-02:00进行短格式的自检,并在每个礼拜6的03:00-04:00进行长格式的自检 
配置好smartd.conf后需执行
/etc/init.d/smartd restart 即可生效
其他和smartd.conf相关的配置可参见:
使用badblocks检测硬盘坏块
badblocks命令可以检查磁盘装置中损坏的区块。执行该指令时须指定所要检查的磁盘装置,及此装置的磁盘区块数。
语法与参数:    语法:badblocks [-svw][-b ][-o ][磁盘装置][磁盘区块数][启始区块]参数: -b 指定磁盘的区块大小,单位为字节。-o 将检查的结果写入指定的输出文件。-s 在检查时显示进度。-v 执行时显示详细的信息。-w 在检查时,执行写入测试。 [磁盘装置] 指定要检查的磁盘装置。[磁盘区块数] 指定磁盘装置的区块总数。 [启始区块] 指定要从哪个区块开始检查。
badblocks检测磁盘坏块:
badblocks -s//显示进度  -v//显示执行详细情况   /dev/sda1
# badblocks -s -v /dev/sda
正在检查从 0 到 244198583的块
Checking for bad blocks (read-only test): ^C0.10% done, 0:04 elapsed
Interrupted at block 272896
$badblocks -s//显示进度 -w//以写去检测 -v//显示执行详细情况 /dev/sda2
# badblocks -w -s -v /dev/sda1
Checking for bad blocks in read-write mode
From block 0 to 25607577
Testing with pattern 0xaa: ^C0.73% done, 0:03 elapsed
注意,不能以写的方式检测已经挂载的硬盘
使用hdparm测试   
测试硬盘读写速度
# hdparm -Tt /dev/sda
/dev/sda:
Timing cached reads:   
1918 MB in  2.00 seconds = 959.62 MB/sec
Timing buffered disk reads:  184 MB in  3.00 seconds =  61.26 MB/sec
hdparm可检测,显示与设定IDE或SCSI硬盘的参数。
语法:
hdparm [-CfghiIqtTvyYZ][-a <快取分区>][-A <0或1>][-c <I/O模式>][-d <0或1>][-k <0或1>][-K <0或1>][-m <分区数>][-n <0或1>][-p <PIO模式>][-P <分区数>][-r <0或1>][-S <时间>][-u <0或1>][-W <0或1>][-X <传输模式>] [设备]
-a<快取分区> 设定读取文件时,预先存入块区的分区数,若不加上<快取分区>选项,则显示目前的设定。 -A<0或1> 启动或关闭读取文件时的快取功能。-c<I/O模式> 设定IDE32位I/O模式。 -C 检测IDE硬盘的电源管理模式。-d<0或1> 设定磁盘的DMA模式。-f 将内存缓冲区的数据写入硬盘,并清楚缓冲区。 -g 显示硬盘的磁轨,磁头,磁区等参数。-h 显示帮助。-i 显示硬盘的硬件规格信息,这些信息是在开机时由硬盘本身所提供。 -I 直接读取硬盘所提供的硬件规格信息。-k<0或1> 重设硬盘时,保留-dmu参数的设定。 -K<0或1> 重设硬盘时,保留-APSWXZ参数的设定。-m<磁区数> 设定硬盘多重分区存取的分区数。 -n<0或1> 忽略硬盘写入时所发生的错误。-p<PIO模式> 设定硬盘的PIO模式。 -P<磁区数> 设定硬盘内部快取的分区数。-q 在执行后续的参数时,不在屏幕上显示任何信息。 -r<0或1> 设定硬盘的读写模式。-S<时间> 设定硬盘进入省电模式前的等待时间。-t 评估硬盘的读取效率。 -T 平谷硬盘快取的读取效率。-u<0或1> 在硬盘存取时,允许其他中断要求同时执行。-v 显示硬盘的相关设定。 -W<0或1> 设定硬盘的写入快取。-X<传输模式>  设定硬盘的传输模式。-y 使IDE硬盘进入省电模式。 -Y 使IDE硬盘进入睡眠模式。-Z 关闭某些Seagate硬盘的自动省电功能。
 
 
http://www.centoscn.com/CentOS/Intermediate/2014/1107/4083.html
 
用badblocks检测硬盘坏道
 
硬盘是一个损耗设备,当使用一段时间后可能会出现坏道等物理故障。电脑硬盘出现坏道后,如果不及时更换或进行技术处理,坏道就会越来越多,并会造成频繁死机和数据丢失。最好的处理方式是更换磁盘,但在临时的情况下,应及时屏蔽坏道部分的扇区,不要触动它们。badblocks就是一个检查坏道位置的工具。
 
一、命令参数
badblocks使用格式为:
引用
badblocks  [  -svwnf  ]  [  -b block-size ] [ -c blocks_at_once ] [ -i
       input_file ] [ -o output_file ] [ -p num_passes ] [ -t test_pattern  ]
       device [ last-block ] [ start-block ]
 
参数含义是:
引用
-b blocksize 
  指定磁盘的区块大小,单位为字节,默认值为“block 4K ”(4K/block)
-c blocksize 
  每个区块检查的次数,默认是16次
-f
  强制在一个已经挂载的设备上执行读写或非破坏性的写测试操作
  (我们建议先umount设备,然后再进行坏道检测。仅当/etc/mtab出现误报设备挂载错误的时候可以使用该选项)
-i file
  跳过已经显示在file文件中的坏道,而不进行检测(可以避免重复检测)
-o file 
  把检测结果输出到file文件
-p number
  重复搜寻设备,直到在指定通过次数内都没有找到新的坏块位置,默认次数为0 
-s
  在检查时显示进度
-t pattern 
  通过按指定的模式读写来检测区块。你可以指定一个0到ULONG_MAX-1的十进制正值,或使用random(随机)。
  如果你指定多个模式,badblocks将使用第一个模式检测所有的区块,然后再使用下一个模式检测所有的区块。
  Read-only方式仅接受一个模式,它不能接受random模式的。
-v
  执行时显示详细的信息
-w
  对每个区块都先写入,然后再从它读取信息
[device]
  指定要检查的磁盘装置。
[last-block]
  指定磁盘装置的区块总数。
[start-block]
  指定要从哪个区块开始检查
 
二、示例
badblocks以4096的一个block,每一个block检查16次,将结果输出到“hda-badblocks-list”文件里
 
# badblocks -b 4096 -c 16 /dev/hda1 -o hda-badblocks-list
 
hda-badblocks-list”是个文本文件,内容如下:
引用
# cat hda-badblocks-list 
51249 
51250 
51251 
51253 
51254 
……
61245 
……
 
可以针对可疑的区块多做几次操作。下面,badblocks以4096字节为一个“block”,每一个“block”检查1次, 将结果输出到“hda-badblocks-list.1”文件中,由第51000 block开始,到63000 block结束
 
# badblocks -b 4096 -c 1 /dev/hda1 -o hda-badblocks-list.1 63000 51000
 
这次花费的时间比较短,硬盘在指定的情况下在很短的时间就产生“嘎嘎嘎嘎”的响声。由于检查条件的不同,其输出的结果也不完全是相同的。重复几次同样的操作,因条件多少都有些不同,所以结果也有所不同。进行多次操作后,直到产生最后的hda-badblock-list.final文件。
 
三、其他
1、fsck使用badblocks的信息
badblocks只会在日志文件中标记出坏道的信息,但若希望在检测磁盘时也能跳过这些坏块不检测,可以使用fsck的-l参数:
# fsck.ext3 -l /tmp/hda-badblock-list.final /dev/hda1
 
2、在创建文件系统前检测坏道
badblocks可以随e2fsck和mke2fs的-c删除一起运行(对ext3文件系统也一样),在创建文件系统前就先检测坏道信息:
 
# mkfs.ext3 -c /dev/hda1
 
代码表示使用-c在创建文件系统前检查坏道的硬盘。
这个操作已经很清楚地告知我们可以采用“mkfs.ext3 -c”选项用“read-only”方式检查硬盘。这个命令会在格式化硬盘时检查硬盘,并标出错误的硬盘“block”。用这个方法格式化硬盘,需要有相当大的耐心,因为命令运行后,会一个个用读的方式检查硬盘。
 
 
http://blog.sina.com.cn/s/blog_13748cb010102v0m8.html
Linux检测硬盘坏道

1.使用SMART检测硬盘
查看是否启用SMART功能:
实例:
[root@test20130628 ~]# smartctl -i /dev/sda
smartctl 5.39.1 2010-01-28 r3054 [x86_64-unknown-linux-gnu] (local build)
Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF INFORMATION SECTION ===
Device Model:     TOSHIBA MG03ACA100
Serial Number:    23DDK40VF
Firmware Version: FL1A
User Capacity:    1,000,204,886,016 bytes
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   8
ATA Standard is:  Exact ATA specification draft version not indicated
Local Time is:    Thu Jul  4 01:04:11 2013 PDT
SMART support is: Available - device has SMART capability.
SMART support is: Enabled
现在硬盘的SMART功能已经被打开,执行如下命令查看硬盘的健康状况:

[root@test20130628 ~]# smartctl -H /dev/sda
smartctl 5.39.1 2010-01-28 r3054 [x86_64-unknown-linux-gnu] (local build)
Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
请注意result后边的结果:PASSED,这表示硬盘健康状态良好;如果这里显示Failure,那么最好立刻给服务器更换硬盘。
如果想查看更详细参数,可以执行smartctl -A /dev/sda
实例:
[root@test20130628 ~]# smartctl -A /dev/sda
smartctl 5.39.1 2010-01-28 r3054 [x86_64-unknown-linux-gnu] (local build)
Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000b   100   100   050    Pre-fail  Always       -       0
  2 Throughput_Performance  0x0005   100   100   050    Pre-fail  Offline      -       0
  3 Spin_Up_Time            0x0027   100   100   001    Pre-fail  Always       -       4449
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       6
  5 Reallocated_Sector_Ct   0x0033   100   100   050    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000b   100   100   050    Pre-fail  Always       -       0
  8 Seek_Time_Performance   0x0005   100   100   050    Pre-fail  Offline      -       0
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       127
 10 Spin_Retry_Count        0x0033   100   100   030    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       6
191 G-Sense_Error_Rate      0x0032   100   100   000    Old_age   Always       -       0
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       4
193 Load_Cycle_Count        0x0032   100   100   000    Old_age   Always       -       7
194 Temperature_Celsius     0x0022   100   100   000    Old_age   Always       -       26 (Lifetime Min/Max 18/28)
196 Reallocated_Event_Count 0x0032   100   100   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0032   200   200   000    Old_age   Always       -       0
220 Disk_Shift              0x0002   100   100   000    Old_age   Always       -       0
222 Loaded_Hours            0x0032   100   100   000    Old_age   Always       -       121
223 Load_Retry_Count        0x0032   100   100   000    Old_age   Always       -       0
224 Load_Friction           0x0022   100   100   000    Old_age   Always       -       0
226 Load-in_Time            0x0026   100   100   000    Old_age   Always       -       109
240 Head_Flying_Hours       0x0001   100   100   001    Pre-fail  Offline      -       0


2.badblocks检测磁盘坏块:
badblocks -s//显示进度 -v//显示执行详细情况 /dev/sda //检查的磁盘
实例:
#badblocks -s -v /dev/sda1
[root@test20130628 ~]# badblocks -s -v /dev/sda1
Checking blocks 0 to 255999
Checking for bad blocks (read-only test): done
Pass completed, 0 bad blocks found.
[root@test20130628 ~]# badblocks -s -v /dev/sda
Checking blocks 0 to 976762583
Checking for bad blocks (read-only test):   5.71% done, 6:11 elapsed


Linux硬盘I/O性能(速度)测试

1.使用hdparm测试:
实例:
[root@test20130628 ~]# hdparm -tT /dev/sda1
/dev/sda1:
 Timing cached reads:   28326 MB in  2.00 seconds = 14188.29 MB/sec
 Timing buffered disk reads:  250 MB in  1.76 seconds = 142.26 MB/sec

[root@test20130628 ~]# hdparm -tT /dev/sda
/dev/sda:
 Timing cached reads:   28302 MB in  2.00 seconds = 14175.83 MB/sec
 Timing buffered disk reads:  444 MB in  3.00 seconds = 147.81 MB/sec

其中两参数含义:-T perform cache read timings显示了不存取磁盘直接从Linux缓存读取数据的速度. 测量实际上标示了被测系统的处理器,缓存和内存的吞吐量.
-t perform device read timings显示了不使用预先的数据缓冲, 标示了Linux下没有任何文件系统开销时磁盘可以支持多快的连续数据读取.

hdparm相关命令:
 
hdparm -tT /dev/hda 测试硬盘速度
hdparm -A 1 /dev/hda 开启硬盘预读取功能
hdparm -c 3 /dev/hda 开启硬盘32位
hdparm -d 1 /dev/hda 开启DMA
-d 和 -A 参数对IDE硬盘读写性能影响最大(尤 -d)

关闭与开启硬盘预读取功能速度对比:
关闭预读取测试实例(即关闭缓存作用):
[root@test20130628 ~]# hdparm -A 0 /dev/sda

/dev/sda:
 setting drive read-lookahead to 0 (off)
 look-ahead    =  0 (off)
[root@test20130628 ~]# hdparm -Tt /dev/sda

/dev/sda:
 Timing cached reads:   26134 MB in  2.00 seconds = 13088.33 MB/sec
 Timing buffered disk reads:   42 MB in  3.10 seconds =  13.57 MB/sec

开启预读取测试实例(即开启缓存作用)
[root@test20130628 ~]# hdparm -A 1 /dev/sda

/dev/sda:
 setting drive read-lookahead to 1 (on)
 look-ahead    =  1 (on)
[root@test20130628 ~]# hdparm -Tt /dev/sda

/dev/sda:
 Timing cached reads:   27444 MB in  2.00 seconds = 13745.22 MB/sec
 Timing buffered disk reads:  444 MB in  3.00 seconds = 147.75 MB/sec


2.当用top或者iostat查看发现iowait比较高时说明有io瓶颈,iostat检测实例:
[root@test20130628 ~]# iostat -kdx 2
Linux 2.6.32-220.el6.x86_64 (test20130628)      07/04/2013      _x86_64_        (8 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               2.04     0.08    2.48    0.13   158.37     0.73   122.04     0.00    0.80   0.77   0.20
dm-0              0.00     0.00    0.04    0.18     0.42     0.72    10.43     0.00    6.30   4.48   0.10
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     8.00     0.00    2.13   1.19   0.00
dm-2              0.00     0.00    0.00    0.00     0.00     0.01     7.98     0.00    3.39   0.90   0.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
dm-2              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
dm-2              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
参数说明:
rrqm/s:每秒进行merge的读操作数目。即delta(rmerge)/s
wrqm/s:每秒进行merge的写操作数目。即delta(wmerge)/s
r/s:每秒完成的读I/O设备次数。即delta(rio)/s
w/s:每秒完成的写I/O设备次数。即delta(wio)/s
rsec/s:每秒读扇区数。即delta(rsect)/s
wsec/s:每秒写扇区数。即delta(wsect)/s
rkB/s:每秒读K字节数。是rsect/s的一半,因为每扇区大小为512字节。(需要计算)
wkB/s:每秒写K字节数。是wsect/s的一半。(需要计算)
avgrq-sz:平均每次设备I/O操作的数据大小(扇区)。delta(rsect+wsect)/delta(rio+wio)
avgqu-sz:平均I/O队列长度。即delta(aveq)/s/1000(因为aveq的单位为毫秒)。
await:平均每次设备I/O操作的等待时间(毫秒)。即delta(ruse+wuse)/delta(rio+wio)
svctm:平均每次设备I/O操作的服务时间(毫秒)。即delta(use)/delta(rio+wio)
%util:一秒中有百分之多少的时间用于I/O操作,或者说一秒中有多少时间I/O队列是非空的。即delta(use)/s/1000(因为use的单位为毫秒)
如果%util接近100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘
能存在瓶颈;idle小于70%IO压力就较大了,一般读取速度有较多的wait.
同时可以结合vmstat查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)
从以上实例说明当前该服务器io性能良好。
另外还可以参考
一般:svctm
svctm的大小一般和磁盘性能有关:CPU/内存的负荷也会对其有影响,请求过多也会间接导致svctm的增加。
await:await的大小一般取决于服务时间(svctm)以及I/O队列的长度和I/O请求的发出模式。
如果svctm比较接近await,说明I/O几乎没有等待时间;
如果await远大于svctm,说明I/O队列太长,应用得到的响应时间变慢
如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核elevator算法,优化应用,或者升级CPU.
队列长度(avgqu-sz)也可作为衡量系统I/O负荷的指标,但由于avgqu-sz是按照单位时间的平均值,所以不能反映瞬间的I/O洪水。