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