Linux下提高硬盤讀寫速度(hdparm)

http://blog.csdn.net/chenyi8888/article/details/7570660

 

 

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之後保持上面的設定,
這麼一來,硬盤讀寫速度應該可以提高一倍以上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章