Chinaunix首页 | 论坛 | 博客
  • 博客访问: 713891
  • 博文数量: 79
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 1338
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-12 08:51
个人简介

XMU->九天揽月->五湖抓鳖->DSP->driver->kernel/OpenWRT->ISP/RTOS

文章分类

全部博文(79)

文章存档

2020年(2)

2018年(3)

2016年(7)

2015年(42)

2014年(25)

分类: LINUX

2015-08-14 19:19:08

pktgen是linux内核自带的发包工具,省却了用户态socket的参与,纯粹在内核构造skb送netdev的txqueue上,可以达到极高pps。pktgen只有UDP协议,适合做吞吐量测试。

安装pktgen,一般只需要 insmod /lib/modules/`uname-r`/pktgen.ko,该目录下没有的话就去内核menuconfig选中PKTGEN,编译出kmod。
加载后 ps -aux | grep kpktgend,会发现与cpu核个数相等的内核线程已经启动。
 
在用户态通过/proc/net/pktgen/下几个文件配置内核中的线程和报文参数,
kpktgend_*表示你可以为每个核绑定一个内核线程做不同配置的报文发送。

配置和启动脚本:
  1. #! /bin/sh
  2. lsmod | grep pktgen || { echo -e " Should load pktgen.ko first! "
  3.     exit
  4. }

  5. # User Config Here -----------------------------------------------------------
  6. MYDEV=eth0 # use MYDEV to send pkts
  7. PKT_STEP=10000000 # 100pps STEP unit is nanosecond, 0 means the MAX speed
  8. #PKT_STEP=1000000 # 1000pps
  9. #PKT_STEP=100000 # 10000pps

  10. PKT_LEN=1000
  11. DST_IP="2.2.2.100"
  12. DST_MAC="02:5D:AE:BA:E0:00"
  13. echo -e "@@@@ flow pps= `[ $PKT_STEP -gt 0 ] && echo $((1000000000 / $PKT_STEP)) || echo line rate`"
  14. echo -e "@@@@ pkt len = $PKT_LEN"

  15. CLONE_SKB=1000000 # num of identical copies of the same pkt, 0 means alloc for every skb
  16. SIRQ_AFTER_SEND_PKTNUM=10000 #do_softirq after send NUM pkts

  17. # CAUTION PGDEV differ in diff config stage
  18. pgset()
  19. {
  20.     local result
  21.     echo $1 > $PGDEV
  22.     result=`cat $PGDEV | fgrep "Result: OK:"`
  23.     if [ "$result" = "" ]; then
  24.         cat $PGDEV | fgrep Result:
  25.     fi
  26. }
  27. pg()
  28. {
  29.     echo inject > $PGDEV
  30.     cat $PGDEV
  31. }
  32. # Config Start Here -----------------------------------------------------------
  33. # thread config
  34. # Each CPU has own thread. Two CPU exammple. We add eth1, eth2 respectivly.
  35. PGDEV=/proc/net/pktgen/kpktgend_0
  36. echo "Configuring $PGDEV"
  37. #echo "Removing all devices"
  38. pgset "rem_device_all"
  39. echo "Adding $MYDEV to pktgen"
  40. pgset "add_device $MYDEV"
  41. pgset "max_before_softirq $SIRQ_AFTER_SEND_PKTNUM"

  42. # device config
  43. # delay 0 means maximum speed.
  44. PGDEV=/proc/net/pktgen/${MYDEV}
  45. echo "Configuring $PGDEV"
  46. # COUNT 0 means forever
  47. pgset "count 0"
  48. pgset "clone_skb $CLONE_SKB"
  49. # NIC plus 4 bytes CRC
  50. pgset "pkt_size $PKT_LEN"
  51. pgset "delay $PKT_STEP"
  52. pgset "dst $DST_IP"
  53. pgset "dst_mac $DST_MAC"

  54. # Time to run
  55. PGDEV=/proc/net/pktgen/pgctrl
  56. echo "Running... ctrl^C to stop"
  57. pgset "start"
  58. echo "Done"

  59. # refer to /proc/net/pktgen/${MYDEV} for sending statistic

附参数列表:

阅读(11940) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

csxrlxj2015-11-12 22:14:47

<p style=\"LIST-STYLE-TYPE: none; TEXT-DECORATION: none; BORDER-TOP: medium none; BORDER-RIGHT: medium none; BORDER-BOTTOM: medium none; COLOR: rgb(102,102,102); PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; BORDER-LEFT: medium none; LINE-HEIGHT: 35px; PADDING-RIGHT: 0px; TEXT-INDENT: 20px\"><span style=\"font-size:18px;\"><a href=\"http://www.csxr888.com\"&