e7SATAボードを使ってSSDとHDDのリード性能をはかってみた

技術紹介

残暑お見舞い申し上げます.

さて,時節柄,自由研究よろしく,e7SATAボードによるSSDとHDDの読み出し性能をはかってみましたので,ご紹介いたします.

ちなみに,このボード+自社コアでMicron RealSSD C400から16MBのデータを読み込むときの速度は270MBps+αでした.

測定環境

今回は,e7SATAボードとZedboardを使ってはかってみました.

cb41d148025e63339059e4b8324daaab

e7 SATAボードは,”FPGAで手軽にSATAなディスクにアクセスできるようにする”を目標に,SATAポートとFMCコネクタだけを搭載したシンプルなFPGAボードです.アプリケーションを実装するメインボードと独立したボードにすることで,アプリケーションロジックの開発時にSATAに関するタイミング制約やリソース割当を考慮する必要がないというメリットがあります.アプリケーションロジックとe7 SATAボードはLVDS上のUPLでデータをやりとりします.

今回は,測定用のロジックを全部FMC子ボードであるe7SATAボード上のFPGAに実装し,SATAのFISパケットの生成や制御はZedboardボードのZynq上で走るLinuxから実行することにしました.Zynq,便利だなあ…

システムを構成するコンポーネントは↓のような感じ.XillinuxとXillybusを使ってZynq上のソフトウェアとUPLで接続されたロジックコンポーネントをつないでいます.

bd03cbe98bb6b61adaed3b0831cb472e

e7SATA IPコアについて

もうちょっとだけ前置きが続きますが,e7SATA IPコアについて少々.

e7SATA IPコアはSATAなディスクにアクセスするためのIPコアです.ディスクとの接続の初期化に必要なOOB制御や,データ転送時のデータのスクランブル/デスクランブル,CRC処理などを司ります.e7SATA IPコアを使えば,ユーザ(ロジック)はFISデータをUPLパケットとしてコアに送り込むだけでディスクにアクセスできます.

f562339f83295b01cada9673fe581805

逆に言えば,コマンド層以上の,FISを使ったアプリケーション部分に関しては自分で作らなきゃいけないわけですが…

今回は,SATAコアに読み出しリクエストを発行するタイミングからリクエストに応じたデータが帰ってくるまでの時間を計測しました.つまり,(1)UPL0経由でコアにDMAリードリクエストを送り,(2)コアがそのコマンドをディスクに送り,(3)ディスクから送られてきたデータをコアが処理して,(4)最終的にUPL2経由で出力し終えるまで,のトータルの時間です.

結果

お待ちかねの(?),測定結果の発表です.測定に使ったディスクは

  • Micron RealSSD C400 (SSD)
  • Intel SSD 330 Series (SSD)
  • Fujitsu MHZ2080BK G2 (HDD)

です.なお,結果は,あくまで一測定事例であることにご注意ください.

読み出しにかかった時間

結果の生データは↓の通りです.値はユーザクロックである75MHzでまわるカウンタのカウンタ値で,それぞれ10回の測定結果の最大最小をのぞいて平均したものです.ただし,HDDは,あるアドレスのデータを指定した1回目と2回目以降で大きな差があったため,1回目の測定結果と2回目以降10回の平均データを測定値としています.

       Data (Bytes)              Micron              Intel        Fujitsu(1回目)    2回目以降   
16384 17847 89086 22631699 8991
32768 21162 96576 22406493 18937
65536 29708 100863 22166764 22291
131072 47279 117734 22267025 39351
262144 81721 152894 22361292 73668
524288 150623 220313 22714070 139418
1048576 288487 359220 24054287 1328815
2097152 564220 636032 24851922 2510372
4194304 1115403 1189188 27255657 5043538

 

HDDの読み取り時間が圧倒的に短くなるのはキャッシュの効きだと思われますが…効果覿面ですね.といいつつも連続で1MB(=2048セクタ)以上読むときには,がくっと性能が下がるという結果がみてとれたのですが… 

スループットを計算してグラフにすると,↓のように.そこそこの性能がでている…でよさそうです.

e08fe22135144d504cfa3bda857987a9

もう少し細かく

せっかくなので,もう少し細かく見てみましょう.というわけで,Chipscopeで,どんな風にデータがでてきているのかみてみました.

まずは,データリクエストを仕掛けてからデータがでてくるまでの一連の様子をみてみたところです.Micronのディスクへのアクセスです.

d375a151cc819a30abafdf986b343007

最初のデータがでてくるまでに,とっても時間がかかった後,バースト的にデータがでてきます(コア内部で,そうしているから,なのですが.).

SATAのパけット単位であるFISのペイロードは最大2048DWORDS(8192KB)です.そのため8KBを超えるデータを要求した場合には,複数のFISに分けてデータが出力されています.その様子が↓の通り.

2d89b64b6cc3de823b1e3cca46577c5d

隙間なくデータが並んでやってきている様子が見えます.

HDDではどうか,というのを見てみたのが次のキャプチャ.(おそらく)キャッシュにのっていない場合,ぽこぽことデータがやってきます.

1e34ce9ec0908d73da53179f88880705

たしかに,これでは速度がでない気がします.

しかして,同じセクタに続けてアクセスしたときの様子が↓の通り.

0a89c99bdcb7dd6efb29a5a0badf9ea5

これなら,速そうですね!!

さいごに

e7SATAボード(+ e7SATA IPコア)を使って,SSD/HDDからデータを読み出すのにかかる時間をはかってみました.ある程度まとまったサイズのデータであれば,250MBps程度のスループットで高速に読み出すことができそうだ,ということがわかりました.これで,大量のデータの読み込みが必要なFPGAアプリケーションも怖くない!?

ちなみに,実際の用途ではFMC越しでメインボードに転送して処理しなければなりません.FPGA内部のブロックRAMやe7SATAボード上のDRAMを使うなどして限られたボード間転送帯域を効率よく使うことが肝要ですね.

コメント

タイトルとURLをコピーしました