v1
2026-10-16
memcg socket记账批量化 · v1
批量/延迟mem_cgroup_sk_charge中MEMCG_SOCK的mod_memcg_state每CPU统计,减少缓存行颠簸和记账开销。
原始补丁链接
子 Patch(5)
1/5
memcg: Remove unnecessary READ_ONCE() under memcg_stock.lock.
memcg stock 的 cached[] 已在 local_lock 下访问,consume/drain/refill_stock() 去掉多余 READ_ONCE(),避免 refill_stock() 对同一 cached[i] 两次 volatile 加载,减少热路径指令。
2/5
memcg: Reduce nesting in consume_stock() and refill_stock().
重构 consume_stock() 与 refill_stock() 的控制流以减少深层嵌套,为后续在 stock 慢路径中插入新代码做准备,逻辑不变但更易读、便于编译器优化。
3/5
memcg: Annotate slow paths in consume_stock() and refill_stock().
在 consume_stock()/refill_stock() 的槽耗尽、溢出、大请求、trylock 失败和缓存不足分支加 unlikely(),阻止 css_put()/drain_stock() 内联进热路径,使 fast path 顺序执行 local_unlock() 并落到函数尾部。
4/5
memcg: Batch mod_memcg_state() for MEMCG_SOCK.
把 MEMCG_SOCK 批量化到 per-CPU memcg_stock,合并 mod_memcg_state()/rstat 更新,消除 mem_cgroup_sk_charge() 中 vmstats_percpu 与 stats_updates 的缓存未命中,降低 TCP 热路径开销。
5/5
selftests: cgroup: Deflake test_memcg_sock() in test_memcontrol.c.
MEMCG_SOCK 批处理后,test_memcg_sock() 因 rstat 异步刷新和 stock->nr_sock[] 缓存读不到 sock 值;tcp_client() 重试从 16 增到 64,轮询 memory.stat 前写 memory.high=0 触发 drain。