skbuff_head_cache去哪里了

本文详细解析在Linux网络系统内存使用定位问题时,如何通过/proc/slabinfo查找skbuff_head_cache与skbuff_fclone_cache的相关信息,包括找不到它们的原因及如何确认对应sk_buffer结构的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



在定位linux网络系统内存使用相关问题的时候,/proc/slabinfo下的"skbuff_head_cache""skbuff_fclone_cache"是常用的工具,但是有时候你会发现在/proc/slabinfo没有这两个条目,本文记录了其原因以及如何确认对应的sk_buffer结构的大致数量。

         如何找到对应的slabinfo

找不到"skbuff_head_cache""skbuff_fclone_cache"的原因是在CONFIG_SLUB这个配置下,memory cache可能被合并使用。

 

访问/sys/kernel/slab/xxxxxx为要找的slabinfo的名称,在这个目录下可以看到该slab所共用的memory cache的信息(各个共用该slabmemory cache的统计数据之和)

 

找到所有的共用者的方法:在/sys/kernel/slab目录使用”ll | grep xxx”,你会看到要找的slabinfo被链接到一个目录,名为”:t-xxx”(其中xxx为该slab大小),这个目录对应的就是真实的slabinfo,通过ll命令查看有哪些slab链接到该目录(:t-0000512这种),这些目录对应的就是共用该kmem_cache结构的所有memory cache(他们中的一个会出现在/proc/slabinfo中,查看对应的目录也可以得到相关信息)

         相关内核实现

  1. 首先确认你的系统编译的时候,打开的是CONFIG_SLUB这个选项,CONFIG_SLABCONFIG_SLOB不会存在这个问题。

  2. 在打开了CONFIG_SLUB的情况下,内核在创建memory cache结构的时候,会先看能否使用已有的struct kmem_cache结构,而不是对每次kmem_cache_create都生成独立的struct kmem_cache结构,这就造成了很多kmem_cache_create调用其实没有生成struct kmem_cache结构,在/proc/slabinfo中也就看不到了。具体如下:

    内核初始化的时候skb_init调用kmem_cache_create来创建"skbuff_head_cache""skbuff_fclone_cache"这两个memory cache,其执行的是mm/slub.c中定义的kmem_cache_create函数,看看该函数的实现就清楚了(其先通过find_mergeable看看有无现成的可以结构)

  3. 内核相关实现在kmem_cache_create->sysfs_slab_alias这个函数中完成,分析这个函数可以知道虽然共用了structkmem_cache结构,每次kmem_cache_create调用的时候,会在/sys/kernel/slab目录下用调用者提供的name创建一个目录,并把该目录链接到其共用的struct kmem_cache结构对应的目录结构中。

  4. slabinfo对应的proc目录名称命名方式见内核函数sysfs_slab_add,其命名方式为:对于unmergeable(具体条件见内核函数slab_unmergeable)的,直接使用kmem_cache_create调用传入的名字,否则使用create_unique_id创建有类型、大小决定的名字。

现在补充了proc/slabinfo 打印 30s一次,最后一次slab突增6m cpu2 的软中断达到了100% ip4-frags 109 130 152 26 1 : tunables 120 60 8 : slabdata 5 5 0 ip4-frags 111 130 152 26 1 : tunables 120 60 8 : slabdata 5 5 0 ip4-frags 233 234 152 26 1 : tunables 120 60 8 : slabdata 9 9 0 flow_cache 13080 16560 112 36 1 : tunables 120 60 8 : slabdata 460 460 0 flow_cache 11460 16560 112 36 1 : tunables 120 60 8 : slabdata 460 460 0 flow_cache 16440 16560 112 36 1 : tunables 120 60 8 : slabdata 460 460 0 skbuff_head_cache 1380 2268 192 21 1 : tunables 120 60 8 : slabdata 108 108 420 skbuff_head_cache 1380 2268 192 21 1 : tunables 120 60 8 : slabdata 108 108 300 skbuff_head_cache 1620 2268 192 21 1 : tunables 120 60 8 : slabdata 108 108 360 filp 12960 19250 160 25 1 : tunables 120 60 8 : slabdata 770 770 480 filp 12960 19250 160 25 1 : tunables 120 60 8 : slabdata 770 770 300 filp 37150 37150 160 25 1 : tunables 120 60 8 : slabdata 1486 1486 0 task_struct 339 420 1504 5 2 : tunables 24 12 8 : slabdata 84 84 12 task_struct 334 415 1504 5 2 : tunables 24 12 8 : slabdata 83 83 0 task_struct 1430 1430 1504 5 2 : tunables 24 12 8 : slabdata 286 286 0 pid 772 1197 64 63 1 : tunables 120 60 8 : slabdata 19 19 0 pid 852 1197 64 63 1 : tunables 120 60 8 : slabdata 19 19 0 pid 1824 1827 64 63 1 : tunables 120 60 8 : slabdata 29 29 0 kmalloc-node 46415 54002 128 31 1 : tunables 120 60 8 : slabdata 1742 1742 240 kmalloc-node 47135 54002 128 31 1 : tunables 120 60 8 : slabdata 1742 1742 300 kmalloc-node 59272 59272 128 31 1 : tunables 120 60 8 : slabdata 1912 1912 0
最新发布
04-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值