hdparmでディスクのパフォーマンスチューニング
出典::
テスト環境::
条件
- 容量の違うディスク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)
- 1本目(hde)
- 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を使うアプリケーション(改竄検知ツールとか?)の場合は使えないので使いどころに注意。

