缓存的概念并不陌生,尤其是网络交换机,现在绝大部分的交换机均采用存储转发模式。所谓存储转发模式,是交换机接收数据包,从前导码开始,一直到报文最后的crc,这个报文接收完之后,才开始启动转发进程,在启动转发之前,这些数据包都要存储到交换机缓存中,这就是存储转发模式,缓存说白了就是存储转发报文的。一般交换机的缓存都比较小,只满足了线速转发,当流量超过端口最大带宽时,报文会很快将仅有的一点缓存迅速占满。缓存就好比是一个水池子,有出水管和入水管,当入水管开的大,出水管开的小,水池子里的水就会很快装满,直到溢出。如果入水管开的小,出水管开的大,水池子里几乎不会存下水,但水的流速就会慢,这是一个权衡利弊的过程。对于交换机的缓存也如此,针对出入水管的调节引申出了两大技术,一个是qos技术,一个是流控技术。对出水管进行管控的技术就是qos技术,其中包括比如wrr、队列整形gts、限速、wred、最小带宽保证等很多技术,这些技术基本本质上就是对出水管的开关大小和优先级进行设置,当然要比开关水管要复杂得多,只是这样的一个比喻。对入水管进行管控的技术就是流控技术,包括:flow-control和pfc,基于端口和队列的流控控制,对入水管的门限进行设置,当水量达到门限时触发设备发送流控帧,同时当端口收到流控帧时,也可以向下一级设备传递。这两大类技术包含的内容都很多,技术也较为成熟,但实际应用中使用的并不多,原因也是缓存比较小。比如一般的交换机,缓存就几mb,均分到各个端口也就几百kb,有突发流量时能存下几十个包就不错了,还费力设置那么多阈值干啥,突发一来基本将缓存打满,各种技术都成了摆设,发挥不了太大作用,所以从交换机诞生之日起,缓存技术就有了,但一直不为人们所关注。
因为缓存小,交换机上的缓存一直是其比较鸡肋的部分。那一定有人会问,就不能将缓存做得大些吗?可以,其实后来有人研究出采用外扩dram来扩大缓存能力,不过这样基本都会降低报文转发速度,使得延迟增大,对网络影响也比较大,对于一些对时延比较敏感的业务网络,就不能采用这种大缓存的方式,不过在一些突发流量比较多,比如搜索业务中,对时延不敏感,这种大缓存设备就可以派上用场,避免在突发时出现丢包,即便延迟大一些也能接受,不过因为多了一个专门存储数据的芯片,设备造价上要高得多,所以一般大缓存的设备价格都比较昂贵,基本是越大越贵。这里所说的延迟大,都是指的有拥塞的情况,如果没有拥塞,其实大小缓存都没有区别,存储转发时延都是几个微秒,与缓存大小无绝对关系。交换机上的转发芯片,受制造工艺和技术所限,还无法在片内将缓存做得很大。当然,这些年转发芯片的技术也在不断进步,不仅是转发表项规格越来越大,缓存也在变大,现在片内缓存达到20~30m的已经比较常见,这要比十年前只有1m~2m的交换机缓存要大得多。缓存变大,以前的那些技术的意义就大了,可以设置各种阈值和优先级,对缓存的使用进行管控,这样才能真正发挥作用。缓存大小阈值设置要适度,过大的缓存空间会影响正常通信状态下数据包转发速度(因为过大的缓冲空间需要相对多一点的寻址时间),并增加设备的成本。而过小的缓冲空间在发生拥塞时又容易丢包出错。所以,适当的缓存空间加上先进的缓存调度算法是解决缓存问题的合理方式。
借助于rdma技术的热门,缓存技术引起了人们的关注。众所周知,rdma技术是一种提升数据包处理速度的新技术,一直采用专有网络协议和专有网卡,应用来实现的,造价非常贵,一般只有在高性能计算的网络中才会部署,随着以太网技术的成熟,rdma的一种替代技术roce出现,roce是一种允许通过以太网使用远程直接内存访问(rdma)的网络协议,就是通过以太网来跑rdma协议,pfc和ecn是roce实现的基础,而pfc是实现基于队列的流控,ecn是实现基于wred打标技术,两种技术都与缓存密切相关,这让人不得不将缓存技术重拾起来。而现在的交换机缓存有数十mb,在技术上也足够可以做做文章,很多人开始深入研究交换机的缓存技术。
当一台交换机出厂之后,它的缓存大小就确定了,无法再改变,这就像我们买的手机一样,cpu和内存大小都无法改变。我们只能通过命令去设置出入门限,管控缓存的使用情况,将缓存尽可能公平地分给各个端口使用,同时针对突发流量、流控攻击等异常情况,都可以应对。缓存虽不涉及到转发表项,但每个数据包都要经过缓存存储,所以一旦缓存出了问题,影响是全局性的,可能导致整个设备的业务异常,影响很大。早期的设备缓存都不会开放给使用者去随意修改各种阈值,随着roce网络的出现,为了更好地适应rdma网络,各家网络厂商才将缓存这部分调整放开。即便这样,也建议遵从厂商提供的建议数值进行设置,这些阈值背后有很多缓存的技术含义,稍有不慎就可能调整错误,同时针对特殊应用场景,评估后再调整。有没有不用缓存的交换机?答案是有,就是直通转发模式,优点自然是转发快,时延低,这种交换机在还没有收到完整报文就开始转发,无法检验crc,这样错包也发现不了,实际应用中使用会有很大限制。