FPGAでNVMeストレージを高速化:ハードウェアアクセラレーションの実践

NVMeプロトコルは低遅延という特性によりSSD性能を最大限引き出しますが、従来のCPUベースのキュー管理と割り込み処理ではボトルネックになりがちです。XilinxのNVMe Host Accelerator(NVMeHA)IPコアは、これらの負荷のかかる処理をFPGA側にオフロードすることで、高スループットかつ低遅延なストレージシステムを実現します。本稿では、Nallatech 250S+(Xilinx KU15P搭載)をターゲットにしたリファレンスデザインの構築とチューニング手法を解説します。

アーキテクチャ概要:CPUからFPGAへの役割移譲

NVMeHAの核心は、CPUが担っていたI/Oキュー管理をハードウェア化することです。具体的には、複数のサブミッションキュー(SQ)およびコンプリーションキュー(CQ)に対するドアベル更新、コマンドエントリ構築、完了ステータス解析といった処理をFPGA内部の状態機械とDMAエンジンが担当します。

従来のソフトウェア駆動型の書き込み処理と比較してみましょう:

// 従来方式:CPUがすべて制御
assemble_nvme_cmd(&cmd_buf, lba, buf_ptr);
write_reg(SQ_DB_REG, next_tail);
poll_cq_for_completion();

NVMeHA導入後は、CPUは単にメモリ上にパラメータを配置するだけで済みます。FPGA側がAXIストリーム経由でデータを取得し、自動的にNVMeコマンドを構築・送信。完了通知もハードウェアが解析してホストに報告します。

AXIストリーム設計:流量制御の落とし穴

NVMeHAとのデータ転送はAXI Streamインターフェースを介して行われますが、tready信号のハンドシェイクが性能を左右します。以下は典型的な受信側インスタンス例です:

nvmeha_rx_engine #(
    .STREAM_DATA_BITS(512),
    .CTRL_CLK_FREQ_HZ(250_000_000)
) rx_path (
    .clk_i(sys_clk),
    .rst_ni(!sys_rst),
    .s_axis_tvalid(from_dma_valid),
    .s_axis_tready(to_accel_ready),  // ← 流量制御の鍵
    .s_axis_tdata(payload_data),
    .s_axis_tlast(is_last_chunk)
);

ここでto_accel_readyが長時間Lowになると、上流のDMAエンジンがストールします。対策として、FIFOバッファを2段階に増設し、突発的なトラフィックにも耐えられるようにしました。また、ドライバ側で転送サイズを4KB境界で整列させることで、断片化を回避しました。

ドアベル最適化:一括更新戦略

NVMeHAは複数のコマンドをまとめて処理することでPCIeトランザクションを削減します。ドライバ内では次のように実装されます:

void flush_sq_batch(struct nvme_queue *q) {
    u32 pending = q->prod_idx - q->cons_idx;
    if (pending >= BATCH_THRESHOLD || force_flush) {
        mmio_write32(q->db_addr, q->prod_idx);
        q->cons_idx = q->prod_idx;
    }
}

閾値BATCH_THRESHOLDは8〜32の範囲で調整可能ですが、あまり大きくするとCQの遅延が増加します。ベンチマークの結果、16がレイテンシとスループットのバランスに最適でした。FPGA内部では、この値に応じてキュー管理FSMのパイプライン段数を動的に調整しています。

互換性問題:CQ解析の思わぬ落とし穴

一部のNVMe SSD(特にPhisonコントローラ搭載品)では、CQエントリ内の予約フィールドに非標準値が入ることがあります。これにより、NVMeHAのステータスチェックモジュールが誤ってエラーと判定してしまうケースがありました。

対応策として、IPコアの生成時に以下のパラメータを無効化しました:

# IP設定ファイル (.tcl)
set_property -dict [list \
    CONFIG.CQE_RESERVED_CHECK {false} \
    CONFIG.STRICT_COMPLIANCE {false} \
] [get_ips nvmeha_core]

また、デバッグ時にはSignalTap Logic AnalyzerでCQエントリを直接ダンプし、異常パターンを特定しました。これにより、ファームウェア依存の問題とハードウェア設計の問題を明確に切り分けることができました。

タグ: Xilinx NVMe FPGA AXI ストレージアクセラレーション

6月3日 20:18 投稿