三层以太网交换机CPU收发包相关问题分析( 二 )


添加或删除字段,必然会导致数据包头一侧或包尾一侧的位置发生移动,假如包尾一侧移动,问题比较简单,只要数据包总长度不超过buffer边界即可 。由于通常此类操作都靠近包头的位置,假如包头一侧移动,效率会比较高,所以协议栈在处理时可能更倾向于在包头一侧移动,这时就需要驱动在分配buffer时做一些处理:
(1)接收数据包时,头指针不能指向buffer边界,需要向后偏移一定裕量,同时单个buffer的大小也必须兼顾到最大传送单元(MTU)和该裕量 。
(2)释放数据包时buffer首指针需要作归一化处理(如图2所示) 。
1.4中断/轮询
目前交换机涉及到的外部中断主要由交换芯片产生,交换芯片主要的外部中断包括DMA操作(如收到包、发包结束、新地址消息等等)和一些出错消息 。假如中断请求过于频繁,中断服务程序(ISR)和其他进程之间频繁地上下文切换会消耗大量CPU时间 。假如有持续大量的中断请求,CPU会始终处于繁忙状态,各种协议得不到足够的调度时间,从而导致协议状态机超时等严重故障 。
为了避免事件触发频率不可控的问题,可以使用轮询机制,通常的做法是用CPU定时器触发原先由外部中断触发的ISR,由于定时器触发的间隔是固定的,所以ISR执行的频率得到了控制,避免了上述的问题 。
轮询和外部中断相比,只是节奏可控(外部中断的节奏取决于外部事件发生的频率,CPU不可控) 。但是,轮询也有其不可避免的缺点——响应慢 。不能满足某些实时性要求较高的功能 。另外,人们会发现用ping命令检测交换机3层接口大包时,使用轮询方式的交换机比使用中断方式的交换机的时延明显要大 。
假如能通过某种机制,避免持续、大量的中断请求,则既可以保证CPU不会过于繁忙,又保留了中断实时处理的优点 。
典型的会产生大量中断事件的行为是CPU接收数据包和MAC地址消息上报 。以收包为例,在前面“CPU负载与收包节奏控制”部分提到的Burst方式就是根据实时的流量,控制接收DMA的开关,这样就达到了使中断源受控的目的,这种类似负反馈的机制可以很好的避免持续的中断事件上报CPU 。
总之,轮询控制简单,但实时性较差;中断实时性好,但是使所有的中断源受控有一定难度 。在系统初始设计阶段,我们需要综合考虑需求以及芯片对外部事件的处理方式,来决定采用中断或者轮询方式,或者两者兼用 。
1.5多进程环境中外部事件的处理机制
常见的外部事件(中断事件)包括收到包、包发送完(这里指的都是CPU收发包),包括收到MAC地址消息、MAC表操作完成等 。
假如把各类中断事件的处理放在一个进程里,就人为地造成了各个事件耦合性增强,增加了各种事件相互制约的机会 。
在多任务操作系统中,为了能更灵活地处理各个事件,减少事件之间的子相互制约关系,各种事件应当尽可能地单独起进程,或者根据处理方式的不同划分为几个进程,至少用单个进程来处理是不合适的 。
1.6协议包保护和CPU保护
对于基于ASIC的交换机,协议包保护是指利用ASIC芯片的某些机制,把特定的协议包指定到特定的端口队列上去,保证其经DMA队列上送CPU的优先级;CPU保护是指尽量减少不必要的数据包对CPU的冲击 。
实现协议包保护的必要条件:
;(1)CPU端口必需支持严格优先级(SP)或者带权重的罗宾环(WRR)的调度算法 。
(2)交换芯片必需具有较强的流分类能力,且可以给不同的流指定不同的端口队列 。
在系统方案设计时我们需要兼顾对协议报文的保护和对CPU的保护,应该尽量做到:

推荐阅读