Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3014371
  • 博文数量: 535
  • 博客积分: 15788
  • 博客等级: 上将
  • 技术积分: 6507
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-07 09:11
文章分类

全部博文(535)

文章存档

2016年(1)

2015年(1)

2014年(10)

2013年(26)

2012年(43)

2011年(86)

2010年(76)

2009年(136)

2008年(97)

2007年(59)

分类: 系统运维

2009-01-05 09:53:44

包转发率标志了交换机转发数据包能力的大小。单位一般位pps(包每秒),一般交换机的包转发率在几十Kpps到几百Mpps不等。包转发速率是指交换机每秒可以转发多少百万个数据包(Mpps),即交换机能同时转发的数据包的数量。包转发率以数据包为单位体现了交换机的交换能力。
  
  交换机的背板带宽,是交换机接口处理器或接口卡和数据总线间所能吞吐的最大数据量。背板带宽标志了交换机总的数据交换能力,单位为Gbpsbps(bits per second,每秒数据的位数,也叫交换带宽,一般的交换机的背板带宽从几Gbps到上百Gbps不等。一台交换机的背板带宽越高,所能处理数据的能力就越强,但同时设计成本也会越高。
  所以一般来说二层能力用bps,三层能力用pps,支持第三层交换的设备,厂家会分别提供第二层转发速率和第三层转发速率。
    
  

  另外,讲一下PPS是如何计算的
  
  我们知道1个千兆端口的线速包转发率是1.4881MPPS,
  百兆端口的线速包转发率是0.14881MPPS,这是国际标准,但是如何得来的呢?

  具体的数据包在传输过程中会在每个包的前面加上64个(前导符)preamble也就是一个64个字节的数据包,原本只有512bit,但在传输过程中实际上会有512+64+96=672bit,也就是这时一个数据包的长度实际上是有672bit的千兆端口线速包转发率=1000Mbps/672=1.488095Mpps,约等于1.4881Mpps,百兆除于100.14881Mpps 
(包转发线速的衡量标准是以单位时间内发送64byte的数据包(最小包)的个数作为计算基准的。对于千兆以太网来说,计算方法如下:1,000,000,000bps/8bit/(64 + 8 + 12)byte=1,488,095pps 说明:当以太网帧为64byte时,需考虑8byte的帧头和12byte的帧间隙的固定开销。故一个线速的千兆以太网端口在转发64byte包时的包转发率为1.488Mpps。快速以太网的线速端口包转发率正好为千兆以太网的十分之一,为148.8kpps。
*对于万兆以太网,一个线速端口的包转发率为14.88Mpps。
*对于千兆以太网,一个线速端口的包转发率为1.488Mpps。
*对于快速以太网,一个线速端口的包转发率为0.1488Mpps。)

  

  那么以后很简单了,其实直接用设备参数中的pps数值乘以672那么就转化成我们比较能理解的大众化的bps概念了。
  一般销售为了方便大家计算和整数化的理解就改672500

(包转发线速的衡量标准是以单位时间内发送64byte的数据包(最小包)的个数作为计算基准的。对于千兆以太网来说,计算方法如下:1,000,000,000bps/8bit/(64 + 8 + 12)byte=1,488,095pps 说明:当以太网帧为64byte时,需考虑8byte的帧头和12byte的帧间隙的固定开销。故一个线速的千兆以太网端口在转发64byte包时的包转发率为1.488Mpps。快速以太网的线速端口包转发率正好为千兆以太网的十分之一,为148.8kpps。
*对于万兆以太网,一个线速端口的包转发率为14.88Mpps。
*对于千兆以太网,一个线速端口的包转发率为1.488Mpps。
*对于快速以太网,一个线速端口的包转发率为0.1488Mpps。)

  
  
  理解了这个后忽然发现网络设备选型原来是那么的简单,我只需要预计网络中的总节点数和带宽需求及流量需求,那么需要的交换机性能型号和路由器型号就呼之欲出了。 
  注:

  现在的设备很多是三层交换机,我们看到的参数是分别针对三层模块和二层模块来说的。
  例如6509就是这样了。
  数据交换能力是720Gbps,但是路由包转发能力是400Mpps。这里没有矛盾。因为两个数据都不是描述一件事情。
  
  为什么一个数据包定为512bit,为什么不是1024bit再加上64个字节的preamble
因为根据Ethernet中的标准,以太网最小的包大小为64个字节(即512bit),IP报头固定有20个字节的开销,如果负载小于44个字节的话,在发出数据包前会自动填充至44字节,以保证最少达到64字节IP


目前,很多X86的防火墙厂商都宣称,64bytes小包线速转发,94%……,呵呵,让我们来看看kola关于这个的经典论述<部份地方稍有修改>:

一. 线速
线速转发是对一个网络中转设备的理想要求。但平时大多数人都关注着设备的bps(bits per second,每秒数据的位数),很少人会想到fps(frame per second,每秒数据的帧数)实际上更考验设备的转发能力。
简单的说,bps是指每秒钟有多少字节的数据经过,fps是每秒钟有多少个数据包经过。
以10Mb的网络来说,线速时bps为10M,fps最大值为14880。
那么这个14880是怎么计算出来的呢?
首先我们要知道几个规定:
1. 以太网内最小的数据包的大小为64字节,它包括4字节的CRC,2字节的以太网类型(或长度),6字节的源Mac地址,6字节的目的Mac地址以及46字节的负荷。
2. 以太网帧与帧之间至少要有96位(12字节)的帧间隙(IFP,inter frame gap)以确保区分两个数据包。
3. 每个数据帧开始之间必须要有8字节的Mac地址前导位(MAC preamble)以确保发送方接收方同步数据位。
因此,以太网内最小的数据包实际上是64+12+8=84字节=672位。
于是,10M网络环境下pps的最大值就是
10M位每秒 / 672 位每包 = 14480 包每秒。
同理,我们可以算出10M网络环境下fps的最大值为
10M位每秒 / ( ( 1518+12+8 ) * 8 ) 位每帧 = 812 帧每秒
而100M网络环境下这两个值分别为148809和8127。

二. 处理能力
我们已经知道了线速情况下最大的fps值,现在我们看看要达到线速所需要的处理能力。
假设市面上某防火墙的是X86架构的CII 900Mhz 的CPU,即每秒钟可以分成900M个时钟周期。
于是,在100M的网络环境下,处理一个数据帧所允许的最大时钟周期为:
900M 时钟周期每秒 / 148809 帧每秒 = 6048 时钟周期每帧
也就是说,要达到线速转发,900Mhz的CPU平均要在6048个时钟周期内完成对一个数据包的处理。
这只是理想情况,基于x86架构的系统里CPU还要负责各类中断(如系统时钟)的处理,每次中断时都要保存当前的运行状态,切换到中断处理程序,等中断处理完后,再恢复当前状态,切换回原来的处理流程。光是这个切换过程至少都要费上500个时钟周期,还不包括中断处理程序所用的时钟周期。好在这类中断还”不算“频繁,扣除系统这部分开销后,真正分摊到每个数据包的处理时间平均大约还有5500个时钟周期。
虽然Intel P3以上级的CPU如CII在设计指令集时已经将大量常用的指令(如两个寄存器相加/减)优化到可以在一个时钟周期内完成,但做为防火墙,更常用的是读/写内存数据(比如要比较源地址,计算IP的校验和等)这类多时钟周期的指令,所以5500个时钟周期内大约只能执行2000条指令。
对一个数据包的处理,从为这个数据包分配内存起,依次要检查以太网络协议(如果是RFC1042格式的数据包还要跳过LLC头找真正的以太网络协议),检查IP头、校验和(如果是TCP/UDP协议还要计算对应的校验和),DoS防御,状态检测,NAT规则,安全/统计规则,更新ARP/路由表,选择转发网卡,直到最终把这个数据包添加到发送队列中才算完成。
你认为2000条x86的指令能完成这一切吗?

另外的一种说法
先看看操作系统如何处理包:
一般对于高效处理,很少是一个包一个中断的,都是通过轮询方式,比如在freebsd下,高负载情况下,可以设置5000次/s(intel百兆卡,一般够用,至于怎么够用,自己算吧)甚至更高,网卡会将收到的包存放于队列中,等待cpu的主动处理。这样中断数会极大降低。一般好的网卡比如常见的intel百兆卡,(如果没有记错的话,队列大小是32,而8139才4),可以缓冲大量的包,这样cpu的一次中断可以处理多个包。在纯路由模式下,即使有少量的规则,包转发的速度是非常快的,基本可以达到线速的,当然不是100M,所有的网络节点设备都会有延时的,只是多少而已。在防火墙中,消耗cpu的是nat和复杂的规则检测,其他的基本功能消耗cpu比较少, 速度非常快,拿过一个包,通过指针定位ip头,根据ip头定位动态规则表(hash检索),比较一下要么丢弃,要么直接送到下层。如果对协议栈了解的话,会知道一个包从网络进入协议栈,大部分流程都是条件判断。
arp表,路由表之类的处理也非常快的,记得是3跳命中。再说了还有高速缓冲的,在freebsd中还可以
打开fastforward。mbuf使用起来也不像应用层的内存申请使用,不用担心那么耗费指令。对于包效验和,汇编指令编写的,一般需要几十条指令,不会超过百条。

三. 现实数据
2000条指令看起来很多,实际上并不多,举个例子,要完成最简单的 A = A + B 这个算式最优化的指令也要用上两条:
mov eax, [val_B]
add [val_A], eax
未优化的会用上四条:
mov eax, [val_A]
mov ebx, [val_B]
add eax, ebx
mov [val_A], eax
目前的防火墙的开发大多是在Unix/Linux上完成的,以GCC编译器为例,它的优化效果比商业的编译器如VC/BC差了大概20%,也就是说同一段C代码,用商业编译器能编译成100条指令的话,GCC最好的情况下只能编译成120条指令。
实际上,在没有任何包过滤规则或其它配置的情况下,完整的处理一个数据包需要大约14000条指令。
所以,根据上面的计算,目前许多X86架构防火墙(PIII 800)在100M网络环境下的结果是64byte的情况下达到42%的线速转发能力,即62000fps的处理能力。至于100%,95%,90%以上……

阅读(3187) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-01-06 11:15:20

不错,就是字小了点。