[发明专利]消除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拆分。

下载完整专利技术内容需要扣除积分,VIP会员可以免费下载。

该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于北京航空航天大学,未经北京航空航天大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服

本文链接:http://www.vipzhuanli.com/pat/books/201310194191.5/2.html,转载请声明来源钻瓜专利网。

×

专利文献下载

说明:

1、专利原文基于中国国家知识产权局专利说明书;

2、支持发明专利 、实用新型专利、外观设计专利(升级中);

3、专利数据每周两次同步更新,支持Adobe PDF格式;

4、内容包括专利技术的结构示意图流程工艺图技术构造图

5、已全新升级为极速版,下载速度显著提升!欢迎使用!

请您登陆后,进行下载,点击【登陆】 【注册】

关于我们 寻求报道 投稿须知 广告合作 版权声明 网站地图 友情链接 企业标识 联系我们

钻瓜专利网在线咨询

周一至周五 9:00-18:00

咨询在线客服咨询在线客服
tel code back_top