hdparmでディスクのパフォーマンスチューニング

出典::

Open Tech Press | Linuxのパフォーマンスを改善する3つのTips

テスト環境::

CentOS5 テスト用最小インストール手順を参照。

条件

  • 容量の違うディスク2本で構成
    ・・・
    Sep 21 01:58:55 core kernel:     ide2: BM-DMA at 0xbe00-0xbe07, BIOS settings: hde:DMA, hdf:DMA
    ・・・
    Sep 21 01:58:55 core kernel: hde: IC35L120AVV207-0, ATA DISK drive
    Sep 21 01:58:55 core kernel: hdf: MAXTOR 6L080J4, ATA DISK drive
    ・・・
    
  • 既にDMA有効になっている。
    • 1本目(hde)
      IBM(現HITACHI)IC35L120AVV207-0 (120GB U100 7200 2MB 8.5ms)
    • 2本目(hdf)
      MAXTOR(現Seagate) 6L080J4(80GB U133 7200 2MB Buffer 8.0ms)
  • MBはATA100対応
    Sep 21 01:58:55 core kernel: hde: max request size: 128KiB
    Sep 21 01:58:55 core kernel: hde: 241254720 sectors (123522 MB) w/1821KiB Cache, CHS=16383/255/63, UDMA(100)
    Sep 21 01:58:55 core kernel: hde: cache flushes supported
    Sep 21 01:58:55 core kernel:  hde: hde1 hde2 hde3
    Sep 21 01:58:55 core kernel: hdf: max request size: 128KiB
    Sep 21 01:58:55 core kernel: hdf: 156355584 sectors (80054 MB) w/1819KiB Cache, CHS=65535/16/63, UDMA(100)
    Sep 21 01:58:55 core kernel: hdf: cache flushes supported
    Sep 21 01:58:55 core kernel:  hdf: hdf1 hdf2 hdf3
    
  • 既にSoftware RAID(RAID1)が構成済。
    Personalities : [raid1] 
    md0 : active raid1 hdf1[1] hde1[0]
          104320 blocks [2/2] [UU]
          
    md2 : active raid1 hdf3[1] hde3[0]
          1052160 blocks [2/2] [UU]
          
    md1 : active raid1 hdf2[1] hde2[0]
          77015488 blocks [2/2] [UU]
          
    unused devices: <none>
    

ミラーなので全体のパフォーマンスとしては性能の低い方のディスクに引きずられると思われるが、チューニングは個々のディスクに対して行う。

チューニング前状態

hdparm -v で確認

  • 1本目
    # hdparm -v /dev/hde
    
    /dev/hde:
     multcount    = 16 (on)
     IO_support   =  0 (default 16-bit)
     unmaskirq    =  0 (off)
     using_dma    =  1 (on)
     keepsettings =  0 (off)
     readonly     =  0 (off)
     readahead    = 256 (on)
     geometry     = 16383/255/63, sectors = 241254720, start = 0
    
  • 2本目
    # hdparm -v /dev/hdf
    
    /dev/hdf:
     multcount    = 16 (on)
     IO_support   =  0 (default 16-bit)
     unmaskirq    =  0 (off)
     using_dma    =  1 (on)
     keepsettings =  0 (off)
     readonly     =  0 (off)
     readahead    = 256 (on)
     geometry     = 65535/16/63, sectors = 156355584, start = 0
    

hdparm -t でテスト

  • 1本目
    # for ((i=0;i<12;i++)) do hdparm -t /dev/hde | grep "Timing buffered" | awk '{ print $11 }'; done
    54.44
    54.39
    54.47
    54.39
    54.38
    54.39
    54.39
    52.26
    54.40
    54.39
    54.39
    54.37
    
  • 2本目
    # for ((i=0;i<12;i++)) do hdparm -t /dev/hdf | grep "Timing buffered" | awk '{ print $11 }'; done
    39.72
    39.77
    39.71
    39.78
    39.80
    39.74
    39.79
    39.73
    39.79
    39.82
    39.76
    37.92
    

チューニング

32ビットモード有効化

hdparm -c3の場合

  • 1本目
    # hdparm -c3 /dev/hde
    /dev/hde:
     setting 32-bit IO_support flag to 3
     IO_support   =  3 (32-bit w/sync)
    # for ((i=0;i<12;i++)) do hdparm -t /dev/hde | grep "Timing buffered" | awk '{ print $11 }'; done
    54.41
    54.38
    54.37
    54.39
    54.37
    54.36
    54.37
    54.37
    54.39
    54.26
    54.37
    52.56
    
  • 2本目
    # hdparm -c3 /dev/hdf
    /dev/hdf:
     setting 32-bit IO_support flag to 3
     IO_support   =  3 (32-bit w/sync)
    # for ((i=0;i<12;i++)) do hdparm -t /dev/hdf | grep "Timing buffered" | awk '{ print $11 }'; done
    39.81
    39.71
    39.79
    39.79
    39.75
    39.80
    39.71
    39.79
    38.11
    39.78
    39.82
    39.74
    

-c1でも試したがほぼ同じ結果。あまり変わらなかった。

読取セクタ数

1回の操作で読み取るセクタ数を調節。まずディスク自体の最大値を確認。

# hdparm -i /dev/hdf

/dev/hdf:

 Model=MAXTOR 6L080J4, FwRev=A93.0500, SerialNo=664131732668
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }
 RawCHS=16383/16/63, TrkSize=32256, SectSize=21298, ECCbytes=4
 BuffType=DualPortCache, BuffSize=1819kB, MaxMultSect=16, MultSect=16
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=156355584
 IORDY=on/off, tPIO={min:120,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 udma6 
 AdvancedPM=no WriteCache=enabled
 Drive conforms to: ATA/ATAPI-5 T13 1321D revision 1:  ATA/ATAPI-1 ATA/ATAPI-2 ATA/ATAPI-3 ATA/ATAPI-4 ATA/ATAPI-5

 * signifies the current active mode

MaxMultSect?がディスクの最大値を示しているので、最大にするには

# hdparm -m16 /dev/hdf

とする。ただし、今回は両方のディスクともに16が最大値であり最初の時点で16になっていたのでスキップ。

先読みセクタ数

予め先読みしておいてパフォーマンスをあげる。ただし大きなファイルサイズをシーケンシャルに読む場合に有効で、小さなファイルにランダムアクセスするような場合は小さめの値がよいかもしれない。(カーネルでデフォルト値が決まっている?)

# hdparm -a256 /dev/hdf
/dev/hdf:
 setting fs readahead to 256
 readahead    = 256 (on)

元々256が設定されており、8〜2048等試してみたがあまり変化がなかった。

設定の保存

設定の恒久的な保存を行うには

# hdparm -k1 /dev/hda

とするがしばらく運用してみて確実に問題がないことを確認の上で行うこと。それまでは/etc/rc.localに

# hdparm 〜

として起動時に設定するようにしておく。

noatimeの設定

atime(ファイルの最終アクセス時間)はあまり活用されることがないため、これを無効化する

# mount -o noatime /dev/sda1 /disk1

fstabに設定する場合は

  /dev/sda1    /disk1    ext3    noatime    1    2

とかみたいに指定。

ただし、atimeを使うアプリケーション(改竄検知ツールとか?)の場合は使えないので使いどころに注意。