netmap分析(1)

来源:互联网 发布:淘宝宝贝描述图片宽度 编辑:程序博客网 时间:2024/05/21 17:34

文章版权归属yynote.com.转载请标明出处.

原文发表在 YYNOTE.COM 本文地址: http://yynote.com/blog/detail/networking/netmap-study-1


在工作中用到netmap这个高性能IO框架,觉得不错,就整理了一些分析笔记,和大家共享,欢迎交流.

  1. Netmap简介

    Netmap是一款高性能网络IO框架,由意大利比萨大学信息工程系副教授Luigi Rizzo编写,其官方网址为:http://info.iet.unipi.it/~luigi/netmap. 源代码网址: https://code.google.com/p/netmap/ .

    Netmap 使用多种技术比如:内存映射、环形队列、批量处理等来减少内核空间以及用户空间内存申请和释放、避免内存在内核空间和用户空间的拷贝以及减少系统调用。

    目前支持linux/FreeBsd, FreeBSD系统从9.0开始已经包含了netmap所有的源代码; 而linux上需要自行下载netmap源码,目前支持大于linux 2.6.32的版本.

    Netmap支持大多数的网卡型号:

    <code style="font-family:Menlo,Monaco,Consolas,'Courier New',monospace;font-size:undefined; padding:0px; color:inherit; white-space:pre-wrap; background-color:transparent"><span class="typ" style=""><span class="typ" style="">Intel</span></span><span class="pln" style=""><span class="pln" style=""> ixgbe </span></span><span class="pun" style=""><span class="pun" style="">(</span></span><span class="lit" style=""><span class="lit" style="">10G</span></span><span class="pun" style=""><span class="pun" style="">)</span></span><span class="pln" style=""><span class="pln" style=""><br style="" />e1000</span></span><span class="pun" style=""><span class="pun" style="">/</span></span><span class="pln" style=""><span class="pln" style="">e1000e</span></span><span class="pun" style=""><span class="pun" style="">/</span></span><span class="pln" style=""><span class="pln" style="">igb </span></span><span class="pun" style=""><span class="pun" style="">(</span></span><span class="lit" style=""><span class="lit" style="">1G</span></span><span class="pun" style=""><span class="pun" style="">)</span></span><span class="pln" style=""><span class="pln" style=""><br style="" /></span></span><span class="typ" style=""><span class="typ" style="">Realtek</span></span><span class="pln" style=""><span class="pln" style=""> </span></span><span class="lit" style=""><span class="lit" style="">8169</span></span><span class="pln" style=""><span class="pln" style=""> </span></span><span class="pun" style=""><span class="pun" style="">(</span></span><span class="lit" style=""><span class="lit" style="">1G</span></span><span class="pun" style=""><span class="pun" style="">)</span></span><span class="pln" style=""><span class="pln" style=""><br style="" /></span></span><span class="typ" style=""><span class="typ" style="">Nvidia</span></span><span class="pln" style=""><span class="pln" style=""> </span></span><span class="pun" style=""><span class="pun" style="">(</span></span><span class="lit" style=""><span class="lit" style="">1G</span></span><span class="pun" style=""><span class="pun" style="">)</span></span><span class="pln" style=""><span class="pln" style=""><br style="" /></span></span></code>

    Netmap目前的性能测试如下:

    <code style="font-family:Menlo,Monaco,Consolas,'Courier New',monospace;font-size:undefined; padding:0px; color:inherit; white-space:pre-wrap; background-color:transparent"><span class="pln" style=""><span class="pln" style="">ixgbe </span></span><span class="lit" style=""><span class="lit" style="">12.5Mpps</span></span><span class="pln" style=""><span class="pln" style=""><br style="" />e1000</span></span><span class="pun" style=""><span class="pun" style="">/</span></span><span class="pln" style=""><span class="pln" style="">e1000e  </span></span><span class="lit" style=""><span class="lit" style="">1.15</span></span><span class="pun" style=""><span class="pun" style="">~</span></span><span class="lit" style=""><span class="lit" style="">1.32Mpps</span></span><span class="pln" style=""><span class="pln" style=""><br style="" /></span></span></code>
  2. netmap驱动在linux上的编译、安装

    2.1 源码下载

    首先从https://code.google.com/p/netmap/ 获得源代码:

    <code style="font-family:Menlo,Monaco,Consolas,'Courier New',monospace;font-size:undefined; padding:0px; color:inherit; white-space:pre-wrap; background-color:transparent"><span class="pln" style=""><span class="pln" style="">cd </span></span><span class="pun" style=""><span class="pun" style="">~</span></span><span class="str" style=""><span class="str" style="">/workspace<br style="" />git clone https:/</span></span><span class="pun" style=""><span class="pun" style="">/</span></span><span class="pln" style=""><span class="pln" style="">code</span></span><span class="pun" style=""><span class="pun" style="">.</span></span><span class="pln" style=""><span class="pln" style="">google</span></span><span class="pun" style=""><span class="pun" style="">.</span></span><span class="pln" style=""><span class="pln" style="">com</span></span><span class="pun" style=""><span class="pun" style="">/</span></span><span class="pln" style=""><span class="pln" style="">p</span></span><span class="pun" style=""><span class="pun" style="">/</span></span><span class="pln" style=""><span class="pln" style="">netmap<br style="" /></span></span></code>

    说明: 本文档的netmap代码版本基于https://code.google.com/p/netmap/.

    <code style="font-family:Menlo,Monaco,Consolas,'Courier New',monospace;font-size:undefined; padding:0px; color:inherit; white-space:pre-wrap; background-color:transparent"><span class="pln" style=""><span class="pln" style="">commit    be60f844ceb135f4fe63c16897b3882399326d5f<br style="" /></span></span><span class="typ" style=""><span class="typ" style="">Author</span></span><span class="pln" style=""><span class="pln" style=""> </span></span><span class="pun" style=""><span class="pun" style="">:</span></span><span class="pln" style=""><span class="pln" style="">  </span></span><span class="typ" style=""><span class="typ" style="">Vincenzo</span></span><span class="pln" style=""><span class="pln" style=""> </span></span><span class="typ" style=""><span class="typ" style="">Maffione</span></span><span class="pln" style=""><span class="pln" style=""> </span></span><span class="pun" style=""><span class="pun" style=""><</span></span><span class="pln" style=""><span class="pln" style="">v</span></span><span class="pun" style=""><span class="pun" style="">.</span></span><span class="pln" style=""><span class="pln" style="">maffione@gmail</span></span><span class="pun" style=""><span class="pun" style="">.</span></span><span class="pln" style=""><span class="pln" style="">com</span></span><span class="pun" style=""><span class="pun" style="">></span></span><span class="pln" style=""><span class="pln" style=""><br style="" /></span></span><span class="typ" style=""><span class="typ" style="">Date</span></span><span class="pln" style=""><span class="pln" style="">   </span></span><span class="pun" style=""><span class="pun" style="">:</span></span><span class="pln" style=""><span class="pln" style="">  </span></span><span class="typ" style=""><span class="typ" style="">Sun</span></span><span class="pln" style=""><span class="pln" style=""> </span></span><span class="typ" style=""><span class="typ" style="">Mar</span></span><span class="pln" style=""><span class="pln" style=""> </span></span><span class="lit" style=""><span class="lit" style="">23</span></span><span class="pln" style=""><span class="pln" style=""> </span></span><span class="lit" style=""><span class="lit" style="">18</span></span><span class="pun" style=""><span class="pun" style="">:</span></span><span class="lit" style=""><span class="lit" style="">55</span></span><span class="pun" style=""><span class="pun" style="">:</span></span><span class="lit" style=""><span class="lit" style="">49</span></span><span class="pln" style=""><span class="pln" style=""> </span></span><span class="lit" style=""><span class="lit" style="">2014</span></span><span class="pln" style=""><span class="pln" style=""> </span></span><span class="pun" style=""><span class="pun" style="">+</span></span><span class="lit" style=""><span class="lit" style="">0100</span></span><span class="pln" style=""><span class="pln" style=""><br style="" /></span></span></code>

    2.2 编译

    假如系统运行的linux的源代码目录树在目录/a/b/linux-A.B.C

    进入netmap源码目录:

    <code style="font-family:Menlo,Monaco,Consolas,'Courier New',monospace;font-size:undefined; padding:0px; color:inherit; white-space:pre-wrap; background-color:transparent"><span class="pln" style=""><span class="pln" style="">cd </span></span><span class="pun" style=""><span class="pun" style="">~</span></span><span class="str" style=""><span class="str" style="">/workspace/</span></span><span class="pln" style=""><span class="pln" style="">netmap</span></span><span class="pun" style=""><span class="pun" style="">/</span></span><span class="pln" style=""><span class="pln" style="">LINUX<br style="" />make KSRC</span></span><span class="pun" style=""><span class="pun" style="">=</span></span><span class="str" style=""><span class="str" style="">/a/</span></span><span class="pln" style=""><span class="pln" style="">b</span></span><span class="pun" style=""><span class="pun" style="">/</span></span><span class="pln" style=""><span class="pln" style="">linux</span></span><span class="pun" style=""><span class="pun" style="">-</span></span><span class="pln" style=""><span class="pln" style="">A</span></span><span class="pun" style=""><span class="pun" style="">.</span></span><span class="pln" style=""><span class="pln" style="">B</span></span><span class="pun" style=""><span class="pun" style="">.</span></span><span class="pln" style=""><span class="pln" style="">C<br style="" /></span></span></code>

    这样将在目录~/workspace/netmap/LINUX/ 目录下生成netmap_lin.ko 的文件,该文件为netmap模块文件。同时会在网卡类型对应的文件夹下生成相应的驱动文件。   

    以e1000网卡为例,会在LINUX/e1000下生成e1000.ko文件。

    2.3 安装

    以e1000网卡为例,我们首先要将系统已经加载的原生e1000.ko 模块卸载下来,再加载打了netmap补丁的e1000.ko,同时还要加载netmap_lin.ko模块。

    <code style="font-family:Menlo,Monaco,Consolas,'Courier New',monospace;font-size:undefined; padding:0px; color:inherit; white-space:pre-wrap; background-color:transparent"><span class="pln" style=""><span class="pln" style="">rmmod  e1000<br style="" />insmod  netmap_lin</span></span><span class="pun" style=""><span class="pun" style="">.</span></span><span class="pln" style=""><span class="pln" style="">ko<br style="" />insmod  </span></span><span class="pun" style=""><span class="pun" style="">~</span></span><span class="str" style=""><span class="str" style="">/workspace/</span></span><span class="pln" style=""><span class="pln" style="">netmap</span></span><span class="pun" style=""><span class="pun" style="">/</span></span><span class="pln" style=""><span class="pln" style="">LINUX</span></span><span class="pun" style=""><span class="pun" style="">/</span></span><span class="pln" style=""><span class="pln" style="">e1000</span></span><span class="pun" style=""><span class="pun" style="">.</span></span><span class="pln" style=""><span class="pln" style="">ko<br style="" /></span></span></code>

    到此,安装完成。用户层代码未激活netmap时,e1000驱动表现和原生驱动一样。只有当netmap被激活后,netmap_lin.ko 将接替e1000网卡驱动工作。

    2.4 测试

    在example目录下有bridge和pkt-gen两个实例。

    bridge 程序可以将不同的网卡接口桥接在一起,如果是在同一个网卡上,则是支持系统协议栈。如果程序能成功运行并且能完成桥接功能,则netmap安装成功。详见帮助:bridge -h

    Pkt-gen 是用于测试接收发送报文速率。详见帮助:pkt-gen -h

今天就写到这,后面会分析netmap的实现原理.


文章版权归属yynote.com.转载请标明出处.

本文地址: http://yynote.com/blog/detail/networking/netmap-study-1

0 0
原创粉丝点击