Linux eth接口的sysfs文件中rx_page_cache/log_mult_limit作用是什么?(倍数限制,rx page cache对于ing buffer的膨胀系数)

1. 背景

本文介绍Linux内核协议栈标准实现中,关于rx_page_cache的log_mult_limit参数的作用、机理和常见值。以对Linux内核协议栈同网卡之间进行数据交互的资源有一个切片认识

2. log_mult_limit的值与位置

cat /sys/class/net/enp65s0f0np0/rx_page_cache/log_mult_limit

在这里插入图片描述

3. Linux从网卡到应用收包流程机制

3.1 先看Linux收包机制

先看Linux数据收包机制:累计3次:

  • 从网卡 DMA 到 ringbuffer(循环缓冲区,缓冲区有多,具体个数等于eth的channel,缓冲区深度等于eth的rx depth根据ethtool -g查看),由网卡的DMA操作
  • 从ringbuffer 到 rx page(存在形式是skb),有内核协议栈中的ksoftirqd处理。这里的log_mult_limit就是linux内核的一个限制参数,限制这个rx page的内存总大小。
  • 从内核态 到 用户态,内核处理
    在这里插入图片描述

3.2 再看资源大小

ringbuffer的大小是根据eth口配置的eth的channel数量(ethtool -l查看),rx ring buffer depth深度(ethtool -g 查看)以及mtu大小。他们和单个eth口的ringbuffer总容量关系是:
在这里插入图片描述
比如这台设备的channel是32个(为什么eth要多个channel,每个channel在网卡上有独立的中断,可以和CPU绑定提高并行处理效率), 网卡循环缓冲区有1024的深度(所谓深度,就是一个channel里面的对应1个ringbuf循环缓冲区,该缓冲区支持存储多少个包,比如深度1024就是1024个包)。然后每个包的大小是根据MTU计算的。比如MTU是1500,加上头部大概1522。
那么这台设备的总的内存就是 (32个ringbuf )* (1024个包/ringbuf) * (1522字节/包) = 3210241522 B = 47.5625MB ≈ 48MB。也就是算出来一个eth口对应的ringbuffer总循环缓冲区是48MB

在这里插入图片描述
在这里插入图片描述

3.3 rx page的容量

前面提到了ring buffer的大小是48M,然后第二次拷贝是从ring buffer拷贝到rx page(也就是skb的整整数据)。可以遇见的是,rx page的大小 >= ring buffer的。从而才能完整拷贝。
又因为ring buf是一个系统启动后固定的内存,不涉及频繁的创建销毁。但是作为skb的rx page,却需要频繁的创建和销毁。
而频繁的增删一定带来性能的开销以及CPU繁忙,为了解决这个问题Linux内核协议栈选择性的支持这个rx page使用linux 的page pool机制(本文不具体介绍,大概原理是内存分配从page pool分配,释放也交给page pool。 page pool内部实现了一个二级缓冲区)避免频繁的在伙伴系统批发。于是个rx page的内存区域就叫做cached,并且它的分配和释放是基于page的。所以叫做rx page cache。
那么前面提到的log_mult_limit,又与这里有什么关系呢?
首先rx page cache是skb,skb的释放是异步散状的,很可能是用户态触发。所以聪明的你会发现,rx page cache的容量要比ring buffer大,具体大多少,以及怎么个大法。目前Linux内核的实现是使用了2的幂次方增加的。也就是可以配置为ring buffer的1倍(20),2倍,4倍、8倍、16倍(24)。然后这个log_mult_limit,就是用来限制这个最大缓存的大小是多少倍ring buffer的数量,只是他用log的方式表达。所以叫log的mult的limit,log倍乘限制。
Linux内核的实现这部分的逻辑是会预留rx page cache总的内存(放入page pool中),后面收发包的时候直接从page pool中消费,用完了作为生产者给page pool生产。
所以log_mult_limit是什么?他就是用来限制rx page cache这个第二次copy数据包的总资源大小的系数。或者叫ring buffer的膨胀系数。

更多参考:https://arthurchiao.art/blog/linux-net-stack-implementation-rx-zh/#55-__do_softirq—net_rx_action

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值