本发明专利技术公开了一种数据发送方法和计算机,该方法包括:对于每个CPU,该CPU将需要发送的数据存储在该CPU对应的存储区中;多个CPU将相应存储区中存储的数据发送给网卡,由网卡进行数据发送。本发明专利技术通过使每个CPU核访问各自的存储区并写入数据,从而充分利用了多核CPU的处理能力,实现了数据包的并行发送,能够有效提高数据包发送的速率,改善发包效率,能够应对万兆网卡等高速发包的场景。
【技术实现步骤摘要】
本专利技术涉及计算领域,并且特别地,涉及一种数据发送方法和计算机。技术背景目前,千兆网卡的零拷贝技术主要基于传统intel千兆网卡来实现。通常,在网络数据包的传输过程中,应用程序需要以拷贝的方式与内核中的网卡报文缓冲区进行交互,这种拷贝处理必然会降低性能和速率,无法在大流量场景中使用。并且,目前的千兆零拷贝都是基于单队列的技术来实现的,但是,在万兆接入的情况下,单位时间内的数据包速率将提高大约10倍,而千兆网卡下单一的传输队列以及缓冲区交互将存在很高的性能损失,所以,传统的技术将无法应对如此高的数据速率,进而成为万兆零拷贝技术发展的瓶颈。针对相关技术中无法在大流量要求下高效地实现数据发送的问题,目前尚未提出有效的解决方案。
技术实现思路
针对相关技术中无法在大流量要求下高效地实现数据发送的问题,本专利技术提出一种数据发送方法和计算机,能够有效提高数据包发送的速率,改善发包效率,能够应对万兆网卡等高速发包的场景。本专利技术的技术方案是这样实现的根据本专利技术的一个方面,提供了一种数据发送方法,用于在多CPU环境下实现数据发送。该方法包括对于每个CPU,该CPU将需要发送的数据存储在该CPU对应的存储区中;多个CPU将相应存储区中存储的数据发送给网卡,由网卡进行数据发送。该方法可进一步包括将每个CPU对应的存储区中的数据映射到该数据所对应的应用中。此外,每个CPU将其对应的存储区映射为队列,该CPU通过对相应的队列进行轮询来确定是否有需要发送的数据,并在确定有数据需要发送的情况下,将该数据发送至网卡。并且,每个CPU对应的队列采用循环结构的数据结构。此外,多个CPU将相应存储区中存储的数据发送给网卡包括多个CPU将相应存储区中存储的数据发送至网卡的硬件队列。此外,对于每个CPU,该CPU对应的存储区为内存中为该CPU分配的存储区,并且多个CPU的存储区彼此间在逻辑上独立。根据本专利技术的另一方面,提供了一种计算机,用于在多CPU环境下实现数据发送。根据本专利技术的计算机包括多个CPU,其中,对于每个CPU,用于将需要发送的数据存储在该CPU对应的存储区中;多个CPU将相应存储区中存储的数据发送给网卡;网卡,用于发送来自多个CPU的数据。该计算机可进一步包括映射模块,用于将每个CPU对应的存储区中的数据映射到该数据所对应的应用中。此外,多个CPU用于将相应存储区中存储的数据发送至网卡的硬件队列。此外,对于每个CPU,该CPU对应的存储区为内存中为该CPU分配的存储区,并且多个CPU的存储区彼此间在逻辑上独立。本专利技术通过使每个CPU核访问各自的存储区并写入数据,从而充分利用了多核 CPU的处理能力,实现了数据包的并行发送,能够有效提高数据包发送的速率,改善发包效率,能够应对万兆网卡等高速发包的场景。附图说明图1是根据本专利技术实施例的数据发送方法的流程图2是根据本专利技术实施例的数据发送方法的原理示意图。具体实施方式根据本专利技术的实施例,提供了一种数据发送方法,用于在多CPU环境下实现数据发送。如图1所示,根据本专利技术实施例的数据发送方法包括步骤S101,对于每个CPU,该CPU将需要发送的数据存储在该CPU对应的存储区中;步骤S103,多个CPU将相应存储区中存储的数据发送给网卡,由网卡进行数据发送。该方法可以进一步包括将每个CPU对应的存储区中的数据映射到该数据所对应的应用中,从而当存储区中的数据发生变化(例如,被修改)的情况下,能够直接在应用层得到体现,使操作员能够清楚、直观地看到这些数据变化。此外,每个CPU将其对应的存储区映射为队列,该CPU通过对相应的队列进行轮询来确定是否有需要发送的数据,并在确定有数据需要发送的情况下,将该数据发送至网卡。其中,每个CPU对应的队列采用循环结构的数据结构,而算法为无锁(lock-free) 算法,从而避免了加锁对性能的影响。此外,多个CPU可以将相应存储区中存储的数据发送至网卡的硬件队列,从而将数据发送给网卡。此外,可选地,对于每个CPU对应的存储区可以是内存中为该CPU分配的存储区, 并且多个CPU的存储区彼此间在逻辑上独立。例如,对于万兆网卡的应用场景,本专利技术能够针对万兆网卡多发送队列的特点,为每个CPU核分配一个网卡硬件描述符队列,并且分配相应的软件描述符队列,配置万兆网卡自动将报文发送到相应队列上去。对于每个队列,都为其分配了独立的数据缓冲区,这样,每个CPU核在处理时只需要访问自己对应的队列。这些内存分配都是按照CPU核的位置来分配的,通过上述配置,使本专利技术的方案能够充分利用CPU的处理性能,例如,可以充分利用X86多核的numa架构,保证每个CPU核都只需要访问本地的内存,从而提升内存访问效率。并且,通过内存映射的方式将数据缓冲区队列映射到应用程序中去,从而驱动对缓冲区的修改可以直接反映到应用程序中来,从而避免了不必要的内存拷贝,进一步提高了数据发送的效率。此外,在每个cpu核上都会跑一个发送任务,定期轮询自己的发送队列,将队列上报文添加到网卡的硬件发送队列上去,即,将数据发送至网卡。通过本专利技术的上述方案,针对最新的万兆网卡等大流量场景实现了零拷贝发包技术;另外,本专利技术可以适用于多核场景,例如,可以基于intel网卡的硬件多队列技术实现, 与过去千兆网卡单队列相比,在多核环境下,可以更好的使每个CPU核处理一个队列上的数据,从而充分利用了当前多核的架构,提高了流量发送性能,使得发包效率显著提高。根据本专利技术的实施例,还提供了一种计算机,用于在多CPU环境下实现数据发送。根据本专利技术的计算机包括多个CPU,其中,对于每个CPU,用于将需要发送的数据存储在该CPU对应的存储区中;多个CPU将相应存储区中存储的数据发送给网卡;网卡,用于发送来自多个CPU的数据。该计算机可以进一步包括映射模块,用于将每个CPU对应的存储区中的数据映射到该数据所对应的应用中。此外,多个CPU用于将相应存储区中存储的数据发送至网卡的硬件队列。可选地,对于每个CPU,该CPU对应的存储区为内存中为该CPU分配的存储区,并且多个CPU的存储区彼此间在逻辑上独立。 如图2所示,计算机中的多个CPU包括CPUO、CPUl、CPU2和CPU3 (CPU的数量可以更多或更少,本文不再一一列举不同数量CPU的场景),这四个CPU具有各自的内存(例如, 图中所示的共享内存),用于存储需要发送的数据。通过共享内存,能够将数据发送至网卡 (例如,Intel万兆网卡)。综上所述,借助于本专利技术的上述技术方案,通过使每个CPU核访问各自的存储区并写入数据,从而充分利用了多核CPU的处理能力,实现了数据包的并行发送,能够有效提高数据包发送的速率,改善发包效率,能够应对万兆网卡等高速发包的场景。以上所述仅为本专利技术的较佳实施例而已,并不用以限制本专利技术,凡在本专利技术的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本专利技术的保护范围之内。权利要求1.一种数据发送方法,用于在多CPU环境下实现数据发送,其特征在于,所述方法包括对于每个CPU,该CPU将需要发送的数据存储在该CPU对应的存储区中; 所述多个CPU将相应存储区中存储的数据发送给网卡,由所述网卡进行数据发送。2.根据权利要求1所述的数据发送方法,其特征在于,进一步包括本文档来自技高网...
【技术保护点】
【技术特征摘要】
【专利技术属性】
技术研发人员:万伟,刘兴彬,王泼,刘铁,陈科,朱春屹,王清,李云华,李博文,董建珊,杨锦涛,孙一鸣,范玉峰,曹振南,邵宗有,
申请(专利权)人:曙光信息产业股份有限公司,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。