- [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
```