著录项信息
专利名称 | 通过传输层有效地处理发送套接字调用的方法和系统 |
申请号 | CN200610146574.5 | 申请日期 | 2006-11-15 |
法律状态 | 暂无 | 申报国家 | 中国 |
公开/公告日 | 2007-06-20 | 公开/公告号 | CN1984152 |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | H04L29/08 | IPC分类号 | H;0;4;L;2;9;/;0;8查看分类表>
|
申请人 | 国际商业机器公司 | 申请人地址 | 上海市浦东新区张江高科技园区科苑路399号张江创新园10号楼7层
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 国际商业机器(中国)有限公司 | 当前权利人 | 国际商业机器(中国)有限公司 |
发明人 | V·文卡塔苏布拉;D·N·班纳吉;V·然;K·拉马林加姆 |
代理机构 | 北京市中咨律师事务所 | 代理人 | 于静;张亚非 |
摘要
一种用于由传输层有效率地处理发送套接字调用的方法、系统和程序。网络协议栈的传输层从应用层接收到对指定长度的数据的发送套接字调用。响应于检测到对于至少该指定长度没有足够的存储器可用于传输层内的缓冲区的单个存储器分配,传输层阻止该发送套接字调用。传输层只有在检测到对于至少该指定长度存在足够的存储器可用于传输层的缓冲区内的单个存储器分配时才唤醒发送套接字调用,其中唤醒该发送套接字调用触发内核在缓冲区内执行单个存储器分配,并一次性地将数据写入该单个存储器分配。
1.一种用于有效率地处理在计算机系统的网络协议栈的传输层接收到的发送套接字调用的方法,包括:
响应于在所述传输层接收到对指定长度的数据的所述发送套接字调用,并检测到对于至少所述指定长度没有足够的存储器可用于对所述传输层内的缓冲区的单个存储器分配,在所述传输层阻止所述发送套接字调用;以及
只有在检测到存在足够的存储器可用于所述传输层内的缓冲区内的至少所述指定长度的所述单个存储器分配时,才唤醒所述发送套接字调用,其中唤醒所述发送套接字调用触发内核执行所述缓冲区内的所述至少所述指定长度的所述单个存储器分配,并一次性地将所述数据写入所述单个存储器分配。
2.根据权利要求1的方法,还包括:
在所述传输层接收到所述发送套接字调用,该发送套接字调用具有被设定的、要求对于所述发送套接字调用仅执行所述缓冲区内的所述单个存储器分配的标志。
3.根据权利要求1的方法,还包括:
响应于阻止所述发送套接字调用,将最小存储器分配大小设定为所述指定长度,其中所述传输层仅在检测到对于所述最小存储器分配大小存在足够的存储器时自动唤醒所述发送套接字调用。
4.根据权利要求1的方法,还包括:
响应于阻止所述发送套接字调用,将被阻止的线程大小设定为所述指定长度,其中所述传输层仅在检测到对于所述被阻止的线程大小存在足够的存储器时自动唤醒所述发送套接字调用,其中所述被阻止的线程大小独立于指定所述缓冲区内的最小存储器分配大小的设置。
5.根据权利要求1的方法,还包括:
响应于在所述传输层检测到对接收到的数据的确认,用所述确认内指示的量调整指示可用于分配给所述缓冲区的存储器量的计数器。
6.根据权利要求1的方法,其中,用于分配给所述缓冲区的所述存储器被保持在存储池内,该存储池被指定用于在所述传输层在多个缓冲区之间分配。
7.根据权利要求1的方法,其中,其中所述单个存储器分配是mbuf。
8.根据权利要求1的方法,还包括:
检测到接收所述数据的系统可接收的最大段大小;以及
将可一次性地分配给所述缓冲区的存储器的最大量设定为大于所述最大段大小的量。
9.一种用于有效率地处理发送套接字调用的系统,该系统包括:
能够在网络上通过网络协议栈通信的计算机系统,该网络协议栈至少包括用于接收所述发送套接字调用的传输层;
所述传输层包括用于响应于接收到对指定长度的数据的所述发送套接字调用,并检测到对于至少所述指定长度没有足够的存储器可用于所述传输层内的缓冲区的单个存储器分配,阻止所述发送套接字调用的装置;以及
所述传输层包括用于只有在检测到存在足够的存储器可用于所述传输层中的所述缓冲区内的至少所述指定长度的所述单个存储器分配时才唤醒所述发送套接字调用的装置,其中唤醒所述发送套接字调用触发内核执行所述缓冲区内的所述至少所述指定长度的所述单个存储器分配,并一次性地将所述数据写入所述单个存储器分配。
10.根据权利要求9的系统,其中,所述传输层还包括:
用于接收到具有被设定的标志的所述发送套接字调用的装置,该标志仅要求对于所述发送套接字调用仅执行所述缓冲区内的所述单个存储器分配。
11.根据权利要求9的系统,其中,所述传输层还包括:
响应于阻止所述发送套接字调用,用于将最小存储器分配大小设定为所述指定长度的装置,其中所述传输层仅在检测到对于所述最小存储器分配大小存在足够的存储器时自动唤醒所述发送套接字调用。
12.根据权利要求9的系统,其中,该传输层还包括:
响应于阻止所述发送套接字调用,用于将被阻止的线程大小设定为所述指定长度的装置,其中所述传输层仅在检测到对于所述被阻止的线程大小存在足够的存储器时自动唤醒所述发送套接字调用,其中所述被阻止的线程大小独立于指定所述缓冲区内的最小存储器分配大小的设置。
13.根据权利要求9的系统,其中,该传输层还包括:
响应于在所述传输层检测到对接收到的数据的确认,用于用所述确认内指示的量调整指示可用于分配给所述缓冲区的存储器量的计数器的装置。
14.根据权利要求9的系统,其中,所述用于分配给所述缓冲区的所述存储器被保持在存储池内,该存储池被指定用于在所述传输层在多个缓冲区之间分配。
15.根据权利要求9的系统,其中,其中所述单个存储器分配是mbuf。
16.根据权利要求9的系统,其中,该传输层还包括:
用于检测接收所述数据的系统可接收的最大段大小的装置;以及
用于将可一次性地分配给所述缓冲区的存储器的最大量设定为大于所述最大段大小的量的装置。
技术领域\n本发明涉及一种用于通过传输层进行有效的发送套接字调用处理的方法、系统和程序,其中发送套接字调用被阻止,直到足够的存储器可用于对于所述发送套接字调用内的数据的全部长度足够的、套接字缓冲区内的单个存储器分配。\n背景技术\n因特网已成为现代世界内的非常重要的通信介质,并使得世界转变为一个全球数据通信系统。通常,因特网使用传输控制协议/网际协议(TCP/IP)协议套为计算机和其他数据传输设备提供共同的通信机构以使它们相互通信。\n与在服务器上运行的应用的通信通常使用分配给应用程序和服务器装置的端口和地址执行的。端口可以是物理端口或逻辑端口。物理端口是进出计算机或网络设备例如交换机或路由器的路径。例如,个人计算机上的串行和并行端口是用于插入通信线路、调制解调器和打印机的外部插座。每个网络适配器具有用于连接到局域网(LAN)的端口(以太网、令牌环等)。传送和接收数据的任何设备暗示着连接到每条线路的可用端口。\n逻辑端口是分配给在服务器上运行的应用的数字,通过该数字可识别该应用。尽管服务器可能具有单个物理端口,但是服务器可使用多个逻辑端口。逻辑端口标识符和服务器装置的地址的组合被称为套接字。\n服务器的地址是识别网络内的服务器以及如何通过网络将数据路由给服务器的特定物理端口的网络地址。地址可表现为统一资源定位符(URL),或者在因特网的情况下为网际协议(IP)地址例如205.15.01.01,等等。地址被包含在由设备传输的数据包的报头内。通过读取数据包的报头并根据地址确定如何将数据包路由给其的预期目的地,而通过网络将数据包从设备路由到设备。\nTCP/IP协议提供各种套接字函数,所述函数可用于在通过套接字将数据传输给应用以及从应用传输数据时处理数据。一个这样的被应用用于写请求的函数是发送套接字调用。例如,应用调用发送套接字调用并指定套接字、套接字内的缓冲区、将被发送的数据的长度和设定的标志。TCP/IP协议栈的TCP层接收到发送套接字调用,并触发内核以将可用存储器分配给套接字内的发送缓冲区以便写发送套接字调用数据。具体地,一存储池可用于分配给套接字,其中每个分配被称为一mbuf。在一些情况下,存在足够的存储器可用于分配对于发送函数数据的长度足够大的单个mbuf。但是,如果在接收到发送函数时并不是所有的数据被可被写入第一mbuf或者没有存储器可用于分配mbuf,则TCP阻止发送线程。\n当TCP层接受到接收器接收到发送数据包的确认(ACK)时,TCP层调用内核以将被确认的数据包释放回存储池。另外,对于每个ACK,TCP唤醒被阻止的发送线程,发送线程然后触发内核以试图从最近释放的存储器将一mbuf分配到发送缓冲区内,并将数据的下一部分写入该新的mbuf。\n在一个示例中,发送套接字调用将数据的长度设定为64千字节。TCP层发送给接收器的每个数据包被限制为1460字节的最大段大小(MSS),而每个ACK为2MSS或2920字节(4千字节)。当TCP层接收到发送套接字调用时,在该示例中,存在4k的存储器可用于分配给用于套接字的发送缓冲区。内核将4k的mbuf分配给发送缓冲区并将64k数据中的4k写入发送缓冲区,剩余60k数据将被写入。然后,TCP层阻止发送线程,直到接收到下一个ACK。当TCP层接收到下一个ACK时,TCP触发内核以释放保持与该ACK相关联的数据的mbuf。接下来,TCP层唤醒发送线程,该发送线程触发内核以试图从释放的存储器分配新的mbuf,并将另一个4k写入该新的mbuf。因此,对于其中ACK缓慢返回的64k发送套接字调用,在该示例中,TCP层可阻止和唤醒发送线程16次或更多次。\n如示例所示,尽管对于大数据写入的单个发送套接字调用对于发送该数据的应用是有效率的,但是当数据长度大于可用于分配的存储器时,单个发送套接字调用没有在TCP/IP协议栈内被有效率地处理。具体地,为使TCP层通过当没有另外的存储器可用于分配时阻止线程并然后每当接收到ACK时唤醒线程来处理该发送线程,会低效率地锁定大量CPU、总线和存储器资源,并且对于每次唤醒仅写一部分数据。\n此外,由于TCP在每次接收到ACK并且释放存储器时低效率地触发单独的mbuf分配,所以每个mbuf被添加到链中。当mbuf链增加时,定位mbuf以释放存储器变得更加费时从而低效率。另外,当用于单个发送套接字调用的数据被写入多个链接的mbuf时,为了将数据推入网络,TCP层必须将被链接的mbuf的多个指针传递给网络层和链路层。对于包括用于实际上将数据包放置在网络上的适配器硬件的链路层,通过来自由TCP层传递下来的指针对该数据进行直接存储器访问(DMA)并在适配器级排队该数据;但是,执行对被指向的链接的mbuf执行直接存储器访问(DMA)是低效率的,因为适配器仅将连续数据排队,因此需要另外的存储器管理以将被链接的mbuf复制到连续数据中。\n因此,鉴于上文所述,有益的是使传输层能够响应发送套接字调用,从而当存储池没有包括足够的存储器可用于分配给对于发送套接字调用长度足够大的mbuf时,传输层阻止该发送线程,直到有足够的存储器可用于分配单个mbuf以便对于发送套接字调用一次性地写入数据。\n发明内容\n因此,本发明提供了一种用于在网络协议栈的传输层有效率地处理接收到的发送套接字调用的方法、系统和程序。\n在一个实施例内,传输层从应用层接收到对指定长度的数据的发送套接字调用。响应于检测到对于至少该指定长度没有足够的存储器可用于对传输层内的缓冲区的单个存储器分配,传输层阻止该发送套接字调用。传输层只有在检测到对于至少该指定长度存在足够的存储器可用于传输层的缓冲区内的单个存储器分配时才唤醒发送套接字调用,其中唤醒该发送套接字调用触发内核在缓冲区内执行单个存储器分配,并一次性地将数据写入该单个存储器分配。\n应用层可在发送套接字内设置标志,该标志要求对于该发送套接字调用仅进行单个存储器分配。传输层被使能检测该标志。\n响应于阻止该发送套接字调用,传输层可将最小存储器分配大小设定为该指定长度,其中该传输层仅在检测到对于该最小存储器分配大小存在足够的存储器时才自动唤醒该发送套接字调用。或者可选择的,传输层可将与最小存储器分配大小相独立的被阻止的线程大小设定该指定长度,其中该传输层仅在检测到对于该被阻止的线程大小存在足够的存储器时才自动唤醒该发送套接字调用。\n可用于分配给缓冲区的存储器被保持在存储池内,该存储池被指定用于在传输层在多个缓冲区之间分配。从存储池到一缓冲区的单个存储器分配是一mbuf。传输层可检测到接收该数据的系统可接收的最大段大小,并将全部可分配给发送套接字缓冲区的存储器的最大量设定为大于该最大段大小的量。\n附图说明\n在所附权利要求内阐述了本发明的被认为是新颖特征的特性。但是,本发明的本身以及其优选使用模式、另外的目标和优点可通过在结合附图阅读时参照下文对说明性实施例的详细说明最好地理解,附图中:\n图1是示出其中可实现本发明的计算系统的网络的图示;\n图2是示出通信地连接到其中可实现本发明的网络的计算系统的一个实施例的框图;\n图3是示出用于在网络协议栈内有效率地处理发送套接字调用的传输层的图示;以及\n图4是示出用于在网络协议栈的传输层内有效率地处理传送套接字调用的过程和程序的高层逻辑流程图。\n具体实施方式\n现在参照附图,图1示出其中可实现本发明的计算系统的网络的图示。分布式网络100是其中可实现本发明的计算机的网络。分布式网络100包括网络102,其是用于在分布式网络100内连接在一起的各种设备和计算机之间提供通信链路的介质。网络102可包括一种或多种类型的连接,包括但不局限于永久连接例如电线或光缆、通过电话连接实现的临时连接、和无线传输连接。\n在所示示例内,服务器104连接到网络102。另外,客户机108、110和112也连接到网络102。这些客户机108、110和112以及服务器104可以是多种计算系统中的任何一种。在其他实施例内,附加的或替代的客户机和服务器也可连接到网络102。\n另外,在所示示例内,服务器104向客户机108、110和112提供数据,其中客户机108、110和112是在客户机/服务器环境内服务器104的客户机。术语“客户机”和“服务器”用于指计算系统作为数据的接受者(客户机)或数据的提供者(服务器)的一般角色。另外,服务器104和客户机108、110和112中的每一个可用作“客户机”和“服务器”两者,并且可使用计算系统例如图2的计算系统200实现。此外,服务器104和客户机108、110和112还可进行对等网络通信。\n分布式网络100的客户机/服务器环境可在许多不同的网络体系结构内实现。在一个示例内,分布式网络100是因特网,其中网络102代表使用基于包交换的协议套以相互通信的网络和网关的世界范围的集合。基于包交换的协议套的一个示例是传输控制协议/网际协议(TCP/IP)协议套。分布式网络100还可在另外的或其他类型的网络体系结构例如内联网、局域网(LAN)或广域网(WAN)内实现。在其他实施例内,图1所示的网络体系结构和系统可改变。此外,本领域内的那些普通技术人员将理解,所示示例并不是意味着对本发明的结构限制。\n在一个示例内,服务器104可同时从每个客户机系统108、110和112接收到多个访问相同应用或资源的通信请求。服务器104可通过最初调用多个等待接受通信请求的线程来同时服务于这些多个请求。服务器104打开一个新的套接字以处理每个请求。如下文将说明的,当在服务器104内的应用接收到请求并通过发送套接字调用响应以发送数据时,包交换协议栈内的传输层阻止每个写线程且不会唤醒写线程,直到单个缓冲区分配能够接收套接字缓冲区内的整个数据写。通过阻止发送线程直到存储器可用于套接字缓冲区内的、大得足以接收发送套接字调用的长度的单个缓冲区分配,服务器104更有效率地响应于其大小超过在请求时可用于在套接字缓冲区内的分配的存储器的发送套接字调用。\n现在参照图2,框图示出其中可实现本发明的计算系统的一个实施例。本发明可在多种系统包括多种通信地连接到包交换网络例如网络102的计算系统内执行。\n计算机系统200包括总线222或其他的用于在计算机系统200内传递信息的通信设备,和耦合到总线222的用于处理信息的至少一个处理设备例如处理器212。总线222优选地包括低时延和较高时延路径,所述路径由桥和适配器连接并在计算机系统200内被多个总线控制器控制。当实现为服务器时,计算机系统200可包括被设计为提高网络服务能力的多个处理器。当多个处理器共享总线222时,可实现另外的用于管理总线访问和锁定的控制器(未示出)。\n处理器212可以是通用处理器例如IBM的PowerPCTM处理器,该处理器在正常操作期间,在操作系统260、应用软件270、中间件(未示出)和可从动态存储设备例如随机存取存储器(RAM)214、静态存储设备例如只读存储器(ROM)216,数据存储设备例如大容量存储设备218或其他数据存储介质访问的其他代码的控制下处理数据。操作系统260可被称为内核。另外,多个操作系统可在计算机系统200内运行。在一个实施例内,操作系统260和中间件可控制如图4的流程图内所示的经由网络102在计算机系统200和至少一个其他计算机系统之间传送的写请求操作,以及文中所述的其他操作。或者可选择的,本发明的步骤可由包含用于执行所述步骤的硬连线逻辑的特定硬件部件执行,或由被编程的计算机部件和定制硬件部件的任何组合执行。\n本发明可被提供为被包含在机器可读介质上的计算机程序产品,该介质上存储有用于将计算机系统200编程以执行根据本发明的过程的机器可执行指令。文中使用的术语“机器可读介质”包括参与向处理器212或计算机系统200的其他部件提供指令以便执行的任何介质。这种介质可采取任何形式,包括但不局限于非易失性介质、易失性介质和传输介质。非易失性介质的普通形式包括例如软盘(floppy disk)、软盘(diskette)、硬盘、磁带或任何其他磁介质、光盘(CD-ROM)或任何其他光介质、穿孔卡或任何其他的具有孔图案的物理介质、可编程ROM(PROM)、可擦除PROM(EPROM)、电EPROM(EEPROM)、闪速存储器、任何其他存储器芯片或盒、或计算机系统400可从中读取并且适于存储指令的任何其他介质。在本实施例中,非易失性介质的示例是大容量存储设备218,其被示为计算机系统200的内部部件,但是应理解也可由外部设备提供。易失性介质包括动态存储器例如RAM 214。传输介质包括同轴电缆、铜线或光纤,包括构成总线222的线路。传输介质也可表现为声波或光波例如在射频或红外线数据通信期间生成的那些波。\n此外,本发明可作为计算机程序产品被下载,其中程序指令可作为包含在载波或其他传播介质内的数据信号,经由网络102到网络链路234(例如调制解调器或网络连接)到耦合到总线222的通信接口232,而从远程计算机例如服务器240被传送到请求计算机系统200。通信接口232提供了耦合到网络链路234的双向数据通信,所述网络链路可连接到例如局域网(LAN)、广域网(WAN),或直接连接到因特网服务提供商(ISP)。具体地,网络链路234可提供与一个或多个网络例如网络102的有线和/或无线网络通信。此外,尽管未示出,但是通信接口232可包括软件例如设备驱动器、硬件例如适配器、以及其他使得可进行通信的控制器。当实现为服务器时,计算机系统100可包括可经由例如连接到输入/输出控制器的多个外设部件互连(PCI)总线桥访问的多个通信接口。这样,计算机系统200允许经由多个单独的端口连接到多个客户机,并且每个端口也可支持与多个客户机的多个连接。\n网络链路234和网络102都使用可承载数字数据流的电、电磁或光信号。通过各个网络的信号和网络链路234上的以及通过通信接口232的、承载到和来自计算机系统200的数字数据的信号可以这传送信息的载波的形式。\n另外,计算机系统200可包括有助于输入和输出的多个外设部件。这些外设部件都连接到耦合到多层总线222之一的多个控制器、适配器和扩展槽例如输入/输出(I/O)接口226。例如,输入设备224可包括例如经由控制输入的I/O接口226在总线222上被通信地使能的麦克风、键盘、鼠标或其他输入外设部件。另外,例如,经由用于控制输出的I/O接口226在总线222上被通信地使能的显示设备220可包括例如一个或多个图形显示设备,但是也可包括其他输出接口例如音频输出接口。在本发明的其他可选择实施例内,可添加附加的或替代的输入和输出外设部件。\n本领域内的那些普通技术人员将理解图2内所示的硬件可改变。此外,本领域内的那些普通技术人员将理解,所示示例并不是意味着本发明的结构限制。\n现在参照图3,图示示出用于在网络协议栈内有效率地处理发送套接字调用的传输层的一个实施例。在该示例内,参照发送调用说明了TCP/IP协议栈300的元件的交互。在示例内,协议栈300的层包括应用层302、套接字层304、TCP层306、网络层308和链路层314。套接字层304和TCP层306被单独示出,但是也可被认为是传输层的一部分。应理解,使得可进行包交换通信的其他协议栈可实现本发明,并且附加的或替代的层可在协议栈300内实现。\n在示例内,应用层302将形式为send()命令的发送套接字调用传递给套接字层304。在示例内,如标号320所示,send()命令可包括多个参数,包括但不局限于套接字标识符、缓冲区标识符、数据长度和标志。在本发明的一个实现内,标志参数包括一次性地写发送套接字调用的所有数据的设置。例如,当在send()命令内设置名为MSG_SNDALL的标志时,仅当存在足够的空间可用于一次将用于发送套接字调用的所有数据写入套接字层304内的发送缓冲区322时,该数据才被写入发送缓冲区322,以便经由网络102传输给接收器。应用层302可包括多种类型的应用例如网络应用,和应用层协议例如HTTP协议、SMTP、FTP和域名系统(DNS)。\n另外,在该示例内,对于将一次性地被写入发送缓冲区322的发送套接字调用内的数据,内核必须分配足以保持发送套接字调用内的数据的长度的单个mbuf。在该实施例内,mbuf例如mbuf 340、342和344是各被内核从mbuf池324单独分别分配给发送缓冲区322的存储块。在该示例内,内核将每个分配的mbuf添加到一mbuf链中,其中每个mbuf均被单独的指针所指向,例如链接的mbuf 340、342和344。应理解,作为对链接的附加或作为链接的替代,内核可实现其他存储器分配管理结构。另外,应理解,尽管参照控制从mbuf池324到发送缓冲区322的存储器分配的内核说明了本实施例,但与内核分离的分配资源也可控制存储器分配。\n具体地,mbuf池324指为向套接字层304内的缓冲区进行分配而留出的存储器。除了发送缓冲区322外,套接字层304可包括附加的发送缓冲区、接收缓冲区、和其他类型的用于保持数据的缓冲区。另外,套接字层304可包括多个打开的套接字。可理解,可以有多个mbuf池可用,一mbuf池可由多个单独的套接字层共享,以及可实现其他存储器分配构造。\n控制块326可包括用于限制存储器从mbuf池324到套接字层304内的缓冲区的分配。例如,max_sendbuffer 330指示内核可从mbuf池324一次分配到发送缓冲区322的最大存储器总量。在另一示例中,在某些协议栈例如Berkeley软件分发(BSD)或BSD派生协议栈中,一低水位标记328设置用于内核为发送缓冲区322内的每个mbuf分配的最小存储器量。可理解,控制块326内的附加的或替代的设置可限制和调整从mbuf池324的存储器分配。此外,尽管本实施例是参照套接字层304和TCP层306可访问的控制块326说明的,在其他实施例中,每一层可访问单独的控制块或仅访问控制块内的特定设置。\n返回该示例,在套接字层304接收到的每个发送套接字调用被传递给TCP层306。通常,TCP层306将消息从应用层302传送到客户系统,并将从客户系统接收到的消息传送给应用层302。具体地,TCP层306将数据从发送缓冲区322传送给客户系统。\n在一个实施例中,计数器remaining_sendbuffer 332指示被释放到mbuf池324的、可被分配给发送缓冲区322的当前存储器量。在一些实施例内,其他计数器可指示可用于分配给mbuf的存储器,或者可能需要对内核的调用以访问可用于分配给mbuf的存储器量。\n在该示例内,在TCP层306接收到具有设定的MSG_SNDALL标志的发送套接字调用时,TCP层306检查计数器remaining_sendbuffer 332,以检测mbuf池324内是否有足够的空间可用于分配大得足以保持发送套接字调用内的数据长度的mbuf。如果存在足够的空间可用,则TCP层306触发内核以在发送缓冲区322内为发送套接字调用分配mbuf块,并将数据写入发送缓冲区322内的mbuf。\n对于写入发送缓冲区322的mbuf块的数据,如标号418所示,TCP层306控制该数据以包为单位到网络的传输。首先,TCP层306将数据在包大小的段中传递给网络层308。如标号316所示,网络层308控制包沿通过链路层341的网络链路到接收系统例如如图1所示的客户机108、110或112之一的发送。尽管未示出,但是网络层308可运行IP协议。链路层314可包括控制适配器312的设备驱动器310。适配器312可包括例如网络接口卡。\n响应于从发送系统接收到包,接收系统返回确认(ACK),如标号318所示。ACK例如ACK 318被上推到TCP层306。TCP层306接收到每个ACK并调用内核以从发送缓冲区322释放相关联的mbuf。当为每个ACK释放存储器时,TCP层306可调整remaining_sendbuffer 332内的记数以指示该调整。\n或者可选择的,当TCP层306接受到具有设定的MSG_SNDALL标志的发送套接字调用,并且TCP层306确定没有足够的空间可用于分配对于发送套接字调用长度足够大的单个mbuf时,则TCP层306阻止发送线程,并在被阻止的线程计数334内设定这样的设置,即不唤醒发送线程,直到在mbuf池324内存在足够的空间可用于为发送套接字调用长度分配单个mbuf。对于接收到的每个ACK,TCP层306可从remaining_sendbuffer 332检测到是否存在足够的空间可用于为发送套接字调用长度分配单个mbuf。\n在一个示例中,如果发送套接字调用的长度为64千字节(k),并且如remaining_sendbuffer 332内指示的,mbuf池324仅包括4k可用于分配给发送缓冲区322,则TCP层306阻止发送线程,并在被阻止的线程计数334内设定64k的阈值,从而直到接收到足够的、将remaining_sendbuffer 332增加到被阻止的线程计数334内的阈值的ACK,TCP层306不唤醒被阻止的发送线程。当TCP层306检测到remaining_sendbuffer 332达到匹配被阻止的线程计数324内的阈值的计数时,则TCP层306唤醒发送线程,该线程触发内核分配至少64k的mbuf并将64k的数据写入mbuf。\n在一个实施例内,作为设定被阻止的线程计数334的替代,套接字层304可将低水位标记设定为发送套接字调用长度,其中低水位标记330指定最小的mbuf分配大小,并且TCP层306被设定为不唤醒发送线程,直到最小mbuf分配大小可用。遵循前面的示例,响应于接收到长度为64k的发送套接字调用,套接字层304会将低水位标记330设定为64k。因此,在协议栈已根据低水位标记330阻止发送线程的情况下,在发送套接字调用内包含标志并指导套接字层304将低水位标记330更新为发送套接字调用长度,将使能本发明而不用向控制块326添加另外的设置或计数器。在其他实施例内,控制块326可包括附加的或替代的设置和计数器,应用层302可设定替代的标志或发送其他命令,并且套接字层304或TCP层306可访问附加的设置和计数器,并响应于替代的标志或命令以控制将数据消息写入连续数据空间以用于在包交换协议栈内传输。\n根据一个优点,通过仅当内核可分配至少为发送套接字调用长度的单个mbuf时才唤醒发送线程来控制发送套接字调用,TCP层306不再每当接收到ACK时无效率地唤醒发送线程。具体地,针对大的发送套接字调用仅唤醒发送线程一次减少了执行与唤醒发送套接字调用相关联的附加操作的次数。尽管未示出,TCP层306通过调用内核执行唤醒来唤醒被阻止的发送套接字调用。接下来,内核确定CPU是否可用。一旦CPU可用,则内核在CPU上加锁并等待套接字变为可用。具体地,传入的ACK可具有高于写入套接字层304的优先级,从而触发在试图获得套接字锁定的不同的ACK之间的套接字锁定争用,并导致在套接字可用于发送套接字调用之前显著的延迟。一旦套接字变为可用,则内核获得用于发送套接字调用的套接字锁定。接下来,内核确定什么空间可用于mbuf分配并控制使用该可用空间从mbuf池224到发送缓冲区332的mbuf分配。最后,内核将用于发送线程的数据写入被分配的mbuf。因此,考虑到实际执行发送套接字调用操作所需的附加操作,这些操作中的每一个仅执行一次而不是每次接收到ACK时都执行,可更有效地使用内核、总线和CPU资源,并减小套接字锁定竞用。\n根据另一个优点,通过仅在内核可一次性地分配至少为发送套接字调用长度的单个mbuf并写数据时才唤醒发送线程来控制发送套接字调用,内核不再被无效率地触发以在TCP层306每次接收到ACK时分配单独的mbuf。仅为每个发送套接字调用分配单个mbuf减小了当TCP层306将用于发送套接字调用的数据推入网络所需的操作,并减小了当TCP层306接收到针对该数据的ACK时所需的操作。\n在第一示例中,为每个发送套接字调用分配单个mbuf减小了TCP层306将数据推入网络所需的操作。返回当MSG_SNDALL标志没有被设定时的TCP性能的限制,TCP层306为每个ACK唤醒发送线程,并且结果,对单个发送套接字调用分配多个mbuf且执行多个数据写。所述多个mbuf被链接且每个mbuf被一个指针引用。当存在针对单个发送套接字调用的多个mbuf的多个指针时,TCP层306必须将所有指针传递到网络层308和链路层314,从而需要附加的资源。此外,为使链路层314将来自多个mbuf的发送套接字调用数据排队,必须通过DMA操作执行附加的存储器管理操作,以将多个mbuf转换成链路层314的连续数据需求。相反,当MSG_SNDALL标志被设定时,TCP层306仅在有足够的空间可用于分配至少为发送套接字调用长度的单个mbuf时才唤醒发送线程,并因此仅有一个被传递到网络层308和链路层314的用于发送套接字调用的指针。另外,链路层314可将连续数据的单个mbuf排队而不执行附加的存储器管理操作,从而允许当将数据排队以通过适配器312输出时可进行更有效的DMA操作。\n另外,仅为每个发送套接字调用分配单个mbuf使得TCP层306可更有效率地利用例如TCP分段卸载的服务。在一个示例中,适配器312可提供TCP分段卸载选项,其允许TCP层306将数据分段卸载到适配器312。TCP层306通常执行将数据分段到由MSS限制的段内的数据分段。在一个示例内,通过TCP层306确定链路层314可发送以及接收器可接收的最大帧长度(也被成为最大传送单元(MTU)),然后设定MSS以确保TCP段和网络层308添加的IP数据可放进单个帧内,来设定MSS。对于TCP分段卸载,TCP层306将数据从单个mbuf块推给适配器312以将分段过程卸载到适配器312。ACK通常确认两个(2)包或2MSS。因此,当TCP层306调用内核以释放存储器时,与ACK内的2MSS相关联的存储器被释放。通过为发送套接字调用设定MSG_SNDALL,对于大于2MSS的写,TCP层306仅需要在TCP分段卸载请求内将针对一个mbuf的指针传递给链路层314。\n在第二示例中,为每个发送套接字调用分配单个mbuf减少了TCP层306接收到ACK时所需的操作。如果MSG_SNDALL没有被设定,则很可能每个mbuf将被设定为大小与每个ACK的相关联的数据相等,并且可为单个发送套接字调用分配多个mbuf。当接收每个ACK时,TCP层306将触发释放相关联的数据和mbuf。但是,当针对单个发送套接字调用链接许多较小的mbuf时,内核必须首先遍历链以定位相关联的mbuf,并然后执行消耗CPU和套接字资源以将每个mbuf释放回mbuf池324的操作。相反,当MSG_SNDALL被设定时,则对于大于ACK大小的发送套接字调用长度,相关联的mbuf将大于ACK大小。当TCP层306接收到针对与MSG_SNDALL被设定的发送套接字调用相关联的数据的ACK时,将仅有一个mbuf与该发送套接字调用相关联,从而除去了识别用于发送套接字调用的哪个mbuf与ACK相关联的步骤。此外,当TCP层306接收到针对与MSG_SNDALL被设定的发送套接字调用相关联的数据的ACK时,为每个ACK移动mbuf内的指针,从而需要最少的内核资源,直到到达mbuf的末端并且对于发送套接字调用需要单个mbuf释放操作。\n考虑到上述优点,重要地应指出,max_sendbuffer 330可被设定以进一步提高效率,其中应用被使能以设定MSG_SNDALL标志。具体地,max_sendbuffer 330可设定为是接收器的窗口的2倍或3倍的量,其可以是MSS的两倍或3倍,从而当套接字层304等待空间变为可用以便复制数据时,TCP层306不会缺乏数据来发送。\nTCP层306的另一个功能是检测包何时已被丢失并重传丢失的包。在一个示例中,TCP层306可实现“快速重传”功能。在“快速重传”功能下,TCP层306即使在包丢失之后仍继续发送包。具体地,TCP层306检测重复确认的数量何时达到快速重传阈值,例如三个重复确认。当达到阈值时,则TCP层306推断重复确认内指示的包已丢失并自动重传丢失的包。将max_sendbuffer 330的大小设定为MSS的两倍或三倍在考虑到“快速重传”功能时也是重要的,这样可存在足够的空间来保持另外的包,以便即使在丢失包之后TCP层306仍继续发送包。\n现在参照图4,高层逻辑流程图示出用于在网络协议栈的传输层内有效率地处理发送套接字调用的过程和程序。如图所示,过程在块400处开始并此后前进到块402。块402示出传输层检测到MSG_SNDALL被设定的发送套接字调用,并且过程转到块404。\n块404示出确定发送套接字调用的长度是否大于可用于从mbuf池分配到套接字缓冲区的mbuf空间。如果存在足够的可用空间,则过程转到块416。块416示出触发内核以处理发送套接字调用,这包括分配对于套接字调用长度足够的mbuf并将数据写入mbuf,并且过程结束。\n返回块404,如果不存在足够的可用空间,则过程转到块406。块406示出阻止发送线程,并设定控制块仅在存在足够的空间可用于对于发送套接字调用长度是足够的单个mbuf时唤醒发送线程。接下来,块408示出确定是否在传输层检测到ACK。当检测到ACK时,过程转到块410。块410示出触发内核以释放用于与ACK相关联的数据的mbuf,并且过程转到块412。\n块412示出确定传输层现在是否检测到足够的空间可用于被阻止的发送mbuf分配。如果目前仍没有足够的空间,则过程转到块408。如果有足够的空间可用,则过程转到块414。块414示出唤醒发送线程,并且过程转到块416并且如前文所述地前进。\n尽管参照优选实施例具体地示出和说明了本发明,但是本领域内的那些技术人员将理解,可在形式和细节上做出许多改变而不背离本发明的精神和范围。
法律信息
- 2020-10-30
未缴年费专利权终止
IPC(主分类): H04L 29/08
专利号: ZL 200610146574.5
申请日: 2006.11.15
授权公告日: 2010.10.13
- 2015-08-19
专利权的转移
登记生效日: 2015.07.28
专利权人由国际商业机器公司变更为国际商业机器(中国)有限公司
地址由美国纽约变更为201203 上海市浦东新区张江高科技园区科苑路399号张江创新园10号楼7层
- 2010-10-13
- 2007-08-15
- 2007-06-20
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2005-03-02
|
2004-08-05
| | |
2
| |
2005-11-16
|
2004-05-12
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |