ssd
16K

高帯域な SSD ストライピングストレージを作る(試み)

More than 1 year has passed since last update.

漢なら SSD 並べて高帯域な SSD ストレージで 16K RAW 動画編集したいですね!

ssd.JPG

hdparm.JPG

HBA + SSD x 8 でストレージを組んでみましょう.

ハードウェア&OS構成

  • HBA カード(8 port).
  • SSD x 8(500MB/s ほどでる 256GB x 8 = 総計 2TB)
  • SandyBridge 世代マザー(PCI-Gen2) + Core i7-2600S + 16GB memory
  • CentOS 6.6

(2015 年 4 月時点で 8 port HBA + 256GB SSD x 8 で総計およそ 14 万円)

最近の Intel/AMD のマザーボードでは SATA のポートがたくさんありますが, DMI(ノースブリッジ?)を経由するので実は最大で 1GB/s くらいしかでません.
(Xeon-D ではオンボード SATA でも性能でるかもしれません. Skylake でも DMI 帯域は二倍アップにとどまるので, 2GB/s が限界です)

そこで HBA カードを PCI-ex に刺して使います.

今回は LSI SAS 9207-i8 を使いました.
HW 的には Gen3 世代では 4GB/s まで出るのが知られています(http://www.thessdreview.com/our-reviews/sata-3/lsi-sas-9207-8i-pcie-3-0-host-bus-adapter-quick-preview/3/)

HBA ファームウェアダウングレード

LSI HBA には P20 ファームウェア/BIOS が入っていますが, これは buggy であることが知られています. 実際, Linux では I/O error が発生するのを経験しました. そこで安定と言われている P19 にダウングレードしておきましょう.
FreeDOS のツールを使わないとダウングレードできないので注意しましょう(Linux から操作するツールではダウングレードはできない)

セットアップ

ディスクのパーティションを作成します.
SSD なので, fdisk に -c -u を付けて, 4K 境界に領域を作るようにしておきます(そうしないと読み書き性能が半分くらいに落ちます).

# fdisk -c -u /dev/sdX

とりあえず software raid で RAID-0 構成を組んでみます.

$ mdadm --create --verbose /dev/md0 --level=stripe --raid-devices=8 /dev/sda1 /dev/sdb1 … /dev/sdh1

計測

hdparm かけてみます.

# hdparm -t /dev/md0 

/dev/md0:
 Timing buffered disk reads: 5944 MB in  3.00 seconds = 1980.52 MB/sec

Cool!

でも理論上 3.2GB/s くらいでるはずですが, 2GB/s でした… やはり PCI-Gen2 世代だからでしょうか. とりあえずセットアップ進めます.

XFS でフォーマットしてマウントします.

# mkfs.xfs /dev/md0
# mkdir /mnt/md
# mount /dev/md0 /mnt/md

# df -h
…
/dev/md0              1.9T   34M  1.9T   1% /mnt/md

Cool! 2TB 見えました.

dd でテストしてみます.

書いてみます.

$ dd if=/dev/zero of=16GB bs=1GB count=16
16+0 records in
16+0 records out
16000000000 bytes (16 GB) copied, 8.4435 s, 1.9 GB/s

Super cool! 16GB が 8 秒ほど. これは快感ですね.

読んでみます.

$ dd if=16GB of=/dev/null bs=1GB count=16
16+0 records in
16+0 records out
16000000000 bytes (16 GB) copied, 4.93369 s, 3.2 GB/s

むむ! read は理論限界の 3.2GB/s でました! 素晴らしい. でもメモリにキャッシュされているとかでしょうかね.

並列で書き込んでみる.

64 GB を 2 プロセス同時書き込みで試してみます.

$ dd if=/dev/zero of=64GB.1 bs=1GB count=64 &
$ dd if=/dev/zero of=64GB.2 bs=1GB count=64 &

64+0 records in
64+0 records out
64000000000 bytes (64 GB) copied, 48.136 s, 1.3 GB/s
64+0 records in
64+0 records out
64000000000 bytes (64 GB) copied, 49.0994 s, 1.3 GB/s

2.6 GB/s にまで上がりました.

64GB x 2 を読み込んでみます.

$ dd if=64GB.1 of=/dev/null bs=1GB count=64 &
$ dd if=64GB.2 of=/dev/null bs=1GB count=64 &

64+0 records in
64+0 records out
64000000000 bytes (64 GB) copied, 52.8069 s, 1.2 GB/s
64+0 records in
64+0 records out
64000000000 bytes (64 GB) copied, 53.3111 s, 1.2 GB/s

2.4 GB/s. メモリにキャッシュされない実性能としてはこんなところでしょうか.

TODO

  • Gen3 世代マザーで試す
    • 理論上 4GB/s くらいでるはず
  • InfiniBand と繋いで, ネットワークで GPU 動画処理ワークステーションにデータを飛ばす
  • Xeon-D で検証したい
  • GlusterFS striping or オレオレ striping を試す.
  • スレッド書き込みとかすれば理論限界(3.2GB/s)狙えるかも.