-
Notifications
You must be signed in to change notification settings - Fork 1
/
netmap
22 lines (20 loc) · 2.02 KB
/
netmap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Netmap
1 Netmap是什么?
1.1 简介
Netmap是一个高性能收发原始数据包的框架,由Luigi Rizzo开发完成,其包含了内核模块以及用户态库函数。其目标是,不修改现有操作系统软件以及不需要特殊硬件支持,实现用户态和网卡之间数据包的高性能传递。
1.2 原理
1.3 特点
(1) 性能高:数据包不走传统协议栈,不需要层层解析,用户态直接与网卡的接受环和发送环交互。性能高的具体原因有一下三个:
a) 系统调用以及处理数据包的时间花费少
b) 不需要进行数据包的内存分配:采用数据包池,当有数据到达后,直接从数据包池中取出一个数据包,然后将数据放入此数据包中,再将数据包的描述符放入接收环中。
c) 数据拷贝次数少:内核中的数据包采用mmap技术映射到用户态。所以数据包在到达用户态时,不需要进行数据包的拷贝。
(2) 稳定性高:有关网卡寄存器数据的维护都是在内核模块进行,用户不会直接操作寄存器。所以在用户态操作时,不会导致操作系统崩溃
(3) 亲和性:采用了CPU亲和性,可实现CPU和网卡绑定,提高性能。
(4) 易用性好:API操作简单,用户态只需要调用ioctl函数即可完成数据包收发工作
(5) 与硬件解耦:不依赖硬件,只需要对网卡驱动程序稍微做点修改就可以使用此框架(30行左右),修改点是传统网卡驱动将数据包传递给操作系统内核中协议栈,而修改后的数据包直接放入Netmap_ring供用户使用。
1.4 性能对比
http://info.iet.unipi.it/~luigi/netmap/ 图
1.5 用户态操作
1.6 应用场景
(1) 虚拟交换机:虚拟交换机场景下,使用Netmap可以实现不同网卡间高效数据转发,将一个网卡的数据放到另外一个网卡上时,只需要将接收环中的packet的描述符放入发送环,不需要拷贝数据,实现数据包的零拷贝。
http://queue.acm.org/detail.cfm?id=2103536