SSDのアライメントによる速度差を追試する

SSDのアライメントとは

  • IOが物理セクタを跨ぐことで発生するパフォーマンスの低下を防ぐためのもの
    • 2048sをパーテションテーブルの先頭に、以降のパーテションも512s単位で作成
    • 現行のLinuxでは確認した限りではどれもパーテション作成時にこのルールに則って作成される
  • CentOS5時代は何も指定しない場合は純粋に利用可能セクタから割り当てられていた
    • 既に時代遅れ感があり、また結果が見えているものではあるが実学のため追試する

fio設定

  • テストコマンド
for TEST in read write
  do for NUM in {1..5}
    do echo -n "${TEST}_${NUM} :"
    fio fio.ini -rw ${TEST} | grep "iops="
  done
  echo "----------------------"
done
  • ini設定
[global]
directory=/mnt/SSD/fio/tmp/
size=500m
numjobs=8
iodepth=4
time_based
runtime=10
overwrite=1
ioengine=libaio
bs=4k
group_reporting
direct=1

[test]

アライメントせず

  • GPTのヘッダで33セクタ目まで使われているのでpartedで最小パーテションの34s目から確保
    • CentOS5時代は出ていなかったパフォーマンス警告が親切にも表示
(parted) mkpart UnAlign 34s 100%
警告: 操作の結果できるパーティションはアライメントが正しくないためにパフォーマンスがでません。
無視(I)/Ignore/取消(C)/Cancel? I
(parted) p
モデル: ATA M4-CT256M4SSD2 (scsi)
ディスク /dev/sda: 500118192s
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: gpt
ディスクフラグ:

番号  開始  終了        サイズ      ファイルシステム  名前     フラグ
 1    34s   500118158s  500118125s                    UnAlign
  • マウント
[comicsong@comicsong ~]$ sudo mkdir /mnt/SSD
[comicsong@comicsong ~]$ sudo mount -t xfs -o noatime,discard /dev/sda1 /mnt/SSD/
[comicsong@comicsong ~]$ mount | grep SSD
/dev/sda1 on /mnt/SSD type xfs (rw,noatime,attr2,discard,inode64,noquota)
  • 計測
read_1 :  read : io=857360KB, bw=85719KB/s, iops=21429, runt= 10002msec
read_2 :  read : io=856116KB, bw=85594KB/s, iops=21398, runt= 10002msec
read_3 :  read : io=859444KB, bw=85927KB/s, iops=21481, runt= 10002msec
read_4 :  read : io=850896KB, bw=85073KB/s, iops=21268, runt= 10002msec
read_5 :  read : io=856192KB, bw=85602KB/s, iops=21400, runt= 10002msec
----------------------
write_1 :  write: io=59848KB, bw=5971.7KB/s, iops=1492, runt= 10022msec
write_2 :  write: io=62172KB, bw=6200.5KB/s, iops=1550, runt= 10027msec
write_3 :  write: io=55132KB, bw=5494.6KB/s, iops=1373, runt= 10034msec
write_4 :  write: io=64960KB, bw=6484.1KB/s, iops=1621, runt= 10017msec
write_5 :  write: io=57752KB, bw=5757.1KB/s, iops=1439, runt= 10030msec
----------------------

アライメント実施

  • partedで0%指定で作成、2048s開始を確認
[comicsong@comicsong ~]$ sudo parted /dev/sda -s rm 1
[comicsong@comicsong ~]$ sudo parted /dev/sda -s mkpart Align 0% 100% unit s p | grep Align
 1    2048s  500117503s  500115456s                    Align
[comicsong@comicsong ~]$ sudo mkfs.xfs -qf /dev/sda1
[comicsong@comicsong ~]$ sudo mount -t xfs -o noatime,discard /dev/sda1 /mnt/SSD/
[comicsong@comicsong ~]$ mount | grep SSD
/dev/sda1 on /mnt/SSD type xfs (rw,noatime,attr2,discard,inode64,noquota)
[comicsong@comicsong ~]$ sudo mkdir -p /mnt/SSD/fio/tmp/
[comicsong@comicsong ~]$ sudo chmod 757 /mnt/SSD/fio/tmp/
  • 計測
read_1 :  read : io=1174.5MB, bw=120246KB/s, iops=30061, runt= 10001msec
read_2 :  read : io=1170.6MB, bw=119790KB/s, iops=29947, runt= 10002msec
read_3 :  read : io=1098.8MB, bw=112484KB/s, iops=28120, runt= 10002msec
read_4 :  read : io=987164KB, bw=98687KB/s, iops=24671, runt= 10003msec
read_5 :  read : io=1190.9MB, bw=121916KB/s, iops=30478, runt= 10002msec
----------------------
write_1 :  write: io=1116.6MB, bw=114325KB/s, iops=28581, runt= 10001msec
write_2 :  write: io=1103.9MB, bw=113009KB/s, iops=28252, runt= 10002msec
write_3 :  write: io=1121.9MB, bw=114867KB/s, iops=28716, runt= 10001msec
write_4 :  write: io=1029.8MB, bw=105419KB/s, iops=26354, runt= 10002msec
write_5 :  write: io=1121.9MB, bw=114854KB/s, iops=28713, runt= 10002msec

まとめ

  • Read,Writeともに大きな差が出た
    • 予想していたよりも大差
    • Readについては1.5倍の高速化、Writeに至っては約20倍もの差が出ている
  • 現行のLinuxではほとんどのパーテショニングツールで自動アライメントされるため意識する必要はない
    • ミドルウェア互換性などの問題で古いOSを使い続けないといけない場合は注意が必要