zoukankan      html  css  js  c++  java
  • pktgen

    Linux 内核自带的高性能网络测试工具 pktgen。pktgen 支持丰富的自定义选项,方便你根据实际需要构造所需网络包,从而更准确地测试出目标服务器的性能。

    不过,在 Linux 系统中,你并不能直接找到 pktgen 命令。因为 pktgen 作为一个内核线程来运行,需要你加载 pktgen 内核模块后,再通过 /proc 文件系统来交互。下面就是 pktgen 启动的两个内核线程和 /proc 文件系统的交互文件:

    $ modprobe pktgen
    $ ps -ef | grep pktgen | grep -v grep
    root     26384     2  0 06:17 ?        00:00:00 [kpktgend_0]
    root     26385     2  0 06:17 ?        00:00:00 [kpktgend_1]
    $ ls /proc/net/pktgen/
    kpktgend_0  kpktgend_1  pgctrl

    pktgen 在每个 CPU 上启动一个内核线程,并可以通过 /proc/net/pktgen 下面的同名文件,跟这些线程交互;而 pgctrl 则主要用来控制这次测试的开启和停止。如果 modprobe 命令执行失败,说明你的内核没有配置 CONFIG_NET_PKTGEN 选项。这就需要你配置 pktgen 内核模块(即 CONFIG_NET_PKTGEN=m)后,重新编译内核,才可以使用。

    在使用 pktgen 测试网络性能时,需要先给每个内核线程 kpktgend_X 以及测试网卡,配置 pktgen 选项,然后再通过 pgctrl 启动测试。以发包测试为例,假设发包机器使用的网卡是 eth0,而目标机器的 IP 地址为 192.168.0.30,MAC 地址为 11:11:11:11:11:11。

     测试示例

    # 定义一个工具函数,方便后面配置各种测试选项
    function pgset() {
        local result
        echo $1 > $PGDEV
    
        result=`cat $PGDEV | fgrep "Result: OK:"`
        if [ "$result" = "" ]; then
             cat $PGDEV | fgrep Result:
        fi
    }
    
    # 为0号线程绑定eth0网卡
    PGDEV=/proc/net/pktgen/kpktgend_0
    pgset "rem_device_all"   # 清空网卡绑定
    pgset "add_device eth0"  # 添加eth0网卡
    
    # 配置eth0网卡的测试选项
    PGDEV=/proc/net/pktgen/eth0
    pgset "count 1000000"    # 总发包数量
    pgset "delay 5000"       # 不同包之间的发送延迟(单位纳秒)
    pgset "clone_skb 0"      # SKB包复制
    pgset "pkt_size 64"      # 网络包大小
    pgset "dst 192.168.0.30" # 目的IP
    pgset "dst_mac 11:11:11:11:11:11"  # 目的MAC
    
    # 启动测试
    PGDEV=/proc/net/pktgen/pgctrl
    pgset "start"

    稍等一会儿,测试完成后,结果可以从 /proc 文件系统中获取。通过下面代码段中的内容,我们可以查看刚才的测试报告:

    $ cat /proc/net/pktgen/eth0
    Params: count 1000000  min_pkt_size: 64  max_pkt_size: 64
         frags: 0  delay: 0  clone_skb: 0  ifname: eth0
         flows: 0 flowlen: 0
    ...
    Current:
         pkts-sofar: 1000000  errors: 0
         started: 1534853256071us  stopped: 1534861576098us idle: 70673us
    ...
    Result: OK: 8320027(c8249354+d70673) usec, 1000000 (64byte,0frags)
      120191pps 61Mb/sec (61537792bps) errors: 0

    你可以看到,测试报告主要分为三个部分:

    第一部分的 Params 是测试选项;

    第二部分的 Current 是测试进度,其中, packts so far(pkts-sofar)表示已经发送了 100 万个包,也就表明测试已完成。

    第三部分的 Result 是测试结果,包含测试所用时间、网络包数量和分片、PPS、吞吐量以及错误数。

    根据上面的结果,我们发现,PPS 为 12 万,吞吐量为 61 Mb/s,没有发生错误。那么,12 万的 PPS 好不好呢?作为对比,你可以计算一下千兆交换机的 PPS。交换机可以达到线速(满负载时,无差错转发),它的 PPS 就是 1000Mbit 除以以太网帧的大小,即 1000Mbps/((64+20)*8bit) = 1.5 Mpps(其中,20B 为以太网帧前导和帧间距的大小)。

  • 相关阅读:
    结构层HTML + 表现层CSS
    移动端:项目实战
    移动端:开发技巧
    两个对象数组,把其中相同的name的before相加,不同的对象添加到数组里
    js中遍历数组和遍历对象
    css学习笔记一
    Angular2父子组件数据传递之@ViewChild获取子组件详解
    css知识点总结
    js中的apply,call,arguments,callee,caller详解
    javascript中的排序
  • 原文地址:https://www.cnblogs.com/fanggege/p/14314463.html
Copyright © 2011-2022 走看看