TGTGInsighttelegram intelligenceLIVE / telegram public index
← Welcome to the Black Parade
Welcome to the Black Parade avatar

TGINSIGHT POST

Post #1022

@TheB1ackParade

Welcome to the Black Parade

Views3,770Post view count
PostedMar 2003/20/2026, 11:28 AM
Post content

Post content

虽然最近没有太多分享欲,因为下班时间过于充实了,到家先玩 Diablo2(好玩到时光倒流,我在童年流连忘返),然后看 Invincible 漫画(感情细腻,群像精彩,想象力也不错,节奏也很抓人),然后做锻炼(年度计划之一是让胸更大),洗澡后用平板看编程书(虽然智力平平只能慢读慢想慢消化,但我完全不焦虑,每有会意便欣然忘食,感叹计算机的神奇有趣),然后就已经到 1am 之后了,必须立刻睡觉…… 但是还是有很多有趣的发现,比如: 1. cgroup/sock_release (BPF_CGROUP_INET_SOCK_RELEASE) 这个 bpf hook 常常被用来作为 socket 生命周期结束的回调,比方说,比方说哈,我有一个 bpf_iter/tcp 的程序,每分钟扫一次 userspace ipv4 tcp sockets 并加入一个 map,然后在 cgroup/sock_release 里从 map 里删除 socket,理论上已经包圆了 socket lifetime,map 里加入的 socket 应该都会随着 fd close 而删除。结果你猜怎么着,居然 socket lick 了,啊不是,leak 了,原因是在 process 调用 close(fd),触发 cgroup/sock_release bpf 之后,socket (tcp state == ESTABLISHED) 依然有一小段时间是可以被 bpf_iter/tcp 扫到的,在这个 race window 里不幸被加入 map 的 socket 已经错失了 cgroup/sock_release hook,永不释放。 ref: https://elixir.bootlin.com/linux/v6.12.77/source/net/ipv4/af_inet.c#L419 2. 用户态的 bpf map iteration syscall command BPF_MAP_GET_NEXT_KEY,是不保证能够完整 dump 出 map 的,因为在 userspace iter map 的时候很可能内核态 bpf prog 会并发新增 map entry (都不需要删),导致 internal bucket 变化,导致 iter 到重复的 key、漏 key、提前终止、啥都可能。用 BPF_MAP_LOOKUP_BATCH 单一 syscall 全量 dump map 会好很多,因为会锁 bucket,所以不会漏 key。这里也是一个使用 RCU 的完美场景,正好和最近的学习搭上了。 ref: https://elixir.bootlin.com/linux/v6.12.77/source/kernel/bpf/hashtab.c#L1717 3. 内核虽然没有一个 watch cgroup v2 增删 dir 的 syscall,但 tracepoint:cgroup:cgroup_mkdir / rawtracepoint:vmlinux:cgroup_mkdir 系列提供了很好的功能,使用下来也没有槽点,在 k8s 集群里只看 cgroup path basename 就能解出 container ID,然后 socket 在内核里又天然和 cgroup 强绑定的,再借助 cgroup/skb hook,我们可以建立起 skb -> sk -> cgroup -> container -> pod 这一串信息,非常可靠,比用 pid / task 匹配可靠多了,现已成为我最爱的观测数据。 内核的美,我的泪,我情愿和你化作一团火焰,啊啊啊啊~啊啊啊啊~~~ 4. go 内存调优,肉搏了两个星期,现在都还有点想吐,从 150M 降到了 30M,虽然好玩,但每次看到 panel 上看到内存快要爆炸的时候内心都很绝望,顺奸理解了 rust 龙虾人,啊不是,螃蟹人。 虽然这些大部分的东西我已有耳闻,但真正落地变成工程才发现竟有这么多我并不知道的细节,我很享受这种把飘在心中的知识用脚在地上踩实的感觉,对自己的工程师身份深感自豪。