[发明专利]消除SMP系统上Linux内核TCP连接非亲和性的方法无效
申请号: | 201310194191.5 | 申请日: | 2013-05-23 |
公开(公告)号: | CN103309842A | 公开(公告)日: | 2013-09-18 |
发明(设计)人: | 王雷;赵玉龙;原仓周;梁栋 | 申请(专利权)人: | 北京航空航天大学 |
主分类号: | G06F15/173 | 分类号: | G06F15/173;H04L29/06 |
代理公司: | 暂无信息 | 代理人: | 暂无信息 |
地址: | 100191*** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 消除 smp 系统 linux 内核 tcp 连接 亲和性 方法 | ||
技术领域:
本发明涉及一种消除SMP系统Linux内核TCP连接非亲和性的方法,属于计算机科学技术领域。
背景技术:
随着多核技术的不断普及,多核的硬件平台越来越平民化,计算机中将拥有越来越多的CPU核。在这样的背景下,发挥硬件能力提高系统效率显得至关重要。Linux作为一个通用操作系统的典型,由于其开放性和健壮性,正越来越受公司、政府和研究院所青睐;从位列TOP500的高性能集群到各种小型的嵌入式设备,我们都可以看到Linux的应用。
但目前的Linux内核中TCP/IP协议栈的实现并不能充分利用多核处理器的性能,表现为不能保证一个TCP连接的数据包的底层网卡硬件中断、软中断处理与处理该TCP连接的上层应用在同一个CPU核上运行,这称为非亲和的TCP连接。相反,如果一个TCP连接数据包底层处理和它的上层应用在一个CPU核上运行,称为亲和的TCP连接。亲和TCP连接相比非亲和TCP有很大的性能优势,会大幅减少CPU的高速缓存失效率和锁竞争等待的时间。
发明内容:
Linux中,TCP3次握手建立连接的过程如图1所示,一个侦听套接字,当收到客户端发送的建立TCP连接请求的包SYN时,Linux首先会创建一个请求套接字struct request_sock,把它放入侦听套接字的syn_table哈希表里,然后发送SYN/ACK包给客户端,当客户端再发来ACK包,该请求套接字被放入侦听套接字的icsk_accept_queue的先进先出接收队列中。当程序在该侦听套接字调用accept()系统调用时,便从icsk_accept_queue中取走一个请求套接字,建立了一个新的连接。
目前Linux内核中,TCP侦听套接字使用一个全局accept队列,这可能会使一个TCP连接的上层应用程序和它的网络包网卡中断和软中断运行在不同的CPU上。
如图2所示,在CPU M和CPU N分别有一个nginx worker进程处理来自用户的TCP连接,连接A的数据包都被网卡映射到CPU N。当内核完成对连接A的三次握手时,可能由nginx M通过accept()系统调用获得了连接A的处理权。
为了减少cache miss,处理一个TCP连接的上层应用程序和该连接的所有数据包的网卡中断处理、软中断都应该在同一个CPU上处理。为了达到这个目的,我设计了一套方案,把accetp queue接收队列拆成per-CPU队列,并且利用网卡的RSS机制,如图3所示。
支持RSS的网卡接收到一个数据包,网卡从包头提取5元组(源IP、源端口、目的IP、目的端口、协议类型)来进行哈希运算。哈希值的低7位用来索引Indirection Table,它的每个表项对应一个CPU。该CPU会被发送一个MSI-X网卡中断,该包的网卡中断将在该CPU上执行,若内核没有开启RPS,则对应的软中断也会在该CPU上执行。若一个连接的第一个包到达一个CPU,那么该连接的所有后续包都将在该CPU上处理。
如图4所示,nginx N调用accept(),只能从CPU N的本地accept queue接收队列取元素,连接A必将由nginx N处理。
附图说明:
图1为TCP套接字建立连接过程。
图2为应用程序和TCP连接的数据包网卡中断和软中断运行在不同CPU上的例子。
图3为利用RSS和per-cpu机制的accetp队列处理流的流程图。
图4为应用程序和连接的数据包网卡中断和软中断运行在相同的CPU上的例子。
图5改进后的Linux内核中的TCP监听套接字的数据结构。
具体实施方式:
Linux内核网络功能的实现是内核中最复杂、牵涉最广的一部分。除了经典的因特网协议(如TCP、UDP)和相关的IP传输机制以外,Linux还支持许多其他的互联方案,使得所有能想到的计算机和操作系统能够互操作。把TCP监听套接字的icsk_accept_queue队列拆成per-core的队列,在不影响内核其他部分代码的前提下,进行改动是非常困难的。内核使用同一个数据结构struct sock来表示所有的协议,每种协议都有自己的特例化的sock结构,并保存它自己一些的信息(比如TCP套接字的基于sock的struct tcp_sock),内核中存在大量代码对这个数据结构进行操作。
为了不对其他网络协议的内核代码造成影响,本文采用把TCP监听套接字struct tcp_sock复制NR_CPUS-1份,如图5所示,从而icsk_accept_queue也复制了NR_CPUS-1份,每个启用的CPU核拥有其中的一份,通过这种方式实现icsk_accept_queue队列的per-core拆分。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于北京航空航天大学,未经北京航空航天大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201310194191.5/2.html,转载请声明来源钻瓜专利网。
- 上一篇:一种动态检验处理服从正态分布数据的方法
- 下一篇:滤光组件的切换定位控制方法