Linux下提高硬盘读写速度|linux磁盘读写性能优化

Linux下提高硬盘读写速度|linux磁盘读写性能优化

Linux命令:hdparm

功能说明:显示与设定硬盘的参数。
语  法:hdparm [-CfghiIqtTvyYZ][-a <快取分区>][-A <0或1>][-c ][-d <0或1>][-k <0或1>][-K <0或1>][-m <分区数>][-n <0或1>][-p ][-P <分区数>][-r <0或1>][-S <时间>][-u <0或1>][-W <0或1>][-X <传输模式>][设备]
补充说明:hdparm可检测,显示与设定IDE或SCSI硬盘的参数。
参  数:
-a<快取分区> 设定读取文件时,预先存入块区的分区数,若不加上<快取分区>选项,则显示目前的设定。
-A<0或1> 启动或关闭读取文件时的快取功能。
-c 设定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模式。
-P<磁区数> 设定硬盘内部快取的分区数。
-q 在执行後续的参数时,不在屏幕上显示任何信息。
-r<0或1> 设定硬盘的读写模式。
-S<时间> 设定硬盘进入省电模式前的等待时间。
-t 评估硬盘的读取效率。
-T 平谷硬盘快取的读取效率。
-u<0或1> 在硬盘存取时,允许其他中断要求同时执行。
-v 显示硬盘的相关设定。
-W<0或1> 设定硬盘的写入快取。
-X<传输模式> 设定硬盘的传输模式。
-y 使IDE硬盘进入省电模式。
-Y 使IDE硬盘进入睡眠模式。
-Z 关闭某些Seagate硬盘的自动省电功能。



Linux下也可以使用32Bit I/O和DMA。
1使用 /sbin/hdparm -c1 /dev/hda(hdb,hdc..)打开32Bit传输模式。
[root@localhost ~]# /sbin/hdparm -c1 /dev/hda

/dev/hda:
setting 32-bit IO_support flag to 1
IO_support = 1 (32-bit)

2使用命令 /sbin/hdparm -d1 /dev/hda(hdb,hdc...)打开DMA。
[root@localhost ~]# /sbin/hdparm -d1 /dev/hda

/dev/hda:
setting using_dma to 1 (on)
using_dma = 1 (on)


3最后使用 /sbin/hdparm -k1 /dev/hda 以使硬盘在Reset之后保持上面的设定。
[root@localhost ~]# /sbin/hdparm -k1 /dev/hda

/dev/hda:
setting keep_settings to 1 (on)
keepsettings = 1 (on)


这么一来,硬盘读写速度应该可以提高。


[root@localhost ~]# hdparm -t /dev/hda

/dev/hda:
Timing buffered disk reads: 44 MB in 3.04 seconds = 14.50 MB/sec


但是,上面的设置只是对当前的系统有效,当再次重启系统时,又得重新设置了。
如果要使每次系统启动时都打开DMA,可以在/etc/rc.d/rc.local文件中添加上面的命令来实现:

[root@anima lwg]# echo "/sbin/hdparm -c1 -d1 -k1 /dev/hda" >> /etc/rc.d/rc.local
[root@anima lwg]#

【赛迪网-IT技术报道】目前很多朋友都用上了大容量的DMA或UDMA-33标准的硬盘。在微软的Windows98下为了使得DMA或UDMA-33标准的硬盘提高数据传输速率,可以在计算机的CMOS或操作系统中打开IDE硬盘的DMA(直接存储器存取)这项功能。但是在Linux平台中,Linux是不会自动的打开DMA模式,所以在Linux中使用这些IDE接口的UDMA-33标准的硬盘感觉数据传输远远没有在Windows中快。事实上,Linux平台中也可以通过软件来打开DMA模式,以下就是Linux下的硬盘提速的具体做法。

首先,在Linux下打开DMA模式之前,最重要的事情就是备份硬盘上的数据。因为在开启DMA模式之后谁也无法预料到硬盘是否还能正常工作,数据是否还完整。把Linux下所有的重要数据备份到其他硬盘或是CD-R等存储媒介上是最好的选择,请不要把数据备份在同一块硬盘上,更不能把数据备份到同一个硬盘分区。

第二步需要修改hdparm目录下的一些设备节点参数。但是修改这些参数必须以超级用户(ROOT)的身份登陆Linux系统才行。普通Linux用户没有这个权限修改hdparm目录下的东西。下面就是一个修改硬盘设备节点参数的例子,注意,不同型号,不同容量的硬盘可能列出的参数不太一样,但是修改的过程和方法大体上是一样的。

# /sbin/hdparm /dev/hda

/dev/hda:

multcount = 0 (off)

I/O support = 0 (default 16-bit)

unmaskirq = 0 (off)

using_dma = 0 (off)

keepsettings = 0 (off)

nowerr = 0 (off)

readonly = 0 (off)

readahead = 8 (on)

geometry = 629/240/63, sectors = 9514260, start = 0

#

要注意的是,OFF代表此参数不起作用,ON表示打开此功能或模式。上面的参数列表写的非常清楚,Multcount(多扇区读) 没有打开;此硬盘格式为16位格式;DMA数据传输模式没有打开。很显然,这样的参数并没有使硬盘达到最佳的优化,没有能完全发挥当今高速IDE硬盘的性能。

为了优化硬盘,提高硬盘的数据传输速率,首先还是要了解以下这些参数的含义:

c3 :就是把硬盘的16位格式转换为32位模式。

m16 :改变硬盘的多路扇区的读功能,-m16可以使得硬盘一次读入16个扇区的数据。但是不是所有的硬盘都支持这个功能。使用hdparm -i /dev/hda 可以察看您的硬盘最大能读写的扇区数目。

d1X34:在支持DMA-capable的硬盘中,这个参数可以支持双DMA通道的数据传输模式。

d1X66:在支持UDMA-capable的硬盘中,这个参数可以支持双DMA通道的数据传输模式。

了解以上参数的作用和含义之后,现在请您仔细检查硬盘上面上的标签,看看您的硬盘是否支持DMA 或者 UDMA模式,然后才对照这些参数来优化您的硬盘,以防出现不可预见的错误。

优化硬盘的参数,也可以参考下面的例子,注意,不是所有的硬盘都适用一下的优化参数,请按照实际情况来设置参数:

# hdparm -d1X66 -m16 -c3 /dev/hda

# hdparm /dev/hda

/dev/hda:

multcount = 16 (on)

I/O support = 3 (32-bit w/sync)

unmaskirq = 0 (off)

using_dma = 1 (on)

keepsettings = 0 (off)

nowerr = 0 (off)

readonly = 0 (off)

readahead = 8 (on)

geometry = 629/240/63, sectors = 9514260, start = 0

修改完这些参数之后,有时候并不能一次性把硬盘优化成功。如果在硬盘还在正常工作的时候修改这些数据,硬盘会进入“休眠”状态。这就需要等硬盘灯会熄灭,硬盘不处于繁忙状态下优化硬盘参数比较容易成功。

hdparm的改变是一个临时的状态,下次再次启动Linux系统的时候hdparm将会消失。所以要想永久的保存修改后的信息,就必须把修改后的参数和数据写入/etc/rc.d/rc.local或者/etc/rc.local文件,甚至比启动过程要早运行的程序中。

最后要提醒大家的是,如果您的主板的芯片组或Linux内核kernel(比如内核kernel版本过于陈旧,2.2版以前)如果不支持UDMA模式,那就没有必要去修改硬盘设备的参数了。升级主板或者kernel是解决这个问题的较好选择。



hdparm -tT /dev/hda 测试硬盘速度
hdparm -A1 /dev/hda 开启硬盘预读取功能
hdparm -c3 /dev/hda 开启硬盘32位
hdparm -d1 /dev/hda 开启DMA
-d 和 -A 参数对IDE硬盘读写性能影响最大


hdparm - 获取/设置硬盘参数
总览
hdparm [ -a [扇区数] ] [ -A [0|1] ] [ -c [芯片组模式] ] [ -C ] [ -d [0|1] ] [ -f ] [ -g ] [ -i ] [ -k [0|1] ] [ -K [0|1] ] [ -L [0|1] ] [ -m [扇区数] ] [ -p [0|1|2|3|4|5] ] [ -P [扇区数] ] [ -q ] [ -r [0|1] ] [ -S [超时] ] [ -T ] [ -t ] [ -u [0|1] ] [ -v ] [ -W [0|1] ] [ -X [传输模式] ] [ -y ] [ -Y ] [ -Z ] [设备] ..
描述
hdparm 提供一个实现各种硬盘控制动作的命令行接口,它由内建 Linux IDE/ST-506设备驱动程序支持.要实现这种功能需要Linux 核心版本为1.2.13或更高.在早期的核心下有一些选项可能不能正 常工作.另外,一些选项只是为包含了新的IDE设备驱动程序的核心 所支持,像2.0.10版或者更高版本的核心.如果hdparm程序是在使用 旧的核心文件(在目录usr/include/linux下)的机器上被编译的,这 些选项将无法获得.
选项
当未给出标记时, -acdgkmnru 被作为假设值 (除非一个给定的设备是SCSI设备或某种老式 XT型MFM/RLL,在这种情况下 -gr 和 -adgr 分别是默认值).
-a
为文件系统提前获得/设置扇区号,可以用来改善连续读取大文件时的系统性能,具体方式为提前读取额外的预期中正在运行的任务所需要的 数据块.在当前核心版本(2.0.10版)中默认设置为8个扇区(4KB).对于 大多数用途,这个值看起来不错,但在一个大多数文件访问行为是随机 搜索的系统中,设置一个小一些的值可能效果会更好.当然,很多 IDE驱动器也有一个独立的内建的预读功能,这在很多情况下可以缓解 对文件系统预读功能的需求.
-A
关闭/打开IDE驱动器预读功能(通常默认为打开).
-c
查询/打开(E)IDE 32-bit I/O 支持.一个数字的参数可以被用来 打开/关闭32-bit I/O 支持.当前支持的值包括 0 关闭 32-bit I/O 支持, 1 打开 32-bit 数据传输, 和 3 以一个芯片组要求的特殊的 sync 流程打开 32-bit data 传输. 值 3 几乎对所有的32-bit IDE 芯片组起作用,但导致稍微多一些的系统开销. 注意,32-bit数据传输仅仅用于通过PCI或VLB总线与接口卡的连接; 所有的IDE驱动器通过排线从接口卡获得的连接仅为16-bit.
-C
检查当前IDE能耗模式状态, 结果将是下面几种之一未知 (驱动器不支持此命令), 活动/闲置 (普通操作), 待机 (低能耗模式,驱动器待机), or 睡眠 (最低能耗模式, 驱动器被完全关闭). 选项 -S, -y, -Y, and -Z 用来操纵能耗模式.
-d
为驱动器关闭/打开 "using_dma" 标志. 此选项仅对一些支持 DMA并且对于IDE驱动程序来说是已知的驱动器-接口组合 (包括所有被支持的XT接口).特别的,Intel Triton 芯片组 能和很多驱动器一起实现总线控制 DMA 操作.(根据实验).使用 -X34 选项与 -d1 选项组合确保驱动器自身是为多字DMA模式2设计的. 使用DMA不一定对吞吐量或系统性能有改进,但很多人信赖它.
-E
设置光盘驱动器速度.对于一般性操作这不是必须的,因为驱动器将自动地自行选择自己的速度.如果你想要使用它,就在选项后提供一个数字,通常是2或4.
-f
当设备退出时同步并刷新指针高速缓存.此操作也作为选项 -t 和 -T 定时的一部分被执行
-g
显示驱动器物理位置(柱面,磁头,扇区),设备的大小(以扇区为单位), 以及相对于驱动器起始的设备偏移量(以扇区为单位).
-h
显示简要使用信息(帮助).
-i
显示引导驱动器时获得的识别信息,如果有的话. 这是一种现代IDE驱动器特性,可能不被较老式的设备支持. 返回的数据可能是或不是当前的,这取决于自系统引导后的行为. 然而,当前的复合模式的扇区计数始终被给出. 要获得更多的关于识别信息的详细阐释,请查阅 AT Attachment Interface for Disk Drives (ANSI ASC X3T9.2 working draft, revision 4a, April 19/93).
-I
直接从驱动器获取识别信息, 并以原始的,未经过修改和更正的形式显示. 否则便与选项 -i 相同.
-k
获得/设置驱动器 keep_settings_over_reset 标志. 当此标志被设置,驱动程序将在一个软性的重置后保护选项 -dmu (如同在出错恢复流程中完成的那样) 此标志默认值为关 , 以防止可能由与 -dmu 组合设置导致的驱动器重置循环. 选项 -k 应该仅在你确信用一组选定的设置进行正确的系统操作之后被设置. 实际中,校验驱动器能够读/些并且在此过程中没有出错记录(核心消息, 大多数系统上/var/adm/messages中),是测试一个配置(在用-k之前)必须的.
-K
设置驱动器的 keep_features_over_reset 标志. 此项设置使驱动器在软性重置后保留 -APSWXZ 标志的设置 (如同在出错恢复流程中完成的那样). 并非所有的驱动器都支持此项特性.
-L
设置驱动器的doorlock标志. 设置为 将锁住一些移动式硬驱动器(像 Syquest,ZIP,Jazz..)的 门锁机构.设置为 一般Linux根据驱动器用法自动维护门锁机构.(当安装一个文件 系统时锁住).但在系统关闭时,如果根分区在一个移动式磁盘上, 可能会有麻烦,因为在关闭后根分区仍在处在安装状态(只读). 所以,使用这个命令在根文件系统以只读的方式重新被安装 ,用户可以在关闭后从驱动器中移走磁盘.
-m
获得/设置驱动器多重扇区I/O的扇区数.设置为 0 关闭这项特性.多重扇区模式(aka IDE Block 模式),是大多数 现代硬盘驱动器的一项特性,它允许每次I/O中断传输多个扇区, 而不是通常的一次中断一个.当这项特性被打开时,操作系统 处理磁盘I/O的开销降低30-50%.在许多系统上,它也会在任何 地方增加5% - 50% 的数据流量大多数驱动器支持最小的设置 为2,4,8或,16个(扇区).较大的设置也可能存在,这取决于驱 动器.在许多系统上设置为16或32看起来是最理想的. Western Digital在他们的许多驱动器上推荐设置为4或8. 归因于微小的(32kB)磁盘缓冲和非最优化的缓冲算法. 选项 -i 被用来查出一个已安装驱动器支持的最大设置 (在输出中查找 MaxMultSect 值).一些驱动器声称支持多重扇区模式, 但在某些设置下丢失数据.在极少的情况下,这样的失败会导致 严重的文件系统损坏.
-p
尝试为指定的PIO模式对IDE接口芯片重编程,或者尝试为驱动器支持 的最佳的PIO模式进行自动调整.核心中仅针对于一些"知名"的芯片组支持这项特性,甚至这种支持不一定是最好的.一些IDE芯片组不能为 一个单一的驱动器改变PIO模式,在这种情况下此选项可能导致PIO 模式的设置影响到 两个 驱动器.许多IDE芯片组支持少于或多于标准的六个(0到5)PIO模式, 所以实际实现的精确速度设置将由芯片组和驱动器复杂的配合改变. 谨慎使用. 这项特性不包含任何针对不谨慎的保护措施,一个不成功的结果 可能导致 严重的文件系统损坏.
-P
为驱动器的内部预读机制设置最大扇区数. 不是所有的驱动器都支持这项特性.
-q
安静的操作下一个标志,压制正常输出. 当从/etc/rc.c/rc.local运行时,可用来减轻屏幕混乱程度. 不适用于 -i 或 -v 或 -t 或 -T 标志.
-r
获得/设置驱动器的只读标志.当被设置时,设备上的写操作被禁止.
-R
登记一个IDE接口. 危险. 参见 -U 选项获取更多信息.
-S
设置驱动器待机(低速运转)超时值. 驱动器根据此值决定在关闭主轴电机以节约能耗之前等待多长 时间(没有磁盘操作).在这种状态下,驱动器可能需要来响应一 个接下来的磁盘访问,虽然大多数驱动器要快很多.超时值的编 码有些特别.值0表示"关".值1到240被指定为5秒的倍数, 也就是超时可以从5秒到20分钟.值241到251指定30分钟的1到11倍, 也就是超时可以从30分钟到5.5个小时.值252表示超时21分钟, 253设置一个销售商定义的超时,255表示21分15秒.
-T
用于以基准测试和比较为目的的缓存读取计时.要得到有意义的结果, 应该在内存不少于2M,系统没有其它活动(没有其它活动的程序) 的条件下,重复操作2-3次.它显示了不存取磁盘直接从Linux缓存 读取数据的速度.这项测量实际上标示了被测系统的处理器,缓存 和内存的吞吐量. 如果标志 -t 也被指定,那么一个基于 -T 输出结果的修正量将被综合到 -t 操作报告的结果中.
-t
用于以基准测试和比较为目的的缓存读取计时.要得到有意义的结果, 应该在内存不少于2M,系统没有其它活动(没有其它活动的程序) 的条件下,重复操作2-3次.它显示了不使用预先的数据缓冲从磁盘 这项测量标示了Linux下没有任何文件系统开销时磁盘可以支持多快的连续数据读取.为确保测量的精确,缓存在 -t 的过程中通过BLKFLSBUF控制被刷新. 如果标志 -T 也被指定,那么一个基于 -T 数促结果的修正量将被综合到 -t 操作报告的结果中.
-u
获得/设置驱动器"不屏蔽中断"标志.设置为 1 允许驱动器在磁盘中断处理过程中不屏蔽别的中断, 它极大改善了Linux的响应性能,并排除了"串行端口溢出"错误. 谨慎使用: 一些驱动器/控制器组合不能承受可能是潜在的 I/O 增长, 而导致 严重的文件系统损坏. 特别, CMD-640B 和 RZ1000 (E)IDE 接口可能是 不可靠的 (由于某种硬件缺陷),当在早于 2.0.16 版本的核心下使用此选项时. 关闭这些接口的(通常通过设置BIOS/CMOS) IDE 预读 特性可以安全的解决这个问题.
-U
注销一个IDE接口. 危险. -R 的对应选项. 是为特别设计用来做热交换的硬件准备的(很罕见!). 使用时要有充分的知识和 非常的谨慎 ,因为它很容易终止或破坏你的系统. hdparm 的源代码包括一个 'contrib' 目录,里面有一些 用户捐赠的在一台 ThinkPad 600E的UltraBay上作热交换的记录. 自己去冒险吧.
-v
显示所有的设置, 除了 -i (像 -acdgkmnru 对于 IDE, -gr 对于 SCSI 或 -adgr 对于 XT). 这也是未指定任何标志时的默认操作.
-W
关闭/打开 IDE 驱动器的写缓存特性 (通常默认为 OFF ).
-X
为较新的 (E)IDE/ATA2 驱动器设置 IDE 传输模式 . 特别是当在一个被支持的接口芯片组(像 Intel 430FX Triton) 上打开通向一个驱动器的DMA时与选项 -d1 组合使用,在这里用 -X34 来选择多字 DMA 模式2 传输. 对于支持 UltraDMA burst timings 的系统,用 -X66 来选择 UltraDMA mode2 传输 (你需要在这之前为 UltraDMA 准备好被支持的芯片组). 另外, 几乎没有必要 使用此标志,因为大多数/全部现代 IDE 驱动器默认它们最快的
PIO 传输模式为打开. 所以摆弄它是没有必要的也是冒险的. 在支持 alternate 传输模式的驱动器上, -X 可以被 仅 用来选择模式. 在改变传输模式之前, 应该为新模式的设置给 IDE 接口跳线或编程(见 -p 标志) 以防止数据的丢失或损坏. 请非常小心地使用它! 对于 Linux 使用的 PIO 传输模式,此值就是要求的 PIO 模式号加 8. 这样, 值 09 设置 PIO mode1, 10 设置 PIO mode2,
11 设置 PIO mode3. 设置为 00 还原驱动器的默认 PIO 模式, 01 关闭 IORDY. 对于多字 DMA, 使用的值时要求的 DMA 模式号加 32. 对于 UltraDMA ,相应的值是要求 UltraDMA 模式号加64.
-y
迫使一个 IDE 驱动器立即进入低能耗 待机 模式, 通常使它低速运转. 当前能耗模式状态可以用 -C 标志来检查.
-Y
迫使一个 IDE 驱动器立即进入最低能耗 睡眠 模式, 使它完全关闭. 一个来自硬件或软件的重置 可以重新唤醒驱动器. ( 如果需要,Linux IDE 驱动器将自动产生一个重置 ).
-Z
关闭某些 Seagate 驱动器(STxxx 型?)的自动节能功能, 以防止它们在不适当的时候空转或低速运转.

BUGS
像上面提到的, -m 扇区数 和 -u 1 选项尤其要小心使用, 最好在一个只读文件系统上使用. 大多数驱动器和这些特性配合得很好,但有一些驱动器/控制器 组合不是100%兼容的.使用可能导致文件系统损坏. 请在实验之前给所有的数据作备份!

某些选项 (例如: -r 对于 SCSI) 可能在旧的核心下因为核心不 支持必要的 icctl() 而不能工作.

虽然这个命令只是为使用 (E)IDE 硬盘设备准备的,但有几个选项也能够(允许)用于带有 XT 接口的 SCSI 硬盘设备和 MFM/RLL 硬盘.

最后操作步骤简洁:
Linux下也可以使用32Bit I/O和DMA。使用
/sbin/hdparm -c1 /dev/hda(hdb,hdc..)打开32Bit传输模式,使用命令
/sbin/hdparm -d1 /dev/hda(hdb,hdc...)打开DMA。最后使用
/sbin/hdparm -k1 /dev/hda 以使硬盘在Reset之后保持上面的设定,
这么一来,硬盘读写速度应该可以提高一倍以上。

推荐阅读