Upgrade to Pro — share decks privately, control downloads, hide ads and more …

XDPによるトラフィックジェネレータの話 - eBPF Meetup Japan #4/XD...

XDPによるトラフィックジェネレータの話 - eBPF Meetup Japan #4/XDP Traffic Generator

Avatar for Yuya Kusakabe

Yuya Kusakabe

May 30, 2025
Tweet

More Decks by Yuya Kusakabe

Other Decks in Technology

Transcript

  1. 自己紹介 • 日下部 雄也(@higebu) • BBSakura Networks CTO • さくらインターネット原籍

    • 北海道小樽市在住 • 2017年からeBPF/XDPを触り始め、2019年から本番運用中 • XDP関連の発表(古いですが) ◦ JANOG45 パケット処理の独自実装や高速化手法の比較と実践 独自パケット処理の実装方法 の解説(XDP) ◦ モバイルネットワークのデータプレーンをXDPで作る話 - ENOG 63 ◦ XDPのテストとCI - Open Mobile Infra Meetup #4
  2. BPF_PROG_RUN • 旧 BPF_PROG_TEST_RUN • XDPに限らず対応する eBPF Program を実行して結果を返してくれる仕組み •

    テストコードで使う • 詳しくは https://docs.kernel.org/bpf/bpf_prog_run.html
  3. BPF_F_TEST_XDP_LIVE_FRAMES flag • BPF_PROG_RUN で指定すると XDP Action が実際に実行されるようになる • XDP_PASS:

    Linux Network Stack にパケットが渡される • XDP_REDIRECT, XDP_TX: 外にパケットが送信される ◦ XDP_TX は同じデバイスでの XDP_REDIRECT となっている • つまり、トラフィックジェネレータを作ることができる • Linux 5.18 で追加された(新しくはない) • https://patchwork.kernel.org/project/netdevbpf/cover/20220309105 [email protected]/
  4. C での BPF_F_TEST_XDP_LIVE_FRAMES の使い方 • bpf_test_run_opts の flags に BPF_F_TEST_XDP_LIVE_FRAMES

    を入れる だけ • Libbpf userspace function 'bpf_prog_test_run_opts' - eBPF Docs struct bpf_test_run_opts opts = { .data_in = &packet_data, .data_size_in = sizeof(packet_data), .ctx_in = &xdp_md, .ctx_size_in = sizeof(xdp_md), .repeat = 1, .flags = BPF_F_TEST_XDP_LIVE_FRAMES, }; err = bpf_prog_test_run_opts(prog_fd, &opts);
  5. Go での BPF_F_TEST_XDP_LIVE_FRAMES の使い方 • cilium/ebpf でXDPプログラムをロードし、Run() するときに RunOptions で

    Flags に BPF_F_TEST_XDP_LIVE_FRAMES を入れるだけ • https://pkg.go.dev/github.com/cilium/ebpf#Program.Run runOpts := &ebpf.RunOptions{ Data: packetData, Repeat: 1, Flags: unix.BPF_F_TEST_XDP_LIVE_FRAMES, } ret, err := prog.Run(runOpts)
  6. xdp-trafficgen • たぶん唯一の実装例 • xdp-project/xdp-tools/xdp-trafficgen • xdp-tools パッケージに入っている • 作った方による解説:

    ◦ The XDP traffic generator - /dk/tohojo/blog ◦ xdp-trafficgen-final.pdf • シングルコアで 8 Mpps、5コアで 40 Mpps 出るらしい • 特徴 ◦ IPv6 にしか対応していない ◦ 並列度を指定すると、CPU コア固定のスレッドが指定した数起動する ◦ XDP プログラム内で動的に送信元ポートの変更が可能
  7. xdp-trafficgen 手元の環境では動かなかった。。。 動かせたら、どこかで報告します。。。 Current rlimit 8354557952 already >= minimum 1048576

    Kernel supports 5-arg xdp_cpumap_kthread tracepoint Error in ethtool ioctl: Operation not supported Kernel supports 5-arg xdp_cpumap_kthread tracepoint Got 64 queues for ifname enp138s0f0np0 Driver ice on interface enp138s0f0np0 needs an xdp_pass program to use XDP_REDIRECT libbpf: elf: skipping unrecognized data section(7) xdp_metadata libbpf: elf: skipping unrecognized data section(7) xdp_metadata libbpf: elf: skipping unrecognized data section(7) xdp_metadata libbpf: elf: skipping unrecognized data section(7) xdp_metadata Couldn't attach xdp_pass program
  8. 自分でツール作ってみた • https://github.com/higebu/xdperf • Go で実装 • cilium/ebpf を使っている •

    IPv4/IPv6 対応 • UDP のみ対応 • CPU コア数指定可能 • repeat 数を --batch-size として指定可能 • --server でパケット受信側も起動可能 • 詳しくは README を見てください
  9. 動いている様子 $ sudo ./xdperf --server enp138s0f0np0 XDP server started on

    enp138s0f0np0 (idx: 4), port: 12345 Press Ctrl+C to stop 0 packets/s, 0.00 Mbps 2,776,676 packets/s, 1,355.80 Mbps 4,029,404 packets/s, 1,967.48 Mbps 4,029,626 packets/s, 1,967.59 Mbps 4,027,654 packets/s, 1,966.63 Mbps 4,023,616 packets/s, 1,964.66 Mbps 4,023,965 packets/s, 1,964.83 Mbps 4,025,379 packets/s, 1,965.52 Mbps 4,029,402 packets/s, 1,967.48 Mbps 4,025,702 packets/s, 1,965.67 Mbps 4,023,188 packets/s, 1,964.45 Mbps 2,366,188 packets/s, 1,155.37 Mbps 0 packets/s, 0.00 Mbps ^C Shutting down server... $ sudo ./xdperf -p 4 --src-ip 192.168.3.110 --dst-ip 192.168.3.111 --dst-mac 40:a6:b7:95:a2:d0 enp138s0f0np0 XDP client started on enp138s0f0np0 (idx: 4) Sending to 192.168.3.111:12345 from 192.168.3.110:12345 Press Ctrl+C to stop 3,959,202 xmit/s, 1,933.20 Mbps 4,028,898 xmit/s, 1,967.24 Mbps 4,032,016 xmit/s, 1,968.76 Mbps 4,025,294 xmit/s, 1,965.48 Mbps 4,021,760 xmit/s, 1,963.75 Mbps 4,024,561 xmit/s, 1,965.12 Mbps 4,027,391 xmit/s, 1,966.50 Mbps 4,023,185 xmit/s, 1,964.45 Mbps 4,025,774 xmit/s, 1,965.71 Mbps 4,024,898 xmit/s, 1,965.28 Mbps ^C Shutting down client... 送信側 受信側
  10. 性能 • さくらのクラウドの専有ホスト上のVMで、1コアで 6.5 Mpps、8コアで 54 Mpps くらい ◦ 迷惑をかけないため同じホスト上のVMに対して実行したため、全ての

    パケットが実際にホストから出て行くかは不明 • Intel E810が載っている物理サーバでは、なぜか4Mpps程度で頭打ちだった ◦ 原因調査中。。。 • XDP_TX も試してみたが、パケットが出なかった ◦ 同じデバイスへの REDIRECT をしているだけのはず。。。
  11. まとめ • BPF_F_TEST_XDP_LIVE_FRAMES を使うと簡単にパケット投げつけができ る • とりあえず、動かしてみたい場合は xdp-trafficgen や xdperf

    を試してみて ください • ただ、うまく動かすには、まだ課題がある。。。 • パケット投げつけフレームワークとして便利なので、きっちり動くところま で追いたい