2Core+1千兆网卡如何打出100万RPS 的DNS流量

背景

以前在一次DNS压力测试中,尝试用DPDK撰写了一个DNS的压力测试工具,难度不大,直接用DPDK的SAMPLE 和一个DNS发包程序的源码糅合在一起即可,测试效果还行,代码写的很渣,但是能用,可以把被测试设备的性能打到极限。

如何搭建DPDK编译环境可以在dpdk官网可以找到,本文完整的linux源码在下面的github地址,包含eclipse环境配置

[https://github.com/Linjian139/dpdk_dns_flood/blob/master/main.c]

关键点

由于dpdk直接使用底层发包,从mac->ip->udp,需要自己构造每一层次的报文头和报文体,代码包含若干结构体和构造方法,关键结构体包含:

    struct DNS_HEADER
    struct QUESTION
    struct R_DATA
    struct RES_RECORD
    struct ADD_RECORDS

主要的数据包构造方法:

void build_udp_mac_header
void build_dns_header

另外checksum也要自己做(根据文档DKDP似乎是可以直接用硬件功能进行checksum的,不过我没弄成功)

代码要点

主要函数包含main函数和循环发送数据包的main_loop

static int main_loop(__attribute__((unused)) void *arg)
{

  const unsigned lcore_id = rte_lcore_id();


  char argv_2[] ="172.16.1.252";  //目标被测试设备的入口IP地址
  const char *question=arg_query;//查询的域名
  char argv_1[] ="10.128.10.";//本机地址段,该程序从这个段然后根据lcore id生成的真实ip地址
       ......
 

      if (unlikely(udphdr_ptr->source>=65534))
      {
          iphdr_ptr->ip_src.s_addr++;
          iphdr_ptr->ip_sum=0;
          iphdr_ptr->ip_sum=cksum(iphdr_ptr,20);
          udphdr_ptr->source= base_port;

      }else
      {
          udphdr_ptr->source++;//此处会变换端口
       }

     .....
}

main_loop中构造数据包

main.c中初始化RTE环境参数,检查对应dev,这些都可以用dpdk官方sample代码中找到,最后调用main_loop执行死循环发送DNS数据包

rte_eal_mp_remote_launch(main_loop, NULL, CALL_MASTER);

如何执行

Usage 信息是准的:

  PRINT_INFO("\nUsage: %s [EAL options] -- -p PORTMASK -i IN_CORES -o OUT_CORES\n"
             "    -p PORTMASK: hex bitmask of ports to use\n"
             "    -o OUT_CORES: hex bitmask of cores which write to NIC",
             prgname);

在DKDP环境中使用bitmask的方式指定使用那张网卡执行,可以使用DPDK的自带的工具查看哪些网卡可用,用网卡在dpdk的序号映射为bitmask进行指定。

效果和感想

坏处:

DPDK使用感想是三个字:”真费电“,一启动啥都不干,cpu直接原地爆炸到100%,DPDK 2.1版本中只能通过intel的cpu节能技术把频率降低,达到业务闲时降低能耗的效果,不知道新版本会不会好点,但是感觉从poll mode driver的实现角度说,也只有这样。

好处:

用DPDK没有soft irq的瓶颈,不会像nginx一样数据包多的时候会造成大量的soft irq,nginx还是依赖linux本身的协议栈,哪怕是走了epoll,数据包的后半处理还是要用软中断通知cpu执行TCP部分的后半,然后从TCP再走epoll的callback直接调用挂在socket的nginx方法

因为直接从net dev的buff拿数据到userspace,又是死循环模式,处理延迟很低,可以适配一些低延迟场景

现在也有用dpdk直接实现多核tcp协议的,比如mTCP,国内也有一些实现,不过17年后国内那个项目没有在更新了,感觉mTCP 14年开始兴起,17年慢慢就冷了,大约在14年普林斯顿大学有一篇相关的论文:
mTCP: A Highly Scalable User-level TCP Stack for Multicore Systems
里面有过一些测试,在高压力场景下,可以看到内核消耗了大量的资源,通过dpdk可以把cpu cycle更多的给到应用,而不是消耗在软中断和从kernel space 到user space的memcpy:

Screen Shot 2019-08-07 at 5.30.29 PM.png

测试效果

在使用F5 5200V ,wideip进行解析,round robin算法下,一台服务器使用两个core,一个千兆网卡,可以打出100万RPS并成功解析,此时F5 5200V CPU为100%,解析率100%:

DNS RPS 1M+:


Picture1.png

每秒新建1M+:


Picture2.png

F5 5200 CPU 100%:

Picture3.png

感觉帮客户省了一笔租IXIA的钱,但也没到我兜里 :P

下一篇写源进源出在linux kernel中如何通过魔改实现

魔改一时爽,一直魔改一直爽

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352