A-A+

Netmap分析(一)

2018年12月11日 netmap 暂无评论

工作原理

Netmap是基于零拷贝思想的高速网络I/O架构,它能够在千兆或万兆网卡上达到网卡的线速收发包速率。并且能够有效地节省cpu等计算机资源。

零拷贝(zero-copy)是指主机、路由器等设备与网卡交互时,CPU不需要将数据从和个内存区域拷贝到另一个内存区域。零拷贝通过减少数据拷贝或共享总线操作次数,消除通信数据的不必要的拷贝过程,能够有效地提高通信效率、节省存储空间和处理时间。因此,零拷贝技术在高速网络数据处理领域有着广泛的应用。

网卡通过循环队列(即NIC环)来管理数据包的传输,每个网卡至少维护一对NIC环,分别用以管理发送和接收两个方向的数据包。每一个环被划分为很多槽,每一个槽都包含存储数据包的缓冲区的信息:缓冲区长度、缓冲区的物理地址等。在通常情况下,主机网络堆栈可以访问NIC环上指定的槽,也就可以访问到存放数据包的缓冲区,实现数据包的发送和接收。

网卡所管理的内存空间是内核空间,运行在用户态的应用程序正常情况下无权访问内核空间,因此,需要进行从内核空间到用户空间的拷贝,零拷贝就是减少或消除这种拷贝,如直接缓存访问(direct buffer access)。DBA为了节省内核态和用户态之间的拷贝,可以将应用程序直接跑在内核态,如内核态的Click。也可以选择将内核中的数据包缓存区直接暴露给用户态程序,如PF_RING和Linux的PACKET_MMAP。

 

 

netmap也是一个基于零拷贝思想的高速网络I/O架构,netmap的架构如上图所示。当网卡运行在netmap模式下,NIC环会与主机协议栈进行断开,netmap会拷贝一份NIC环,被称作netmap环。同时,netmap还会维护一对环,用于与主机协议栈进行交互。这些环所指向的用于存储数据包内容的缓存位于共享空间,网卡直接将数据包存入这些缓存。应用程序可以通过调用netmap API访问netmap环中的数据包内容,也就可以访问用于存储数据包的缓存,也就是说,当应用程序需要访问数据包内容时,无需从内核空间到用户空间的拷贝,可以直接访问,从而实现了网络数据包的零拷贝。此外,netmap并不会将网卡寄存器和内核的关键内存区域暴露给应用程序,因而用户态的应用程序并不会导致操作系统崩溃,所以相对一些其他的零拷贝架构,netmap更为安全。

netmap还会通过以下几种手段来增加网络I/O的速度:1)预分配固定大小的数据包存储空间,以消除每个数据包存储时动态分配内存所导致的系统开销;2)让用户态程序直接访问到网络数据包缓冲区,以减少数据拷贝的开销;3)使用一个轻量级的元数据表示,以屏蔽硬件相关的一些特性。该元数据表示支持在一次系统调用中处理大量数据包,从而可以减少系统调用的开销。以发包速度为例,netmap可以在900MHz单核CPU上处理10G以太网的线速(14.88Mpps)。

标签:

给我留言

Copyright © 九毛的官方博客 保留所有权利.   Theme  Ality

用户登录