【问题标题】:Adding a new member in struct sk_buff - any impact on performance?在 struct sk_buff 中添加新成员 - 对性能有影响吗?
【发布时间】:2020-11-11 02:18:19
【问题描述】:

我需要向sk_buff 结构添加一个小缓冲区,并希望将其添加为单独的成员或将其添加到默认skb->cb 之上。

大小约为 100 字节。在这里,关注的是“性能”。它会导致数据包处理的任何性能下降吗?特别是缓存对齐,因为这种大小的sk_buff 无法加载到单个缓存行中,这会导致问题吗?

我做了一个实验,我只是在sk_buff 中添加了 4 个字节,并注意到在常规 UDP 测试中性能下降了 30-50MBps。

有什么建议吗?

【问题讨论】:

  • 是的,当然会产生影响。经过多年的努力,这种结构已经得到优化。主要问题是什么?究竟想做什么?有一个cb 特殊缓冲区,可用于您自己的目的。

标签: performance linux-kernel linux-device-driver embedded-linux


【解决方案1】:

是的,会影响性能!

除了数据结构对齐的可能问题外,主要问题来自更高的内存扩散和/或更大的内存带宽使用。事实上,如果缓冲区没有被完全使用,它会充当一个大填充。这种填充会降低性能,因为可能会浪费高速缓存行,或者因为结构项不会从主内存连续加载(这是需要遍历数据结构的许多项而只读取很少的字段时的情况)。否则,如果缓冲区已完全读取/可用,则需要从内存层次结构(CPU 缓存和 RAM)中加载更多数据,这不是免费的。

我建议您只在这个关键的skb_buff 数据结构中放置一个(小的)引用(例如数组单元格偏移量、指针)到缓冲区,然后将该缓冲区移动到另一个 单独的数据结构。好处是可以打包缓冲区,显着降低内存扩散的影响(如果不经常使用添加的缓冲区)。然而,这种方法的缺点是额外的间接/访问以及需要以一致的方式管理单独的缓冲区。

【讨论】:

    猜你喜欢
    • 2011-04-18
    • 1970-01-01
    • 2011-11-12
    • 2014-01-05
    • 1970-01-01
    • 2019-11-04
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多