hdparm でハードディスクを高速化する

もしハードディスクが PIOモードで動いていたらDMAモードに変更するだけで、14倍の速度アップ!

■ハードディスクの読み出し速度を測定する 

 まずは、HDDの読み出し速度を測る。

# hdparm -Tt /dev/hda

/dev/hda:
Timing cached reads: 1856 MB in 2.00 seconds = 929.07 MB/sec
Timing buffered disk reads: 10 MB in 3.48 seconds = 2.87 MB/sec

-Tスイッチは、キャッシュシステム、つまりメモリ、CPU、バッファキャッシュをテストするという意味。

-tスイッチは、キャッシュ上に無いデータを読み出して、ハードディスクのパフォーマンスをテストする。 

読み出し速度が2.87MB/秒。Ultra ATA100の理想値 100MB/秒 のたった3%かい!!

 

■HDDの設定を確認する

/dev/hdaの設定を調べる。 

# hdparm /dev/hda

/dev/hda:
 multcount    = 16 (on)
 IO_support   =  0 (default 16-bit) ←I/Oが16ビット
unmaskirq = 0 (off) ←他の割り込みタスクに対応していない
using_dma = 0 (off) ←DMAがオフになっている!(PIOモードということ)
keepsettings = 0 (off)
readonly = 0 (off)
readahead = 256 (on)
geometry = 65535/16/63, sectors = 40020664320, start = 0

 /dev/hdaのHDD情報を取得する。

# hdparm -i /dev/hda

/dev/hda:

Model=ST340016A, FwRev=3.05, SerialNo=3HS1JMCX ←ハードディスクのモデル名
Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% }
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
BuffType=unknown, BuffSize=2048kB, MaxMultSect=16, MultSect=16
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=78165360
IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
PIO modes: pio0 pio1 pio2 pio3 pio4
DMA modes: mdma0 mdma1 mdma2
UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5 ←udma5はUltra ATA100を指す
AdvancedPM=no WriteCache=enabled
Drive conforms to: device does not report version:

* signifies the current active mode ←udma5が現在の設定という意味

 シーゲートの ST340016A をホームページで検索してみると、Ultra ATA/100 インターフェースだということが分かり、udma5(Ultra ATA/100モード)で動いているので、チューニングする必要はない。

同じシーゲートの ST340016A を別のLinuxマシンで調べてみると、udma2(Ultra ATA/33)で動いていた。このマシンはマザーボードが古いので、これ以上の転送速度は出せないということなのだ。残念。

 

■チューニング実行

-u1 (unmaskirq)要求したデータがディスクから返ってくる待ち時間に、ネットワークトラフィックなど他の割り込みタスクに応答できるようになる。

-c3 (I/O support)モード3、つまり同期32ビットモードをサポート。

-d1 (using_dma)DMAモードをオンにする。-d1 でオンになる。-d0 でオフになりPIOモードに戻る。

 

 # hdparm -u1 -c3 -d1 /dev/hda

/dev/hda:
setting 32-bit IO_support flag to 3
setting unmaskirq to 1 (on)
setting using_dma to 1 (on)
IO_support = 3 (32-bit w/sync)
unmaskirq = 1 (on)
using_dma = 1 (on)

 

■チューニングの結果

HDDの読み出し速度を測る。

# hdparm -Tt /dev/hda

/dev/hda:
Timing cached reads: 1860 MB in 2.00 seconds = 931.07 MB/sec
Timing buffered disk reads: 122 MB in 3.02 seconds = 40.40 MB/sec

 読み出し速度が40.40MB/秒になり、14倍の速度アップ。

ちなみに -c 1 オプションを付けて実行して、16ビットを32ビットモードへ変更しても速度アップしない。

 

 ■/etc/rc.d/rc.localに記述しておく

再起動すると、設定がPIOモードへ戻るので、rc.localに記述しておく。

# vi /etc/rc.d/rc.local 

次の一行をお尻に追加する。

 /sbin/hdparm -u1 -c3 -d1 /dev/hda

 

■参考サイト

MySQLのパフォーマンスを向上するために

hdparm