MoonGen - 灵活又高性能的收发包工具

阅读更多
MoonGen是一个高性能的基于CPU的收发包工具
DPDK保证其性能强大,用单核x86 CPU可以收发64B 10G
Lua是比较流行的小巧灵活的脚本语言,收发包逻辑修改后不用编译,直接运行,因为是脚本。
LuaJit是Lua的x86即时编译工具。
这三兄弟组合就是灵活的MoonGen引擎,运行Lua脚本用来执行收发包逻辑,很容易写出比专业测试仪还复杂的逻辑。

编译步骤:
  • 安装cmake
  • git clone https://github.com/emmericp/MoonGen.git
  • ./build.sh
  • 如果DPDK KNI模块编译出错, 打开libmoon/deps/dpdk/x86_64-native-linuxapp-gcc/.config文件,修改:CONFIG_RTE_KNI_KMOD=n


运行基本上就是DPDK常规启动步骤:
  • sudo modprobe uio;
  • sudo insmod libmoon/deps/dpdk/x86_64-native-linuxapp-gcc/kmod/igb_uio.ko
  • sudo ./bind-interfaces.sh
  • sudo ./setup-hugetlbfs.sh
  • sudo ./build/MoonGen libmoon/examples/pktgen.lua 0


examples目录下有更多demo脚本, 不同协议包的操作api参见: https://github.com/libmoon/libmoon/tree/master/lua/proto


一个最简单的vlan报文收发Lua脚本:
local lm     = require "libmoon"
local device = require "device"
local stats  = require "stats"
local log    = require "log"
local memory = require "memory"

function master(args,...)
    log:info("VLAN packet generator")
    local dev = device.config{port = 0,txQueues = 1,rxQueues = 1}
    device.waitForLinks()
    stats.startStatsTask{devices = {dev}}
    lm.startTask("txVlanSlave", dev:getTxQueue(0))
    lm.waitForTasks()
end

function txVlanSlave(queue)
    local mempool = memory.createMemPool(function(buf)
        buf:getEthVlanPacket():fill{
            ethSrc = queue, -- MAC of the tx device
            ethDst = "01:23:45:67:89:ab",
            ethVlan = 1111,
        }
    end)
    local bufs = mempool:bufArray()
    while lm.running() do
        bufs:alloc(60) -- Packet size
--        for i, buf in ipairs(bufs) do
--            local pkt = buf:getEthVlanPacket();
--            pkt.eth:setVlanTag(i)
--        end
        queue:send(bufs)
    end
end

你可能感兴趣的:(MoonGen,libmoon,dpdk,lua,luajit)