本申请涉及网络通信技术领域,特别涉及一种网卡测试方法、装置及机器可读存储介质。
背景技术:
网卡又称为网络接口板、或通信适配器、或网络适配器(networkadapter)、或网络接口卡(nic)。
在服务器中,网卡承担着业务输入输出窗口的角色。目前,服务器厂商通常会将采购的网卡作为部件组装到服务器中,并对网卡进行测试,以确保网卡的可用性和稳定性。
一种常用的网卡测试方法是配备一台环境交换机,服务器上的待测试网卡与交换机上的网口连接。服务器os(operatingsystem,操作系统)在启动后ping(packetinternetgroper,因特网包探索器)交换机网口所在的网关,即,通过被测网卡向交换机网口所在网关发送探测报文,根据ping的结果来确定网卡是否正常工作。但是,该方法需要配备环境交换机,测试成本较高。
技术实现要素:
有鉴于此,本申请提供一种网卡测试方法、装置及机器可读存储介质。
具体地,本申请是通过如下技术方案实现的:
一方面,提供了一种网卡测试方法,该方法应用于服务器,服务器中设置有网卡,网卡上的第一网口与第二网口直连,该方法包括:
启用内核线程根据获取到的测试参数构建测试数据包,其中,测试参数中指定测试数据包的发送网口为第一网口;
将内核线程构建的测试数据包,通过内核态中与第一网口对应的网络接口层通用接口发送给网卡,以使网卡从第一网口发送测试数据包,并从第二网口接收环回的测试数据包;
在所有测试数据包均发送完成后,从网卡中获取网卡统计数据,根据网卡统计数据确定网卡的状态,其中,网卡统计数据是网卡统计出的环回的测试数据包的统计数据。
另一方面,还提供了一种网卡测试装置,该装置应用于服务器,服务器中设置有网卡,网卡上的第一网口与第二网口直连,该装置包括:
构建单元,用于启用内核线程根据获取到的测试参数构建测试数据包,其中,测试参数中指定测试数据包的发送网口为第一网口;
发送单元,用于将内核线程构建的测试数据包,通过内核态中与第一网口对应的网络接口层通用接口发送给网卡,以使网卡从第一网口发送测试数据包,并从第二网口接收环回的测试数据包;
获取单元,用于在所有测试数据包均发送完成后,从网卡中获取网卡统计数据,其中,网卡统计数据是网卡统计出的环回的测试数据包的统计数据;
状态确定单元,用于根据获取单元获取到的网卡统计数据确定网卡的状态。
又一方面,还提供了一种网卡测试装置,包括处理器和机器可读存储介质,机器可读存储介质存储有能够被处理器执行的机器可执行指令,处理器被机器可执行指令促使:实现上述网卡测试方法。
又一方面,还提供了一种机器可读存储介质,其特征在于,存储有机器可执行指令,在被处理器调用和执行时,机器可执行指令促使处理器:实现上述网卡测试方法。
通过本申请的以上技术方案,将待测网卡上的第一网口与第二网口直连,在发送测试数据包时,利用内核态中与第一网口对应的网络接口层通用接口将测试数据包发送给网卡,网卡会从第一网口上发出该测试数据包,并从第二网口上接收环回的测试数据包,在所有测试数据包均发送完成后,直接从网卡中获取网卡对接收到的环回测试数据包进行统计得到的网卡统计数据,根据该网卡统计数据即可确定网卡的状态,即网卡是否正常工作。使用上述方法对网卡进行测试,无需配备额外的设备,降低了测试成本,并且,由于利用了现有的网卡对接收数据包进行统计的数据来确定待测网卡的状态,测试方法更加简便和易用,而且很容易进行错误定位。
附图说明
图1是本申请实施例示出的待测网卡上的网口采用自环方式连接的示意图;
图2是本申请实施例示出的待测网卡上的网口采用对接方式连接的示意图;
图3是本申请实施例示出的网卡测试方法的流程图;
图4是本申请实施例示出的linux中的网络架构模型图;
图5是本申请实施例示出的测试数据包发送流程图;
图6是本申请实施例示出的网卡测试装置的硬件结构示意图;
图7是本申请实施例示出的网卡测试装置的功能划分结构示意图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。
在本申请使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本申请。在本申请和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本申请可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
现有技术的网卡测试方法需要配备环境交换机,测试成本较高。为了解决现有技术中存在的上述问题,本申请实施例中提供了一种网卡测试方法,该方法无需额外配备任何设备,从而降低了测试成本,应用范围较大,并且对任意网卡均使用。
在本申请实施例的方法中,待测网卡安装在运行了操作系统的服务器中,该网卡上的第一网口与第二网口直连,其中,第一网口与第二网口可以是同一网口,也可以是不同网口。
如图1所示,当第一网口和第二网口是同一网口时,该网口的tx(发送)线与rx(接收)线直连,此种连接方式可以称为自环。此时,网口上需要安装自环头,来实现同一网口的tx线和rx线直连,数据包从该网口的tx线发出后,从该网口的rx线环回。
如图2所示,当第一网口和第二网口不是同一网口时,第一网口的tx线与第二网口的rx线直连,第一网口的rx线与第二网口的tx线直连,此种连接方式可以称为对接。此时,数据包从第一网口的tx线发出后,从第二网口的rx线环回;数据包从第二网口的tx线发出后,从第一网口的rx线环回。
可见,无论是采用自环的连接方式,还是采用对接的连接方式,服务器从待测网卡发出的数据包还会从该网卡环回到服务器中。
基于此,如图3所示,本申请实施例的网卡测试方法包括以下步骤:
步骤s301,启用内核线程根据获取到的测试参数构建测试数据包,其中,测试参数中指定测试数据包的发送网口为第一网口;
其中,可以向用户态获取上述测试参数,或者,也可以采用手动静态配置的方式获取上述测试参数。
步骤s302,将内核线程构建的测试数据包,通过内核态中与第一网口对应的网络接口层通用接口发送给网卡,以使网卡从第一网口发送测试数据包,并从第二网口接收环回的测试数据包;
其中,测试参数中指定了测试数据包的发送网口为第一网口,在执行步骤s302时,由于物理网口与内核态中的网络接口层通用接口存在一一对应关系,因此,可以确定出与测试参数中指定的第一网口对应的网络接口层通用接口,从而,将测试数据包通过确定出的网络接口层通用接口发送给网卡,由网卡从与该确定出的网络接口层通用接口对应的第一网口发出该测试数据包。
步骤s303,在所有测试数据包均发送完成后,从网卡中获取网卡统计数据,根据网卡统计数据确定网卡的状态,其中,网卡统计数据是网卡统计出的环回的测试数据包的统计数据。
另外,在所有测试数据包均发送完成后,还可以从网卡的错误寄存器或cpu的错误寄存器中,获取网卡与cpu之间的传输总线的错误统计数据,根据传输总线的错误统计数据确定网卡的状态,其中,传输总线的错误统计数据是环回的测试数据包通过传输总线传送给cpu时的错误数据。
在实际实施过程中,网卡与cpu之间的传输总线具体可以是pcie(peripheralcomponentinterconnectexpress,快速外设部件互连标准)总线。服务器上运行的操作系统具体可以是linux、unix、windows等操作系统。
本申请上述实施例中,将待测网卡上的第一网口与第二网口直连,在发送测试数据包时,利用内核态中与第一网口对应的网络接口层通用接口将测试数据包发送给网卡,网卡会从第一网口上发出该测试数据包,并从第二网口上接收环回的测试数据包,在所有测试数据包均发送完成后,直接从网卡中获取网卡对接收到的环回测试数据包进行统计得到的网卡统计数据,和/或直接从网卡的错误寄存器或cpu的错误寄存器中获取网卡与cpu之间的传输总线的错误统计数据,根据这些统计数据即可确定网卡的状态,即网卡是否正常工作。使用上述方法对网卡进行测试,无需配备额外的设备,降低了测试成本,并且,由于利用了现有的网卡对接收数据包进行统计的数据、以及现有的传输总线的错误统计数据,来确定待测网卡的状态,测试方法更加简便和易用,而且很容易进行错误定位。
下面以服务器中运行linux操作系统为例,详细说明上述实施例的网卡测试方法。如图4所示,linux中网络架构模型为四层模型,包括:网络接口层、网际互联层、传输层、以及应用层,其中,网络接口层进一步包括标准七层模型中的物理层和数据链路层。
1、测试数据包的发送
在linux操作系统中,考虑到存在数据包环回的情况,即,服务器发出的数据包环回到服务器,并且,为了减少环回过程中数据包在外部网络中的传输消耗(例如,传输时间消耗等),在网际互联层实现了一个虚拟的网络设备:loopback(环回)设备,loopback设备可以模拟数据包的环回过程,即,数据包不会真正的从网卡发出,而是由loopback设备模拟数据包的封装发送和接收解封装过程。可见,通过网际互联层以上层级的接口发送的需要环回的数据包,都不会从网卡上发出。
但是,本申请实施例中对网卡进行测试时发送的测试数据包需要从网卡上发出,还需要进行环回,因此,本申请实施例中选择从网络接口层通用接口发送测试数据包。具体的,网络接口层通用接口可以是内核态(也称为内核)中的网络接口层结构体net_device中的ndo_start_xmit接口。其中,网络接口层结构体net_device与网口一一对应,从而,ndo_start_xmit接口与网口也就存在一一对应关系。
网络接口层结构体net_device中存储有与该结构体对应的网口的相关参数,并向驱动层(属于网络接口层中的数据链路层)提供定义好的通用接口,该通用接口即为ndo_start_xmit接口。
一种实施例中,测试人员采用手动静态配置的方式,将测试参数配置到内核态中,从而完成网卡测试。
另一种实施例中,可以由用户态将测试参数传送给内核态,从而完成网卡测试。此时,由于ndo_start_xmit接口在内核态中,因此,需要实现用户态到内核态的切换,以便接收用户态传送的测试参数,然后根据该测试参数构建测试数据包,最终将构建的测试数据包通过ndo_start_xmit接口发送到网卡。本申请实施例中,需要实现以下功能:
(1)定制网卡测试所需的测试参数
预先定制可接收识别的测试参数,其中,测试参数中包括:需要发送的测试数据包的包类型、发包时间间隔、发包数量n、以及需要启用的一个以上内核线程的标识,测试数据包的发送网口的标识等。其中,n为大于1的正整数。
上述包类型具体可以是udp(userdatagramprotocol,用户数据报协议)、tcp(transmissioncontrolprotocol,传输控制协议)、http(hypertexttransferprotocol,超文本传输协议)等。
(2)建立测试参数的传送通道
由于测试参数的实际赋值是由测试人员来配置的,测试人员在服务器中输入测试参数的赋值后,此时测试参数位于用户态中,则需要通过传送通道向用户态获取测试参数,以便后续根据该测试参数对网卡进行测试。具体的,可以采用以下两种方式中的任一种建立上述传送通道:
方式一:通过向内核态注册虚拟设备的方式,在用户态中生成与该虚拟设备对应的设备节点,该设备节点即为上述传送通道。
此时,可以使用ioctl(输入输出控制)方法通过该设备节点向用户态获取测试参数。
方式二:在用户态中设置proc虚拟文件,该proc虚拟文件即为上述传送通道。
此时,可以从proc虚拟文件中读取用户态写入的测试参数。
(3)创建内核线程
建立内核线程池,内核线程池中的内核线程数等于服务器中的cpu线程数,内核线程与cpu线程一一绑定。
其中,内核线程的功能主要包括:根据获取到的测试参数构建测试数据包,以便由与该内核线程绑定的cpu线程调用ndo_start_xmit接口将该测试数据包发送出去。
假设,待测网卡上的网口连接方式采用自环方式,由此,本申请实施例中发送测试数据包的流程如图5所示,包括以下步骤:
步骤s501,向用户态获取测试参数,其中,测试参数中包括:需要发送的测试数据包的包类型为udp、发包时间间隔为1毫秒、发包数量n为10000、需要启用的2个内核线程的标识为process1_1和process1_2、以及测试数据包的发送网口的标识为porta。
步骤s502,启用内核线程process1_1和process1_2中的每个内核线程,根据测试数据包的包类型udp和发包数量n=10000,来构建10000个udp数据包。
另外,在启用内核线程之前,还需要将需要启用的内核线程与测试数据包的发送网口porta进行绑定,从而,与该内核线程绑定的cpu线程可以调用网口porta对应的ndo_start_xmit接口发送测试数据包。
步骤s503,与内核线程process1_1绑定的cpu线程将内核线程process1_1构建的udp数据包,按照1毫秒的发包时间间隔,通过网口porta对应的ndo_start_xmit接口发送给待测网卡,以使待测网卡从网口porta发送udp数据包,并从网口porta接收环回的udp数据包;并且,与内核线程process1_2绑定的cpu线程也会执行该步骤。
在所有udp数据包均发送完成后,会关闭内核线程process1_1和内核线程process1_2。
本申请实施例中,测试数据包是由内核线程构建的,而且,测试数据包从ndo_start_xmit接口上通过驱动层发给网卡,测试数据包并不经过协议栈,因此,可以发送任意类型的测试数据包。
2、测试数据包的接收、以及网卡测试结果分析
在实际实施过程中,网卡接收到数据包后,会对接收到的数据包进行统计,例如,存在数据丢失(drop)的数据包(即该数据包不完整)的数量、crc(cyclicredundancycheck,循环冗余校验)校验不通过的数据包的数量、接收到的单播数据包的数量、接收到的非单播数据包的数量等。通过分析上述统计数据即可获知网卡(包括数据包的发送网口和接收网口)和传输链路(即发送网口与接收网口之间的物理连线)组成的部分是否存在缺陷。
后续,网卡会将接收到的数据包,通过网卡与cpu之间的传输总线(例如,pcie总线)传送给cpu,从而最终保存到内存中,在通过该传输总线进行传送的过程中,网卡和cpu会对该传输总线上传送的数据包进行错误统计,从而将错误统计数据保存到各自的寄存器中。例如,pcie标准中规定了两种错误类别:致命错误和非致命错误,其中,非致命错误中又进一步包括:可恢复错误和不可恢复错误。通过分析上述的错误统计数据即可获知网卡和该传输总线组合的部分是否存在缺陷。在实际实施过程中,由于网卡和cpu均会对该传输总线上传送的数据包进行错误统计,两者统计得到的错误统计数据一致,因此,从网卡对应的寄存器或cpu对应的寄存器中获取上述错误统计数据均可。
基于此,本申请实施例的测试数据包接收统计和网卡状态分析流程如下:
在所有测试数据包均发送完成后,从网卡中获取网卡统计数据,其中,网卡统计数据中包括:存在数据丢失的测试数据包数量、校验不通过的测试数据包数量、接收到的环回测试数据包数量。由于在实际实施过程中,发送的测试数据包通常为单播数据包,因此,接收到的环回测试数据包数量就是单播数据包的数量。若存在数据丢失的测试数据包数量不为0,说明有的测试数据包不完整,若校验不通过的测试数据包数量不为0,说明有的测试数据包出现了差错,若接收到的环回测试数据包数量与发送的测试数据包数量不一致,说明发出的部分测试数据包没有被接收,如果出现了上述现象,则判断出待测网卡、以及网口之间的物理连线组成的部分存在故障问题。即,可以定位出待测网卡和/或传输链路存在缺陷。
另外,在所有测试数据包均发送完成后,还可以从网卡的错误寄存器或cpu的错误寄存器中获取pcie总线的错误统计数据,若根据获取到的传输总线的错误统计数据,确定出传输总线上传送的测试数据包存在错误,则判断出待测网卡和pcie总线组成的部分存在故障问题。即,可以定位出待测网卡和/或pcie总线存在缺陷。
通过上述方法,可以直接获取现有的网卡对接收数据包进行统计的数据、以及现有的pcie总线的错误统计数据,利用这些统计数据确定待测网卡的状态,即确定待测网卡是否正常工作,测试方法更加简便和易用,而且很容易进行错误定位。
与前述网卡测试方法的实施例相对应,本申请还提供了网卡测试装置的实施例,该网卡测试装置可以应用在服务器上。图6为本申请实施例提供的网卡测试装置的硬件结构示意图。该网卡测试装置可包括处理器601、存储有机器可执行指令的机器可读存储介质602。处理器601与机器可读存储介质602可经由系统总线603通信。并且,通过读取并执行机器可读存储介质602中的机器可执行指令,处理器601可执行上文描述的网卡测试方法。
本文中提到的机器可读存储介质602可以是任何电子、磁性、光学或其它物理存储装置,可以包含或存储信息,如可执行指令、数据,等等。例如,机器可读存储介质可以是:ram(radomaccessmemory,随机存取存储器)、易失存储器、非易失性存储器、闪存、存储驱动器(如硬盘驱动器)、固态硬盘、任何类型的存储盘(如光盘、dvd等),或者类似的存储介质,或者它们的组合。
本申请实施例还提供了一种包括机器可执行指令的机器可读存储介质,例如图6中的机器可读存储介质602,所述机器可执行指令可由网卡测试装置中的处理器601执行以实现以上描述的网卡测试方法。如图7所示,从功能上划分,本申请实施例的网卡测试装置中包括:构建单元701、发送单元702、获取单元703和状态确定单元704,其中:
构建单元701,用于启用内核线程根据获取到的测试参数构建测试数据包,其中,测试参数中指定测试数据包的发送网口为网卡上的第一网口,第一网口与该网卡上的第二网口直连;
发送单元702,用于将内核线程构建的测试数据包,通过内核态中与第一网口对应的网络接口层通用接口发送给网卡,以使网卡从第一网口发送测试数据包,并从第二网口接收环回的测试数据包;
获取单元703,用于在所有测试数据包均发送完成后,从网卡中获取网卡统计数据,其中,网卡统计数据是网卡统计出的环回的测试数据包的统计数据;
状态确定单元704,用于根据获取单元703获取到的网卡统计数据确定网卡的状态。
其中,获取单元703,还用于在所有测试数据包均发送完成后,从网卡的错误寄存器或cpu的错误寄存器中,获取网卡与cpu之间的传输总线的错误统计数据,其中,传输总线的错误统计数据是环回的测试数据包通过传输总线传送给cpu时的错误数据;
状态确定单元704,还用于根据获取单元703获取到的传输总线的错误统计数据确定网卡的状态。
其中,测试参数中包括:需要发送的测试数据包的包类型、发包时间间隔、发包数量n、以及需要启用的一个以上内核线程的标识,n为大于1的正整数;
则,构建单元701具体用于通过以下方式启用内核线程根据获取到的测试参数构建测试数据包:启用一个以上内核线程中的每个内核线程来构建n个符合包类型的测试数据包;
发送单元702具体用于通过以下方式发送内核线程构建的测试数据包:针对每个被启用的内核线程,按照发包时间间隔发送该内核线程构建的测试数据包。
其中,网卡统计数据包括:存在数据丢失的测试数据包数量、校验不通过的测试数据包数量、接收到的环回测试数据包数量,则,
状态确定单元704具体用于通过以下方式根据网卡统计数据确定网卡的状态:若存在数据丢失的测试数据包数量不为0,或者,校验不通过的测试数据包数量不为0,或者,接收到的环回测试数据包数量与发送的测试数据包数量不一致,则确定网卡、以及第一网口与第二网口之间的物理连线组成的部分存在故障问题;
状态确定单元704具体用于通过以下方式根据传输总线的错误统计数据确定网卡的状态:若根据传输总线的错误统计数据,确定出传输总线上传送的测试数据包存在错误,则确定网卡和传输总线组成的部分存在故障问题。
其中,当第一网口和第二网口是同一网口时,该网口的发送tx线与接收rx线直连;当第一网口和第二网口不是同一网口时,第一网口的tx线与第二网口的rx线直连,第一网口的rx线与第二网口的tx线直连。
上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本申请方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上所述仅为本申请的较佳实施例而已,并不用以限制本申请,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。