一种基于eBPF的内核丢包检测方法、系统和装置

文档序号:1965892 发布日期:2021-12-14 浏览:14次 >En<

阅读说明:本技术 一种基于eBPF的内核丢包检测方法、系统和装置 (Method, system and device for detecting kernel packet loss based on eBPF ) 是由 周骏迪 苌程 蒋玉芳 于 2021-09-10 设计创作,主要内容包括:本发明公开了一种基于eBPF的内核丢包检测方法、系统和装置,所述内核丢包检测方法包括:基于eBPF,在内核函数tcp-drop前进行插桩;通过插桩的函数,从寄存器中抓取内核函数tcp-drop的丢包数据,并将所述丢包数据存入eBPF MAP中;在用户态中,读取所述eBPF MAP中的丢包数据;将所读取的丢包数据匹配相应的虚拟机、进程或容器,获取匹配数据。在寄存器中抓取内核函数的丢包数据,保存在eBPF MAP中,在用户态下,可以读取到eBPF MAP中的丢包数据;数据在丢包时才会调用tcp-drop,因此仅采集了丢包数据,而不会采集其它的正常数据或非丢包数据,利于减少计算或数据体量,同时不会对内核网络包路径造成影响;匹配数据利于提高数据的可读性。(The invention discloses a method, a system and a device for detecting kernel packet loss based on eBPF, wherein the method for detecting kernel packet loss comprises the following steps: based on eBPF, performing instrumentation before a kernel function tcp _ drop; capturing packet loss data of a kernel function tcp _ drop from a register through a function of instrumentation, and storing the packet loss data into an eBPF MAP; in a user mode, reading packet loss data in the eBPF MAP; and matching the read packet loss data with a corresponding virtual machine, process or container to obtain matched data. Capturing packet loss data of the kernel function in a register, storing the packet loss data in the eBPF MAP, and reading the packet loss data in the eBPF MAP in a user mode; the tcp _ drop is called when the data is lost, so that only lost data is collected, other normal data or non-lost data cannot be collected, the calculation or data volume is reduced, and the packet path of the kernel network cannot be influenced; matching data facilitates improved readability of the data.)

一种基于eBPF的内核丢包检测方法、系统和装置

技术领域

本发明涉及计算机技术领域,具体涉及一种基于eBPF的内核丢包检测方法、系统和装置。

背景技术

数据在网络中是被分成一个个数据包传输的,每个数据包中有表示数据信息和提供数据路由的帧。而数据包在一般介质中传播是总有一小部分由于各种各样的原因而丢失,而大部分数据包会到达目的终端。网络丢包率是数据包丢失部分与所传数据包总数的比值。正常传输时,网络丢包率应该控制在一定范围内。在数据中心中,网络的运维是对业务运维中的重要一环,只有保证了网络的平稳运行,业务才能平稳运行,网络运维中很重要的一个指标就是丢包率,如果丢包率很高,业务正常执行的延时就会大很多,甚至出现业务异常,因此丢包检测对于数据中心的意义非常重要。

目前网络运维中为了得到网络丢包率主要有两种方式:第一种方式称之为交换机镜像,在交换机或路由器上通过端口镜像功能,将一个或多个源端口的数据流量转发到某一个指定端口来实现对网络的监听;第二种方式称之为主机抓包分析,通过Tcpdump将主机所有经过的网络流量抓取形成pcaap文件,之后利用类似Wi reshark工具进行分析。不管是是交换机镜像模式,还是主机抓包分析模式,网络丢包分析的本质都是获取Tcp的流量,之后根据Tcp原理,分析Tcp数据包的情况,从而判断出是否丢包。因此抓取的数据量和分析的数据量较大。

例如,交换机镜像模式下,需要在交换机层面做镜像分光,需要有单独的存储所有的网络包,之后有大性能的机器进行分析。由于数据中心的规模都不小,每天的流量都可以达到TB级别,端口镜像实施成本都在几百万至数千万级别。同时交换机镜像模式不适用于云环境,因为虚拟云网络通讯的时候,很多流量不通过交换机,比如两台部署在同一台物理机的虚拟机进行网络通信就不经过交换机。主机抓包分析模式虽然成本比端口镜像省了很大的存储成本,但是其实时性不足,只能在有问题之后,作为事后排查问题的手段;同时如果长期开启该模式,对处理器和本地磁盘存储的要求很大,在生产环境中都是事后开启。

发明内容

针对现有技术中存在的上述技术问题,本发明提供一种基于eBPF的内核丢包检测方法、系统和装置,仅抓取丢包数据,数据处理量少。

本发明公开了一种基于eBPF的内核丢包检测方法,所述内核丢包检测方法包括:基于eBPF,在内核函数tcp_drop前进行插桩;通过插桩的函数,从寄存器中抓取内核函数tcp_drop的丢包数据,并将所述丢包数据存入eBPF MAP中;在用户态中,读取所述eBPF MAP中的丢包数据;将所读取的丢包数据匹配相应的虚拟机、进程或容器,获取匹配数据。

优选的,抓取内核函数tcp_drop的丢包数据的方法包括:

在函数tcp_drop执行前,从内核数据结构pt_reges中拦截丢包数据。

优选的,所述函数tcp_drop的参数包括SK和SKB;

从内核数据结构pt_regs的第一个入参中读取SK参数的值;

从内核数据结构pt_regs的第二个入参中读取SKB参数的值。

优选的,插桩的函数包括Hook函数,通过Hook函数抓取函数tcp_drop的丢包数据,并将所述丢包数据保存在eBPF Map中。

优选的,将所述丢包数据转换为event结构数据后,保存在eBPF Map中;

在用户态中,从所述eBPF Map中所读取的丢包数据包括:tcp连接的状态和sk_buff;

所述sk_buff包括以下任一信息或它们的组合:tcp四元组、网卡名称和mac地址。

优选的,本发明的内核丢包检测方法,还包括从sk_buff中解析数据的方法:

根据sk_buff的head地址和mac_head地址偏移量计算ethhdr地址,在ethhdr数据结构中获取mac地址;

根据sk_buff的head地址和network_header地址偏移量计算iphdr地址,在ipdhdr数据结构中获取IP地址;

根据协议转化数据结构,TCP转化为tcphdr,IPIP的端口为0,UDP为udphdr,再从所转化的数据结构中获取srcport和dstprot端口。

优选的,将所读取的丢包数据匹配相应的虚拟机或进程的方法包括:

从系统文件中获取IP、端口列表,以及进程列表;

将所述tcp四元组与所述IP、端口列表进行匹配,获得关联虚拟机的信息;

将所述tcp四元组与所述进程列表匹配,获得关联进程的信息;

将所读取的丢包数据匹配容器的方法包括:

根据所述TCP四元组中的容器ID或网卡名称,匹配相应的容器。

优选的,基于eBPF的Kprobe探针的方法在内核函数tcp_drop中进行插桩。

本发明还提供一种用于实现上述内核丢包检测方法的系统,包括:插桩模块、拦截模块、拷贝模块和匹配模块;

所述插桩模块用于基于eBPF,在内核函数tcp_drop前进行插桩;

所述拦截模块用于通过插桩的函数,从寄存器抓取内核函数tcp_drop的丢包数据,并将所述丢包数据存入eBPF MAP中;

所述拷贝模块用于在用户态中,读取所述eBPF MAP中的丢包数据;

所述匹配模块用于将所读取的丢包数据匹配相应的虚拟机、进程或容器,获取匹配数据。

本发明还提供一种装置,包括存储器和处理器,所述存储器用于保存程序,所述程序包括用于实现上述内核丢包检测方法的指令;

所述处理器用于执行所述程序。

与现有技术相比,本发明的有益效果为:通过插桩的方法,在寄存器中抓取内核函数的丢包数据,保存在eBPF MAP中,在用户态下,可以读取到eBPF MAP中的丢包数据;数据在丢包时才会调用tcp_drop,因此仅采集了丢包数据,而不会采集其它的正常数据或非丢包数据,利于减少计算或数据体量,同时不会对内核网络包路径造成影响;匹配数据利于提高数据的可读性。

附图说明

图1是本发明的基于eBPF的内核丢包检测方法的流程图;

图2是本发明的系统逻辑框图;

图3是实施例的逻辑框图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。

下面结合附图对本发明做进一步的详细描述:

一种基于eBPF的内核丢包检测方法,如图1所示,所述内核丢包检测方法包括:

步骤101:基于eBPF,在内核函数tcp_drop前进行插桩。

在一个具体实施例中,基于eBPF的Kprobe探针的方法在内核函数tcp_drop前进行插桩,Kprobe探针为现有技术,本发明中不再赘述。内核触发丢包时,会执行函数tcp_drop,其函数结构为:void tcp_drop(struct sock*sk,struct sk_buff*skb),其中,sk为第一参数,skb为第二参数。sk_buff是Linux网络代码中最重要的结构体之一,是Linux在其协议栈里传送的结构体,也就是所谓的“包”,数据结构里包含了各层协议的头部。

步骤102:通过插桩的函数,抓取内核函数tcp_drop的丢包数据,并将所述丢包数据保存在eBPF Map中。eBPF Map是以键/值方式存储在内核中的数据结构,可以被eBPF程序访问,通常设置在环形缓冲区或循环缓冲区中(Ring buffer)。插桩的函数可以是Hook函数。

步骤103:在用户态中,读取所述eBPF Map中的丢包数据。

步骤104:将所读取的丢包数据匹配相应的虚拟机、进程或容器,获取匹配数据。

通过插桩的方法,在寄存器中抓取内核函数的丢包数据,通过保存在eBPF MAP中,在用户态下,可以读取到eBPF MAP中的丢包数据;数据在丢包时才会调用tcp_drop,因此仅采集了丢包数据,而不会采集其它的正常数据或非丢包数据,利于减少计算或数据体量,同时不会对内核网络包路径造成影响;匹配数据利于提高数据的可读性。

步骤102中,抓取内核函数tcp_drop的丢包数据的方法包括:

在函数tcp_drop执行前,从内核数据结构pt_regs中拦截丢包数据。在内核执行丢包处理函数以前,即可以检测到丢包,提高实时性高。

在函数执行前拦截的函数,其内核数据结构pt_regs的入参具有如下对应关系:

其中,SK为函数的第一个参数,可以从第一个入参(di)中读取相关内容,SKB为该函数的第二个参数,可以从第二个入参(si)中读取相关内容。

其中,可以通过Hook函数从函数tcp_drop的内核数据结构pt_regs中抓取丢包数据,并将所述丢包数据保存在eBPF Map中。

其中,可以将所述丢包数据转换为event结构数据后,保存在eBPF Map中。

步骤103中,在用户态下,从所述eBPF Map中所读取的丢包数据包括:Tcp连接的状态(state)和sk_buff。所述sk_buff包括以下任一信息或它们的组合:Tcp四元组、网卡名称和mac地址。

从所述eBPF Map中,仅读取少量的数据结构,具体的,每次读取50个字节以内的数量,因此,拷贝量少,资源消耗小。

其中,从eBPF Map中读取数据时,还包括从eBPF Map的sk_buff中解析数据的方法:

根据sk_buff的head地址和mac_head地址偏移量计算ethhdr地址,在ethhdr数据结构中获取mac地址;

根据sk_buff的head地址和network_header地址偏移量计算iphdr地址,在ipdhdr数据结构中获取IP地址;

根据协议转化数据结构,TCP转化为tcphdr,IPIP的端口为0,UDP为udphdr,再从所转化的数据结构中获取srcport和dstprot端口。

步骤104中,将所读取的丢包数据匹配相应的虚拟机或进程的方法包括:

从系统文件中获取IP、端口列表,以及进程列表,例如从/proc/pid/tcp(udp)文件中读取对应IP+端口的列表,从/proc/pid/comm文件读取进程名称;

将所述tcp四元组与所述IP、端口列表进行匹配,获得关联虚拟机的信息;

将所述tcp四元组与所述进程列表匹配,例如根据进程ID(pid)进行匹配,获得关联进程的信息。

步骤104中,将所读取的丢包数据匹配容器的方法包括:

根据所述TCP四元组中的容器ID或网卡名称,匹配相应的容器。

例如,若网卡为容器网卡eth0,则skb中的四元组为PodIP,根据PodIP匹配到具体容器;若网卡为cni网卡,则根据网卡名称匹配到具体容器。在一个具体实施例中,该检测方式以daemonset(服务守护进程)形式部署在Kubernetes集群中,采用incluster模式的方式鉴权,获取容器信息。一般而言,在Kubernetes中进行RPC调用,会采用service方式,该关联数据级别是service层面的,通过conntrack进行关联,可以匹配到调用了具体哪个Pod。连接跟踪(connection tracking,conntrack,CT)用于跟踪(并记录)连接的状态;用于完成连接信息的采集和录入功能。关联规则如下,将conntrack信息以nat前的TCP四元组为key,nat后的四元组为value存入eBPFMAP,根据抓取到TCP四元组为key进行查询。因此,将不易读懂的TCP四元组信息关联到易读懂的具体应用名称,从而提高匹配信息的易读性。

本发明还可以包括匹配数据输出的步骤,例如将丢包数据或及匹配数据输出为日志。例如,在传统虚机环境下,输出发生丢包的进程名称和四元组、mac地址;在云上环境下,输出发生丢包对应四元组的容器信息和丢包发生的网卡。

本发明还提供一种用于实现上述内核丢包检测方法的系统,如图2所示,包括:插桩模块1、拦截模块2、拷贝模块3和匹配模块4;

插桩模块1用于基于eBPF,在内核函数tcp_drop前进行插桩;

拦截模块2用于通过插桩的函数,从寄存器中抓取内核函数tcp_drop的丢包数据,并将所述丢包数据存入eBPF Map11中;

拷贝模块3用于在用户态中,读取所述eBPF Map11的丢包数据;

匹配模块4用于将所读取的丢包数据匹配相应的虚拟机、进程或容器,获取匹配数据。本发明的系统还包括输出模块5,所述输出模块用于根据所述匹配数据,输出日志。

实施例

根据上述内核丢包检测方法,构建如下场景:demo部署环境为Kubernetes环境,部署在第一节点(node1)的testdemo1持续向部署在第二节点(node2)的testdemo2发出http请求,即数据请求。

在Kubernetes的第一节点中部署上述系统,用于执行内核丢包检测方法。具体的,如图3所示,插桩模块1调用bpf()函数在内核中注入Kprobe探针;其中,部署在eBPF虚拟机的拦截模块2通过Kprobe探针的Hook函数拦截tcp_drop函数的丢包数据,解析出丢包数据结构sk_buff和sock中的关键内容,并将关键内容转换为event结构数据后,保存在环形缓冲区(ring buffer)中;拷贝模块3从环形缓冲区中读取event结构数据(即丢包数据);匹配模块4根据所读取的event结构数据与线程数据或容器数据进行关联和匹配。其中,线程数据可以从相关目录中的列表数据中获取;容器数据可以从Kubernetes系统中获取。

使用linux提供的tc工具在第一节点中开启随机丢包,将丢包率设计为1%。

上述系统输出的日志如下:

drop time

Aug 23 10:42:35CST 2021

drop info:

->src_containerid:STRING(59fa75f0e8f5)

->src_container:STRING(testdemo1)

->src_node:STRING(kubernetes node2)

->src_namespace:STRING(hcmine)

->src_workload_kind:STRING(deployment)

->src_workload_name:STRING(testdemo1)

->src_pod:STRING(testdemo1-78b7759f78-nxwr8)

->src_pod_ip:STRING(192.168.40.208)

->src_service:STRING(testdemo1)

->src_service_ip:STRING(10.103.33.148)

->src_mac:STRING(00:50:56:92:7a:4d)

->dst_namespace:STRING(hcmine)

->dst_service:STRING(testdemo2)

->dst_service_ip:STRING(10.111.214.178)

->dst_service_port:INT(9001)

->dst_containerid:STRING()

->dst_container:STRING(testdemo2)

->dst_node:STRING(kubernetes node1)

->dst_namespace:STRING(hcmine)

->dst_workload_kind:STRING(deployment)

->dst_workload_name:STRING(testdemo2)

->dst_pod:STRING(testdemo2-7d75b8886-x6fwv)

->dst_pod_ip:STRING(192.168.106.187)

->dst_service:STRING(testdemo2)

->dst_service_ip:STRING(10.111.214.178)

->dst_mac:STRING(00:50:56:92:ca:7e)

->drop_dev:STRING(ens192)

->is_server:BOOL(false)

因此,本发明的系统可以很好的匹配到容器(Pod)丢包的信息、节点信息、以及服务等信息等。

本发明还提供一种装置,包括存储器和处理器,所述存储器用于保存程序,所述程序包括用于实现上述内核丢包检测方法的指令;所述处理器用于执行所述程序。

以上仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

11页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:一种高效测试同轴语音网关的测试系统及方法

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!