最近在看 TC 和 eBPF 相关的一些介绍。TC 本身的概念比较复杂,想要理清并不容易。加上 eBPF 的引入就更复杂了。本文用来记录与此相关的一些发现。

clsact

clsact 即是用来给 TC + eBPF 是使用的一个 qdisc. qdisc 可以简单理解为使用某种算法(FIFO)的 Queue. clsact 的特点是:

  • 不用排队
  • 主要就是为了 attach ebpf 用的
  • 在 ingress/egress 都提供了 hook
  • lock free

ingress 与 egress 的不同

不太确定直接的原因是啥,目前的 qdisc 只在 egress 方向上有。一般的 rate-limiting 都是在 egress 上实现, ingress上的比较困难。一个原因是难以对源头进行限速。

multiple qdisc

多个 qdisc 在 egress 上是很常见的。加了 clasact 之后就更常见了。那么 clsact 和他们什么关系?

这是我从另一个 Topic 摘过来的图。可以看出来, clsact 是在普通的 qdisc 之前的。

direct-action mode

请参考: Understanding tc “direct action” mode for BPF

简单来说,传统的 TC 使用需要 filter 和 action 两个 module. 但是因为 bpf 本身的功能比较丰富,可以将二者合二为一。这就是 direct-action mode.

EDT Solution

egress 的 rate-limiting 方案可以优化的地方很多,涉及到 lock, cpu scheudler, 不同的 qdisc 算法等等。字节有一篇文章详细列举了几种常见的方案:

Linux 内核 | 网络流量限速方案大 PK

其中最有的意思就是最后的 EDT 方案。这个也是目前 Cilium 在用的 bandwidth 方案。CNI的参考实现里用了 IFB 方案(支持ingress)。

tcng

代表 traffic control next generation. 可以用 code/config 的方式来设置 TC 的相关功能。具体可参考: http://tcng.sourceforge.net/

TC Flower

针对 openvswitch hardware offload 的方案. TC 的可扩展性很强,可以接入不同的 classifier ( 上面的 bpf 也算一例). Openflow 规则也可以映射成 TC 规则。

OpenVSwitch 硬件加速浅谈

  1. Cilium: BPF and XDP Reference Guide
  2. Bandwidth Manager (beta)