一种减少多核系统上tcp连接建立时锁竞争的方法【专利摘要】多核多网卡队列环境下tcp连接建立时,所有cpu共享同一个侦听套接字,必须通过竞争获取socket的互斥锁才能修改侦听套接字的半连接hash表和连接队列,无法充分发挥多核的并行性能。本发明通过修改Linux内核代码,把内核中TCP监听套接字的连接队列拆分成多队列,缓解了TCP连接建立时锁的竞争。【专利说明】一种减少多核系统上tcp连接建立时锁竞争的方法【
技术领域:
】[0001]本发明涉及一种减少多核系统Linux内核TCP连接时锁竞争的方法。【
背景技术:
】[0002]随着多核技术的不断普及,多核的硬件平台越来越平民化,计算机中将拥有越来越多的CPU核。在这样的背景下,发挥硬件能力提高系统效率显得至关重要。Linux作为一个通用操作系统的典型,由于其开放性和健壮性,正越来越受公司、政府和研究院所青睐;从位列T0P500的高性能集群到各种小型的嵌入式设备,我们都可以看到Linux的应用。[0003]但目前的Linux内核中TCP/IP协议栈的实现对于像web服务这种要处理大量连接的程序并不能充分利用多核处理器的性能,表现为不能保证多个CPU上工作的web服务连接程序(这些程序都从同一个侦听套接字中获取连接)在处理网络包后并行的建立连接。因为所有的核都共享同一个tcp侦听套接字。所有的CPU都必须在获取侦听套接字的锁之后才能建立连接,之后被用户态程序取走。【
发明内容】[0004]Linux中,TCP3次握手建立连接的过程如图1所示,一个侦听套接字,当收到客户端发送的建立TCP连接请求的包SYN时,Linux首先会创建一个请求套接字structrequest_sock,把它放入侦听套接字的syn_table哈希表里,然后发送SYN/ACK包给客户端,当客户端再发来ACK包,该请求套接字被放入侦听套接字的icsk_accept_queue的先进先出接收队列中。当程序在该侦听套接字调用acceptO系统调用时,便从icsk_accept_queue中取走一个请求套接字,建立了一个新的连接。[0005]目前Linux内核中,多cpu情况下,各核共享同一个TCP侦听套接字,这使得各个cpu将创建requestsock加入到syn_table和将tcp_sock加入accept链表队列时都存在锁的竞争。[0006]改进后的三次握手如图2所示,本发明将大socket锁进行了拆分,对syn_table和aCCpet_qUeUe分别加锁,并且把acc印t队列进行了拆分,不同的队列使用不同的锁,这样细化了锁的粒度,减少了锁的竞争。两个不同的网络数据在CPUA和CPUB中处理后被放入了不同的accept队列链表,CPUA和CPUB上的应用程序可以分别从相应的accept队列中获取网络连接。【专利附图】【附图说明】[0007]图1为TCP套接字建立连接过程中存在的锁。[0008]图2分解accept_queue后连接建立时锁分布的情况。【具体实施方式】[0009]Linux内核使用structsock来表示一个连接,本文在TCP监听套接字structtcp_sock中修改了两处,一是增加了syn_table的互斥锁syn_lock,另外对icsk_accept_queue进行了改造,将原来的单链表该为多链表,并且增加了一个accept_queue_lock[N]的互斥锁数组,N表示cpu核的个数。【权利要求】1.减少多核系统上tcp连接建立时锁竞争的方法,其特征在于把Linux内核的TCP监听套接字的中的大socket锁进行了细化,增加了syn_table的锁和accept队列锁。2.在同一个socket中增加多个accpet队列链表其特征在于:修改Linux内核,队列的增加是在同一个socket中发生的。【文档编号】H04L29/08GK103533025SQ201310430398【公开日】2014年1月22日申请日期:2013年9月18日优先权日:2013年9月18日【发明者】王雷,王宇,赵玉龙申请人:北京航空航天大学