delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

12 Aug 2011

netmap

今天 BAFUG 活动, Luigi Rizzo (十年前提出DEVICE_POLLING概念的那哥们) 带来了他在 FreeBSD 上新实作的 netmap

简单来说 netmap 实际上是提供了一种让用户程序以一致的接口直接访问网卡(收发包且zero copy)的方法。Luigi Rizzo 的测试中,用以 1050MHz 的单核,在很普通的万兆网卡上就可以轻松达到 14.8 Mpps 了,每个包的开销大约是90个时钟周期。

netmap 对网卡的驱动需要做少量修改,但基本都在30行以内。系统仍然可以"看到"用于netmap的网卡,这个接口暂时还不支持 kqueue(不过貌似暂时也没太大必要的说,毕竟一台机器不会有几千块网卡)。除了性能之外,netmap的设计还可以确保内核永远不崩,此外,现有的 libpcap 程序可以很容易地移植到 netmap 平台(取了一个路由平台做例子,使用 libpcap 兼容库可达到大约 70% 左右的 native API 性能;直接用 native API 的话,性能大约是经过优化的普通 libpcap+内核模块 的 Linux 环境的 4 倍)。

现在我自己想到的比较有用的用途是在用户态跑一个 TCP/IP 栈一类的应用—-当然,应用程序可以跟这个 TCP 栈捆在一起。到会的 C记,J记 以及某测试公司的同学提出了不少问题,其中关于 netmap 需要复制哪些内存,这个东西对他们的业务来来说,用途会更直接一些。

这个暂时还没进 -CURRENT。立刻可以想到的改进包括尽量省掉对页表的改动。应用方面似乎可以给 nginx 啥的直接做个 TCP 栈之类的?省掉了 socket 需要的开销,TCP方面可以做的事情就很多了,比如两台机器可以互相推 TCP 状态之类的来做 HA,等等。