专栏
天翼云开发者社区

交换机中的buffer概述

2024-03-25 15:46:19 48阅读

     交换芯片中是有一块缓存空间用来缓存报文,防止出现由于突发流量导致拥塞而产生的丢包现象。后续我们把这部分缓存空间称为 buffer。芯片中有一个 MMU(缓存管理单元),缓存空间 buffer 的管理就是由MMU完成的。还需要注意一点是,当一个 packet从入向转发到出向,对于bufffer的占用,其实并不存在物理空间上的移动,对于入向和出向buffer的占用其实只是一个计数。通俗点解释就是:当一个 packet 要经过交换机转发时,因为要经过入口和出口通道转发,MMU会将入向和出向缓存空间当前的occurpancy都加上packet的长度,以表示对缓存的占用。同时MMU会给入向和出向的缓存空间设置一个上限,当缓存空间的occurpancy超过上限时,就不能缓存报文了,此时报文就会因为no buffer而丢弃。

    buffer的管理其实是很复杂的,下面介绍博通的buffer设计及管理,其他芯片厂商的设计大同小异,只是有一些细节上的区别。

   在交换芯片中,buffer缓存在物理上其实就一块,但是在逻辑上会给每个端口会分配缓存,且端口缓存会在细分为入向和出向,除此之外,端口入向和出向的缓存会进一步细分,端口入向的细分缓存一般称为PG(Priority Group) ,端口出向的细分缓存一般称为Queue,常见的芯片设计是一个端口入向有8个PG,出向有8个Queue。为了简化配置,下面我们只考虑PG和Queue,不再考虑端口级别缓存(其实不必考虑端口,我们就认为整机有几百个PG、几百个Queue在互相转发就好了)。

MMU除了会给PG 和Queue 设置一个缓存上限以外,还会在上限以下还会细分几个水线,具体如图:

 

如图,入方向上,在上限以下,还细分了PG-Guaranteed大小、PG-Share大小、Headroom大小;出方向上,细分了Queue-Guaranteed大小,Queue-Share大小。缓存使用的时候,总是从下往上依次申请使用,所以更喜欢把这些区块大小称之为“水线”,当“某区块”都使用完毕,就称之为“缓存水位”到达了“某水线”。例如:当PG-Share区块使用完毕,就称之为,入口缓存水位已经到达PG-Share水线。如果所有区块全部使用完毕呢?那就产生丢包了,此时的丢包被称为no buffer丢包。

下面详细介绍下这些细分的水线:

Guaranteed部分:

    保证缓存,缺省情况下,设备已经分配好了 Guaranteed缓存,不支持互相抢占也不支持重新分配。对于队列来说,Guaranteed缓存保证队列的最基本转发能力。确保了队列抢占不到的Shared缓存时,也能进行一部分报文转发。所以一般配置为一个数据包大小即可,那我们按照最差的情况来算。

Shared部分 :

    共享缓存,分配方式支持动态抢占 ,同一级别的PG-Shared 之间 或 Queue-Shared之间是可以互相占用对方空闲的缓存。对于队列而言,Shared 缓存用于保证队列的突发转发能力,当队列中存在突发流量时,可以使用Shared缓存暂时存储未转发出去的报文,只有待转发的报文小于剩余的Shared缓存,该报文才能进入队列进行转发,否则丢弃。

    这部水线一般是设置为动态水线的,所谓动态水线其实很简单,一个简洁的公式即可表达:PG-Share = [剩余Buffer] * α。这里的α是缩放因子,可以用户自由调节,可以看出缩放因子决定了PG-Share水线的大小。

Headroom部分:

   一般只有应用于无损业务的PG才会有headroom的这一部分,因为headroom空间的作用是存储本队列发送PFC反压通知报文之后 到上游设备停止发包之前这段时间内收到的报文,以防这段时间报文被丢弃。由于PFC 反压是根据入方向的缓存是否达到阈值触发的,所以 Headroom缓存空间只用于入向。

  • 0
  • 0
  • 0
0 评论
0/1000
评论(0) 发表评论
l****n

l****n

3 篇文章 0 粉丝
关注

交换机中的buffer概述

2024-03-25 15:46:19 48阅读

     交换芯片中是有一块缓存空间用来缓存报文,防止出现由于突发流量导致拥塞而产生的丢包现象。后续我们把这部分缓存空间称为 buffer。芯片中有一个 MMU(缓存管理单元),缓存空间 buffer 的管理就是由MMU完成的。还需要注意一点是,当一个 packet从入向转发到出向,对于bufffer的占用,其实并不存在物理空间上的移动,对于入向和出向buffer的占用其实只是一个计数。通俗点解释就是:当一个 packet 要经过交换机转发时,因为要经过入口和出口通道转发,MMU会将入向和出向缓存空间当前的occurpancy都加上packet的长度,以表示对缓存的占用。同时MMU会给入向和出向的缓存空间设置一个上限,当缓存空间的occurpancy超过上限时,就不能缓存报文了,此时报文就会因为no buffer而丢弃。

    buffer的管理其实是很复杂的,下面介绍博通的buffer设计及管理,其他芯片厂商的设计大同小异,只是有一些细节上的区别。

   在交换芯片中,buffer缓存在物理上其实就一块,但是在逻辑上会给每个端口会分配缓存,且端口缓存会在细分为入向和出向,除此之外,端口入向和出向的缓存会进一步细分,端口入向的细分缓存一般称为PG(Priority Group) ,端口出向的细分缓存一般称为Queue,常见的芯片设计是一个端口入向有8个PG,出向有8个Queue。为了简化配置,下面我们只考虑PG和Queue,不再考虑端口级别缓存(其实不必考虑端口,我们就认为整机有几百个PG、几百个Queue在互相转发就好了)。

MMU除了会给PG 和Queue 设置一个缓存上限以外,还会在上限以下还会细分几个水线,具体如图:

 

如图,入方向上,在上限以下,还细分了PG-Guaranteed大小、PG-Share大小、Headroom大小;出方向上,细分了Queue-Guaranteed大小,Queue-Share大小。缓存使用的时候,总是从下往上依次申请使用,所以更喜欢把这些区块大小称之为“水线”,当“某区块”都使用完毕,就称之为“缓存水位”到达了“某水线”。例如:当PG-Share区块使用完毕,就称之为,入口缓存水位已经到达PG-Share水线。如果所有区块全部使用完毕呢?那就产生丢包了,此时的丢包被称为no buffer丢包。

下面详细介绍下这些细分的水线:

Guaranteed部分:

    保证缓存,缺省情况下,设备已经分配好了 Guaranteed缓存,不支持互相抢占也不支持重新分配。对于队列来说,Guaranteed缓存保证队列的最基本转发能力。确保了队列抢占不到的Shared缓存时,也能进行一部分报文转发。所以一般配置为一个数据包大小即可,那我们按照最差的情况来算。

Shared部分 :

    共享缓存,分配方式支持动态抢占 ,同一级别的PG-Shared 之间 或 Queue-Shared之间是可以互相占用对方空闲的缓存。对于队列而言,Shared 缓存用于保证队列的突发转发能力,当队列中存在突发流量时,可以使用Shared缓存暂时存储未转发出去的报文,只有待转发的报文小于剩余的Shared缓存,该报文才能进入队列进行转发,否则丢弃。

    这部水线一般是设置为动态水线的,所谓动态水线其实很简单,一个简洁的公式即可表达:PG-Share = [剩余Buffer] * α。这里的α是缩放因子,可以用户自由调节,可以看出缩放因子决定了PG-Share水线的大小。

Headroom部分:

   一般只有应用于无损业务的PG才会有headroom的这一部分,因为headroom空间的作用是存储本队列发送PFC反压通知报文之后 到上游设备停止发包之前这段时间内收到的报文,以防这段时间报文被丢弃。由于PFC 反压是根据入方向的缓存是否达到阈值触发的,所以 Headroom缓存空间只用于入向。

文章来自专栏

网络管理

3 篇文章 1 订阅
0 评论
0/1000
评论(0) 发表评论
  • 0
    点赞
  • 0
    收藏
  • 0
    评论