本文转载至:http://www.geekbus.cn/netmap-high-performance-network-io-framework/
1. Netmap简介
Netmap是一个高性能收发原始数据包的框架,由Luigi Rizzo等人开发完成,其包含了内核模块以及用户态库函数。其目标是,不修改现有操作系统软件以及不需要特殊硬件支持,实现用户态和网卡之间数据包的高性能传递。其原理图如下,数据包不经过操作系统内核进行处理,用户空间程序收发数据包时,直接与网卡进行通信。
2. 数据结构
在Netmap框架下,内核拥有数据包池,发送环\接收环上的数据包不需要动态申请,有数据到达网卡时,当有数据到达后,直接从数据包池中取出一个数据包,然后将数据放入此数据包中,再将数据包的描述符放入接收环中。内核中的数据包池,通过mmap技术映射到用户空间。用户态程序最终通过netmap_if获取接收发送环netmap_ring,进行数据包的获取发送。
4. 特点总结
(1)性能高:数据包不走传统协议栈,不需要层层解析,用户态直接与网卡的接受环和发送环交互。性能高的具体原因有一下三个:
- (a) 系统调用以及处理数据包的时间花费少
- (b) 不需要进行数据包的内存分配:采用数据包池,当有数据到达后,直接从数据包池中取出一个数据包,然后将数据放入此数据包中,再将数据包的描述符放入接收环中。
- (c) 数据拷贝次数少:内核中的数据包采用mmap技术映射到用户态。所以数据包在到达用户态时,不需要进行数据包的拷贝。
(2) 稳定性高:有关网卡寄存器数据的维护都是在内核模块进行,用户不会直接操作寄存器。所以在用户态操作时,不会导致操作系统崩溃
(3) 亲和性:可采用了CPU亲和性,实现CPU和网卡绑定,提高性能。
(4) 易用性好:API操作简单,用户态只需要调用ioctl函数即可完成数据包收发工作
(5) 与硬件解耦:不依赖硬件,只需要对网卡驱动程序稍微做点修改就可以使用此框架(几十行行),传统网卡驱动将数据包传递给操作系统内核中协议栈,而修改后的数据包直接放入Netmap_ring供用户使用。
4.性能对比
测试环境:10G网络下,不同发包程序对比,横坐标表示时钟频率,纵坐标表示发送数据包的速率
绿色线:Netmap在单核下的性能
红色线:Netmap在四核下的性能
蓝色线:pktgen发包程序
粉色线:netsend发包程序
5. 用户态操作实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
struct
netmap_if *
nifp
;
struct
nmreq
req
;
int
i
,
len
;
char
*
buf
;
fd
=
open
(
“/dev/netmap”
,
0
)
;
strcpy
(
req
.
nr_name
,
“ix0″
)
;
// register the interface
ioctl
(
fd
,
NIOCREG
,
&
amp
;
req
)
;
// offset of the structure
mem
=
mmap
(
NULL
,
req
.
nr_memsize
,
PROT_READ
|
PROT_WRITE
,
0
,
fd
,
0
)
;
nifp
=
NETMAP_IF
(
mem
,
req
.
nr_offset
)
;
for
(
;
;
)
{
struct
pollfd
x
[
1
]
;
struct
netmap_ring *
ring
=
NETMAP_RX_RING
(
nifp
,
0
)
;
x
[
0
]
.
fd
=
fd
;
x
[
0
]
.
events
=
POLLIN
;
poll
(
x
,
1
,
1000
)
;
for
(
;
ring
-
&
gt
;
avail
&
gt
;
0
;
ring
-
&
gt
;
avail
–
)
{
i
=
ring
-
&
gt
;
cur
;
buf
=
NETMAP_BUF
(
ring
,
i
)
;
use_data
(
buf
,
ring
-
&
gt
;
slot
[
i
]
.
len
)
;
ring
-
&
gt
;
cur
=
NETMAP_NEXT
(
ring
,
i
)
;
}
}
|
6. 应用场景
(1)抓包程序
(2)高性能发包器
(3)虚拟交换机:虚拟交换机场景下,使用Netmap可以实现不同网卡间高效数据转发,将一个网卡的数据放到另外一个网卡上时,只需要将接收环中的packet的描述符放入发送环,不需要拷贝数据,实现数据包的零拷贝。
7. 反思
(1)采用Netmap后,由于数据包不经过协议栈,防火墙的功能如何实现?是否可以直接在网卡驱动上进行?
(2)数据包到达用户态后,由于是原始数据包,用户态是否有类似于TCP/IP协议栈的功能的应用进行协议栈解析?
(3)Netmap作者基于Netmap实现了一个VALE(VALE, a Switched Ethernet for Virtual Machines)虚拟交换机,其原理待进一步分析。