欢迎来到天天文库
浏览记录
ID:36016423
大小:42.50 KB
页数:4页
时间:2019-04-29
《第5章介绍如何减少数据包拷贝开销,第6章介绍如何减少》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、本章是partII的最后一章。第5章介绍如何减少数据包拷贝开销,第6章介绍如何减少控制开销,端节点上最大的性能提升往往来自这两个方面,现代网络实现基本上已经注意了这些问题。第7章和第8章分别介绍定时器和提前解复用实现的性能瓶颈和解决方法。第9章涉及其它常见的处理任务。第9章主要介绍缓冲区管理、常规协议处理、分片重组等的实现。这些协议处理任务看起来不起眼,但是随着链路速度达到吉比特量级,这些任务也不能忽视。因为在极高的速度下,每个包的处理时间非常短,任何一个环节的低效都可能导致包处理时间超过预定的上限,导致系统整体性能的下降。另一方面,网络中有许多小包,对于这些小包来说,数
2、据处理并不是主要的开销(数据很少或没有数据,如TCP确认),主要的开销就在一般性的协议处理上(分配包缓冲区,协议头处理等)。9.1.1缓冲区分配经典的BSDUNIX实现,称为mbufs。Mbufs设计的出发点:(1)为便于动态扩展包的缓冲空间,用缓冲区链来存放包。比如,当包从上往下穿过协议栈时,添加一个协议头,就只需要将协议头放到一个mbuf中,然后添加到链表头部。Mbufs出现的时候是1981年,那时正是各种网络技术全面开花的时期,没有哪一种网络技术占统治地位,将来会出现什么技术也不得而知。因此,数据包从上往下需要经过哪几层协议处理、每个协议头的长度是多少都无从知道,从
3、而无法知道应当为数据包分配多大的空间。为了能支持各种可能的协议栈,操作系统必须允许动态扩展包的缓冲空间。(2)定义不同大小的缓冲区是为了充分利用内存空间。比如,一个190字节的包会被分配两个mbuf,大约浪费20个字节的空间;一个450字节的包会被分配5个mbuf,浪费大约50个字节。这在当时(1981年)很重要,因为那时计算机的内存普遍很小。Mbufs的缺点是访问数据和拷贝数据的开销大,需要遍历链表。然而,随着网络发展态势的明朗,动态扩展一个包的大小不那么重要了。以太网、TCP/IP成为主流,重要的数据包路径(如以太网、IP、TCP)已确定,预分配缓冲区成为可能。其次,
4、节省空间对于今天的计算机来说没有那么重要了,加快包的处理速度变得很重要。也就是说,mbufs的设计考虑在今天都已经不重要了,但缺点却非常明显。Sk_bufLinux操作系统的实现称为sk_buf。每个包缓冲区都是一块连续地址空间,提前为路径上需要添加的各种包头预留了空间。如何为不同大小的包分配内存?给每个包分配最大长度的包缓冲区是一个很大的浪费。比较好的方法是按需分配内存,当一个包到来时,为其分配一块合适大小的缓存空间。动态分配内存的困难在于,用户会在不同的时间释放缓冲区,使得内存中出现许多不连续的、大小不同的空闲区域。教科书上有一些标准的算法,可以高效地搜索内存,找到一
5、块合适大小的空闲区域。然而,任何一个开发高速网络软件的人都不会使用这样的内存分配器,因为分配速度太慢。他们会考虑以下3种分配器。隔离池分配器这是随BSD4.2UNIX发布的内存分配器,由ChrisKingsley实现,称Kingsleymalloc()。称这些内存池是隔离的,因为当一个内存分配请求不能满足时,不会试图去切分较大的缓冲区,也不会试图去合并连续的较小的缓冲区。Linux分配器Linux分配器最初由DougLea实现,称为dlmalloc()。Lea分配器比Kingsley分配器使用内存更高效,(1)可以将较小的空闲缓冲区合并,(2)小缓冲区(常见情形)浪费的空
6、间不超过8字节。缺点是实现起来更复杂。对于既要求线速、又要求有效利用内存的高速网络来说,也不是一个最好的选择。批量分配器批量是指分配器一次性向系统请求一大块内存,用来作为包缓冲区池,而不是每来一个包向系统请求一块内存。批量分配器(续)在内存块中顺序分配是很容易的,问题主要在释放环节。若释放的顺序和分配的顺序不一致,就会在内存块中形成一些孔洞,需要合并。有两种方法解决这个问题。(1)如果应用知道所有分配的缓冲区最终都会被释放,那么只需使用足够多的空闲块,确保在这些内存块用完之前,已分配的内存块会被释放。这么做会有一定的风险。但目前工业界采用的正是这个方法,比如分配一个4GB
7、的大缓冲区用于收包。(2)如果缓冲区是在虚拟存储系统中分配的,那么可以使用页面重映射将若干分离的物理页映射成在虚拟存储空间是连续的。批量分配器的优点是支持可变长度的内存分配,没有内存浪费(若内存块未用完的话),分配快。内存分配可以用硬件实现,后台创建空闲块用软件实现。9.1.2共享缓冲区这里的困难在于共享缓冲区的用户是变化的,因此,每个用户分配的缓冲区数量应当能够动态调整。比如,用户较少时,每个用户可以多使用一些;当有新用户加入时,应能从老用户那儿夺取一些缓冲区。缓冲区窃取缓冲区窃取是公平分配的一种方法:若所有缓冲区已用完,一
此文档下载收益归作者所有