- [x] [bug] registryのagent idが空問題 - [ ] [bug] なぜかagentを停止したときに対抗のagentがregistryから削除される? - そんなことはなさそう? - [ ] [bug] update ping listがn秒おきにupdateされるがそれまでは、起動したagentがregistrtに登録しても反映されずproberが動かない。 - エラーにならないならよさそう。 - [ ] [bug] まれに probe timeoutする。ack1だけ届かないことがある。 - `DBG [prober]: Context timed out/cancelled while waiting for ACKs error="context deadline exceeded" ack1Rcvd=false ack2Rcvd=true flowLabel=6 27089 seqNum=1530 srcGID=fe80::5e25:73ff:fef7:1e5a srcQPN=81675 targetGID=fe80::c670:bdff:fe1c:e3e targetQPN=8118` - [ ] [feat] otel-collector-victoriametricsにデータ追加 - attributes設計 - [ ] [feat] grafanaで表示 - とりあえずClusterView dashboard - [ ] [feat] analyzerを実装 - victoriametricsに20秒おきに問い合わせ - 異常RNICの特定 - AlertManager経由でアラート送信 - PromQLだけで集計できるならAlertManager -> VMだけでいいかもしれない - tracerouteのデータが入るなら、どうやるか - [ ] [feat] ebpf service tracing - [ ] [feat] サービスフローの送信元QPNでのプローブ送信: Prober.ProbeTarget で指摘した通り、サービスプローブは理論上、そのサービスが使用している実際のQPN(通常はRC QP)から(またはそれに関連付けられたUD QPから)送信されるべきです。現在のRDMA層と AgentState.GetSenderUDQueue() の仕組みでは、汎用のUDキューしか使えません。これを解決するには、RDMA送信パスのより高度な制御 (特定のローカルQPNを指定して送信する機能) が必要になります。現状では、プローブパケットの送信元QPNは実際のサービスフローのQPNとは異なります。 - [ ] agent_state.go -> agent/state.go へ移動。 - [x] [bug] proberDelay_ns がマイナスになる DBG [prober]: Probe completed successfully with both ACKs actualDstGID=fe80::c670:bdff:fe1c:e3e networkRtt_ns=106642 proberDelay_ns=-121849016 respo nderDelay_ns=270979 seqNum=5270 - [x] [feat] metricsのラベルにdest_agent_idを含める。device nameも含める。 - [x] [feat] dst device nameだけとれていない - [x] [bug] ack順番前後対応 - [ ] [bug] shutdownがUDQueueの削除中でおわらない。 - [x] [bug] 全agentがブロック - rqlite のcleanupやめる - [ ] [bug] agentが生き残っていると、gauge メトリクスの最後に到着した値?が記録されつづけている。 - [ ] [bug] 8:25PM WRN Failed to post replacement receive buffer after processing packet error="ibv_post_recv failed for slot 2: 12" device=mlx5_2 qpn=78717 slot=2 - [ ] [bug] cq pollerに siginalが伝搬しない ## AI chat - R-pingmesh実装 https://claude.ai/chat/c0c7c2b4-69ba-4fb9-aaa7-a3a74faf1db6 - Grafana https://claude.ai/chat/c7077692-4be4-47aa-9c25-8f2bca0b30fe ## ebpf https://elixir.bootlin.com/linux/v6.14.7/source/include/rdma/ib_verbs.h#L794 ``` /* The IB spec states that if it's IPv4, the header * is located in the last 20 bytes of the header. */ ``` 後付BTF https://chatgpt.com/c/68307616-21b0-8013-8665-4a1df728f480 [bpftool-gen(8) — Arch manual pages](https://man.archlinux.org/man/bpftool-gen.8.en?utm_source=chatgpt.com) ``` sudo dnf install -y dwarves bpftool elfutils-libelf-devel kernel-devel-$(uname -r) kernel-headers-$(uname -r) llvm cp /usr/src/mlnx-ofa_kernel-24.10/ ~/ cd ~/mlnx-ofa_kernel-24.10/ ./configure --with-debug-info --kernel-sources=/usr/src/kernels/$(uname -r) --with-core-mod --with-user_mad-mod --with-user_access-mod --with-addr_trans-mod --with-mlx5-mod --with-mlxfw-mod --with-ipoib-mo make cp /usr/src/mlnx-ofa_kernel-24.10/drivers/infiniband/core/ib_core.ko ./ pahole -J --btf_base /sys/kernel/btf/vmlinux ib_core.ko readelf -S ib_core.ko | grep debug_info [85] .debug_info PROGBITS 0000000000000000 000677e4 [86] .rela.debug_info RELA 0000000000000000 008b14d0 readelf -S ib_core.ko | grep -E '\.BTF' [101] .BTF PROGBITS 0000000000000000 00f86f7d objcopy --dump-section .BTF=ib_core.btf ib_core.ko sudo mkdir -p /var/lib/btf sudo cp ib_core.btf /var/lib/btf/ib_core (ib_uverbs についても同様) ``` 最小split btfは一旦諦める。 [Making sure you're not a bot!](https://lore.kernel.org/bpf/[email protected]/) ``` $ bpftool -B vmlinux.min.btf gen min_core_btf ib_core.btf ib_core.min.btf rdmatracing_x86_bpfel.o ``` https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/tree/tools/bpf/bpftool/btf.c#n969 ``` $ bpftool btf dump file ./ib_core.ko -b /sys/kernel/btf/vmlinux {"error":"failed to load BTF from ./ib_core.ko: Invalid argument"} ``` https://chatgpt.com/c/68317b0f-fc34-8013-9857-3e6c85926335 完全分割btfの作成 ``` # 各モジュールを分割BTFとして生成 pahole -J --btf_base /sys/kernel/btf/vmlinux module1.ko pahole -J --btf_base /sys/kernel/btf/vmlinux module2.ko # BTFセクションを抽出(分割BTFとして) objcopy --dump-section .BTF=module1_split.btf module1.ko objcopy --dump-section .BTF=module2_split.btf module2.ko ``` ``` sudo cp -R /lib/modules/5.14.0-503.38.1.el9_5.x86_64/extra/mlnx-ofa_kernel ~/mlnx-ofa_kernel.bk/ sudo cp /usr/src/ofa_kernel-24.10/source/drivers/infiniband/core/ib_core.ko /usr/src/ofa_kernel-24.10/source/drivers/infiniband/core/ib_uverbs.ko /lib/modules/$(uname -r)/extra/mlnx-ofa_kernel/drivers/infiniband/core/ sudo systemctl stop rdma opensm ibacm rdma-ndd srp_daemon 2>/dev/null sudo modprobe -r nvidia_peermem sudo modprobe -r rdma_ucm sudo modprobe -r mlx5_ib sudo modprobe -r ib_ipoib sudo modprobe -r ko2iblnd sudo modprobe -r iw_cm sudo modprobe -r ib_umad sudo modprobe -r ib_cm sudo modprobe -r ib_uverbs sudo modprobe -r ib_core sudo depmod -a sudo modprobe ib_uverbs sudo modprobe ib_core lsmod | grep -E "(ib_uverbs)|(ib_core)" dmesg | tail -n 50 sudo modprobe ib_cm sudo modprobe ib_umad sudo modprobe iw_cm sudo modprobe ko2iblnd sudo modprobe ib_ipoib sudo modprobe mlx5_ib sudo modprobe rdma_ucm sudo modprobe nvidia_peermem sudo systemctl start rdma opensm ibacm rdma-ndd srp_daemon 2>/dev/null ``` ``` $ sysctl net.ipv4.conf.all.accept_local net.ipv4.conf.all.accept_local = 1 $ sysctl net.ipv4.conf.all.arp_ignore net.ipv4.conf.all.arp_ignore = 1 $ sysctl net.ipv4.conf.all.rp_filter net.ipv4.conf.all.rp_filter = 0 ```