首页 > 科技 >

常见网络加速技术浅谈(一)(3)

2018-09-16 01:28:23 网络整理 阅读:130 评论:0

NAPI全称是New API,这是Linux系统针对网络接收的优化。硬件I/O与CPU的交互一般有中断和轮询两种方式。中断的CPU代价较大,但是实时性好,且不需要CPU一直值守,而轮询需要CPU定期查询I/O,需要CPU一直值守,并且不是真正的实时。对于网卡来说,一个繁忙的网络,每次网络数据包到达,如果都采用中断,这样频繁的中断会影响系统的整体效率。而对于一个流量小的网络,如果采用轮询,一个是实时性差,会导致延时(Latency)上升,另一方面CPU需要一直值守,CPU效率低。

NAPI根据不同的场景,采用不同的方式作为CPU和网卡的交互方法,在大网络流量的时候,采用轮询的方式,读取网卡数据,小网络流量的时候则采用中断的方式,从而提高CPU的效率。Checksum offload

很多网络协议,例如IP、TCP、UDP都有自己的校验和(checksum)。传统上,校验和的计算(发送数据包)和验证(接收数据包)是通过CPU完成的。这对CPU的影响很大,因为校验和需要每个字节的数据都参与计算。对于一个100G带宽的网络,需要CPU最多每秒计算大约12G的数据。

为了减轻这部分的影响,现在的网卡,都支持校验和的计算和验证。系统内核在封装网络数据包的时候,可以跳过校验和。网卡收到网络数据包之后,根据网络协议的规则,进行计算,再将校验和填入相应的位置。

因为Checksum offload的存在,在用tcpdump之类的抓包分析工具时,有时会发现抓到的包提示校验和错误(checksum incorrect)。tcpdump抓到的网络包就是系统内核发给网卡的网络包,如果校验和放到网卡去计算,那么tcpdump抓到包的时刻,校验和还没有被计算出来,自然看到的是错误的值。 Scatter/Gather

这项加速只能用于网络数据的发送。Scatter/Gather本身也是操作系统里面一个通用的技术,也叫做vector addressing。简单来说,就是数据在传输的过程中,数据的读取方,不需要从一段连续的内存读取数据,而是可以从多个离散的内存地址读取数据。例如,系统内核在收到应用程序传来的原始数据时,可以保持这段数据不动。之后在另一块内存中计算出各层协议的Header。最后通知网卡驱动,从这两块内存中将数据拷贝过去。SG可以减少不必要的内存拷贝操作。

相关文章