$30 off During Our Annual Pro Sale. View Details »

eBPFをFreeBSDにポーティングしようとしている話

 eBPFをFreeBSDにポーティングしようとしている話

Talk at : OSSセキュリティ技術の会 第四回勉強会 2018年秋のBPFまつり

FreeBSDへのeBPFのポーティングの取り組みとそのユースケース(VALE-BPF)についてです。

Yutaro Hayakawa

November 05, 2018
Tweet

More Decks by Yutaro Hayakawa

Other Decks in Technology

Transcript

  1. 早川侑太朗 (慶応義塾大学)
    Mail: [email protected]
    Twitter: @YutaroHayakawa
    1
    eBPFをFreeBSDにポーティング
    しようとしている話

    View Slide

  2. 自己紹介
    名前: 早川侑太朗 (はやかわ ゆうたろう)
    職業: 修士学生 (慶應義塾大学・政策メディア研究科 2年)
    研究分野
    - 高速ソフトウェアパケット処理
    - ネットワークプログラマビリティ
    - SDN・NFV
    オープンソース活動
    - FreeBSD, Netmap, uBPF, LLVM (BPF関係)
    - Google Summer of Code 2018 (FreeBSD)
    Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 2

    View Slide

  3. 今日のお話
    1. FreeBSDへのeBPFのポーティング
    2. VALE-BPF: 高速パケット処理への応用
    Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 3

    View Slide

  4. 今日のお話
    1. FreeBSDへのeBPFのポーティング
    2. VALE-BPF: 高速パケット処理への応用
    Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 4

    View Slide

  5. FreeBSDにeBPFは必要?
    LinuxがeBPFを使ってやっていることはFreeBSDではもう大体できる(?)
    - プログラミングインターフェース, サンドボックスとしてのeBPFはやはり魅力的
    - LinuxのようにもともとあったフレームワークにeBPFを使える機能を足す
    個人的にはNetmap/VALEと組み合わせて高速パケット処理に使いたい
    Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 5
    機能 Linux FreeBSD
    ダイナミックトレーシング eBPF + kprobe / perf DTrace
    システムコールフィルタリング eBPF + seccomp MAC Framework
    トンネリング eBPF + LWT Netgraph
    高速パケット処理 (eBPF +) AF_XDP / XDP Netmap / VALE

    View Slide

  6. ポーティングにあたって必要なこと
    ライセンスの問題があるのでコードはスクラッチ
    今のeBPFにはLinux依存の機能があるで, 非依存の部分だけ取り出す
    - sk_buffを操作する命令
    - Map (e.g. dev_map sock_map cpu_map... )
    - Verifier
    FreeBSDのセキュリティ要件との折り合いをつける
    - 特権の無いユーザに対してeBPFプログラムのロードを許すか
    - Specture...
    Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 6

    View Slide

  7. generic-ebpf
    マルチプラットフォームなeBPFランタイムとサブシステムの実装
    - ユーザスペースとカーネル両方で動く
    - libebpf.so とか ebpf.ko みたいなライブラリとして使える
    Linux依存の機能を削って汎用的に使えるものをまずは目指す
    - インタプリタ・JITコンパイラ
    - Map
    - Verifier
    Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 7
    ソース: https://github.com/YutaroHayakawa/generic-ebpf

    View Slide

  8. 現在のステータス (1/2)
    サポートしているプラットフォーム
    - カーネル: FreeBSD, Linux
    - ユーザスペース: FreeBSD, Linux, macOS
    - 現状各プラットフォームごとに300行程度の小規模なグルーコード
    - それ以外の約4000行は共有
    主な機能
    - uBPFベースのインタプリタとx86-64のJITコンパイラ
    - Array map, Hash mapとそのPer-CPUバリアント
    - bpf(2)の代替としてキャラクタデバイス + ioctl(2)のインターフェース
    - Verifierはまだ...
    Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 8

    View Slide

  9. 現在のステータス (2/2)
    FreeBSD側への働きかけ
    - LLVMの(e)BPFバックエンドは追加済み (デフォルトではOFF)
    - BSDCan2018にて講演 (https://youtu.be/4vGZm2qlEBY)
    - GSoC2018のプロジェクトとして採択
    (https://wiki.freebsd.org/SummerOfCode2018Projects/eBPF
    )
    - マージに向けて現在も開発中
    ユースケース案募集中
    Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 9

    View Slide

  10. 今日のお話
    1. FreeBSDへのeBPFのポーティング
    2. VALE-BPF: 高速パケット処理への応用
    Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 10

    View Slide

  11. 汎用OS上のソフトウェアパケット処理の問題
    Ethernetの高速化 (10G, 40G, 100G ...)
    ワイヤーレートを出すには? (10Gの場合)
    - 最小フレームサイズ (64B) で1パケットの処理にかけられる時間は67.2ns
    - 参考値: システムコール1回: 41.85ns, キャッシュミス1回: 32ns
    従来のrawパケットIOフレームワーク(raw-socket, cBPF, tap...)の限界が浮き彫りに
    - Per Packetのシステムコール (read/write), メモリコピー, 動的メモリ確保
    抜本的なOSの仕組みの見直しが必要に
    Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 11
    参考:http://netoptimizer.blogspot.com/2014/05/the-calculations-10gbits-wirespeed.html

    View Slide

  12. Intelの解法: DPDK (Data Plane Development Kit)
    ポーリング (⇔割り込み駆動) によって高速なパケットIOを実現
    - パケットIOのためにCPUを占有
    - CPU使用率は常に100%
    カーネルの機能を殆ど使わず, デバイスドライバをユーザス
    ペースで実装
    - いわゆる「カーネルバイパス」
    とにかく速さを追求した設計
    Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 12
    App
    DPDK Library
    Poll Mode Driver User
    Kernel
    NIC
    Protocol
    Stack

    View Slide

  13. Linuxの解法: XDP (eXpress Data Path)
    カーネルバイパスを避け, デバイスドライバでパケットをフック
    - eBPFを使ってパケット処理を記述
    - 他のNICにパケットをリダイレクトできる
    - プロトコルスタックを使った処理にフォールバック可能
    ユーザスペースにパケットをリダイレクトする機能 (AF_XDP)
    - 次世代Raw Socket
    XDPのハードウェアオフローディングができる製品も...
    - Netronome Agilio シリーズ
    Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 13
    App
    Driver
    User
    Kernel
    NIC
    eBPF
    AF_XDP
    Protocol
    Stack
    NIC

    View Slide

  14. FreeBSDの解法は?

    View Slide

  15. FreeBSDの解法1: Netmap
    NICのパケットバッファをユーザスペースにmmap
    - バッチング
    - ゼロコピーパケット転送
    - 静的にパケットバッファを確保
    FreeBSDには2011年から標準で入っている
    LinuxのAF_XDPやDPDKなどと似た機能
    Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 15
    Kernel
    User
    NIC Driver
    NIC Packet
    Buffer
    mmap’ed
    Shared Memory
    App
    /dev/netmap
    Kick
    TX/RX
    ioctl()

    View Slide

  16. FreeBSDの解法2: VALE (Virtual Local Ethernet)
    Netmapベースの高速カーネル内スイッチ
    スイッチングロジックをカーネルモジュールで変えられる
     → パケットバッファやその他メタデータを受け取って出力ポートの番号を返す関数
    LinuxのXDPと似た機能
    Yutaro Hayakawa | eBPF implementation for FreeBSD 16
    Kernel
    User
    netmap API netmap API
    mylookup
    uint32_t
    mylookup(struct nm_bdg_fwd *ft, uint8_t *dst_ring,
    struct netmap_vp_adapter *na, void *private_data)
    {
    struct ip *iph;
    iph = (struct ip)(buf + ETHER_HDR_LEN);
    if (iph - ft->ft_buf > ft->ft_len) {
    return NM_BDG_DROP;
    }
    return ntohl(iph->ip_dst) & 0xff;
    }
    mymodule.ko
    VALE
    Physical NIC
    VALE Port
    VALE Port

    View Slide

  17. VALEの欠点
    VALEモジュールを書くのはしんどい
    - カーネルの動きを強く意識して書く必要がある
    - 割り込みコンテキストとシステムコールコンテキストの区別
    - ロックの使い分け
    自由度が高すぎる
    - カーネル内の機能は使い放題
    - 逆にカーネルを壊し放題できてしまう
    Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 17

    View Slide

  18. VALEの欠点
    VALEモジュールを書くのはしんどい
    - カーネルの動きを強く意識して書く必要がある
    - 割り込みコンテキストとシステムコールコンテキストの区別
    - ロックの使い分け
    自由度が高すぎる
    - カーネル内の機能は使い放題
    - 逆にカーネルを壊し放題できてしまう
    Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 18
    ここでeBPFが使えれば素敵なものができるのでは??

    View Slide

  19. VALE-BPF
    カーネルモジュールを書く代わりに
    eBPFでVALEのス
    イッチングロジックが書ける
    VALEモジュールの中でeBPFのフックを実行
    - VALE側に変更を加えずに実装可能
    - JITを使えばパフォーマンス低下は少ない
    FreeBSDでのeBPFのユースケースとして提案中
    Yutaro Hayakawa | eBPF implementation for FreeBSD 19
    Kernel
    User
    netmap API netmap API
    vale-bpf.ko
    VALE
    eBPF lookup logic
    Physical NIC
    eBPF Program
    ソース: https://github.com/YutaroHayakawa/vale-bpf
    VALE Port VALE Port

    View Slide

  20. パフォーマンス
    End-to-endのスループットを2つのケースでベンチマーク
    - Swap MAC: MACアドレスのsrcとdstをスワップしてフォワード
    - No Logic: パケットには触れずに右から左にフォワード
    生のVALEモジュールの場合と比べおよそ9%ほどのパフォーマンスペナルティ
    XDPに比べて2%ほどのパフォーマンスゲイン
    Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 20
    Swap MAC [Mpps] No Logic [Mpps]
    VALE 14.88 (wire rate) 14.88 (wire rate)
    VALE-BPF 13.58 13.62
    XDP (redirect_map) 13.33 13.36
    pkt-gen
    TX
    pkt-gen
    RX
    vale
    vale-bpf
    xdp
    10GbE
    10GbE
    Machine1 Machine2

    View Slide

  21. まとめ
    1. FreeBSDにとってもeBPFは魅力的な技術である
    2. generic-ebpfというプロジェクトがFreeBSDマージに向けて進行中
    3. ユースケースとして高速パケット処理基盤 VALE-BPFを提案中
    Yutaro Hayakawa | eBPFをFreeBSDにポーティングしようとしている話 21

    View Slide