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

337 Views

May 30, 25

スライド概要

https://ebpf.connpass.com/event/350944/

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

XDPによる トラフィックジェネレータの話 日下部 雄也(@higebu) BBSakura Networks, Inc. eBPF Japan Meetup #4

2.

自己紹介 ● 日下部 雄也(@higebu) ● BBSakura Networks CTO ● さくらインターネット原籍 ● 北海道小樽市在住 ● 2017年からeBPF/XDPを触り始め、2019年から本番運用中 ● XDP関連の発表(古いですが) ○ JANOG45 パケット処理の独自実装や高速化手法の比較と実践 独自パケット処理の実装方法 の解説(XDP) ○ モバイルネットワークのデータプレーンをXDPで作る話 - ENOG 63 ○ XDPのテストとCI - Open Mobile Infra Meetup #4

3.

BPF_F_TEST_XDP_LIVE_FRAMES の紹介

4.

XDPとは XDP - IO Visor Project

5.

BPF_PROG_RUN ● 旧 BPF_PROG_TEST_RUN ● XDPに限らず対応する eBPF Program を実行して結果を返してくれる仕組み ● テストコードで使う ● 詳しくは https://docs.kernel.org/bpf/bpf_prog_run.html

6.

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]/

7.

BPF_F_TEST_XDP_LIVE_FRAMES の使い方

8.
[beta]
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);

9.

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)

10.

世の中での実装例

11.

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 プログラム内で動的に送信元ポートの変更が可能

12.

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

13.

自分でツール作ってみた

14.

自分でツール作ってみた ● https://github.com/higebu/xdperf ● Go で実装 ● cilium/ebpf を使っている ● IPv4/IPv6 対応 ● UDP のみ対応 ● CPU コア数指定可能 ● repeat 数を --batch-size として指定可能 ● --server でパケット受信側も起動可能 ● 詳しくは README を見てください

15.

動いている様子 送信側 受信側 $ 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... $ 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...

16.

CPU 固定もできている

17.

性能 ● さくらのクラウドの専有ホスト上のVMで、1コアで 6.5 Mpps、8コアで 54 Mpps くらい ○ 迷惑をかけないため同じホスト上のVMに対して実行したため、全ての パケットが実際にホストから出て行くかは不明 ● Intel E810が載っている物理サーバでは、なぜか4Mpps程度で頭打ちだった ○ ● 原因調査中。。。 XDP_TX も試してみたが、パケットが出なかった ○ 同じデバイスへの REDIRECT をしているだけのはず。。。

18.

まとめ

19.

まとめ ● BPF_F_TEST_XDP_LIVE_FRAMES を使うと簡単にパケット投げつけができ る ● とりあえず、動かしてみたい場合は xdp-trafficgen や xdperf を試してみて ください ● ただ、うまく動かすには、まだ課題がある。。。 ● パケット投げつけフレームワークとして便利なので、きっちり動くところま で追いたい

20.

Enabling a Connected Future.