基于 dpdk-nginx 的 c1000k 并发研发

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/raoping2017/article/details/71366096

文章目录

1、概述
2、dpdk 介绍
3、ans 简介
4、dpdk-nginx 简介
5、nginx 和 dpdk-nginx 压测数据对比
6、小结
7、后续问题

1、概述

    本文简单介绍 dpdk 和 ans,以及基于 ans 用户协议改造的 nginx -- dpdk-nginx 的使用方式和压测数据,以说明 dpdk-nginx 在单机上的更高的 qps 处理速度和 c1000k 并发性能。

2、dpdk 介绍

2.1 简介

    Intel® DPDK 全称 Intel Data Plane Development Kit,是 intel 提供的数据平面开发工具集,为 Intel architecture(IA)处理器架构下用户空间高效的数据包处理提供库函数和驱动的支持,它不同于 Linux 系统以通用性设计为目的,而是专注于网络应用中数据包的高性能处理。目前已经验证可以运行在大多数 Linux 操作系统上,包括 FreeBSD 9.2、Fedora release18、Ubuntu 12.04 LTS、RedHat Enterprise Linux 6.3 和 Suse EnterpriseLinux 11 SP2 等。DPDK 使用了 BSDLicense,极大的方便了企业在其基础上来实现自己的协议栈或者应用。
    需要强调的是,DPDK 应用程序是运行在用户空间上利用自身提供的数据平面库来收发数据包,绕过了 Linux 内核协议栈对数据包处理过程。Linux 内核将 DPDK 应用程序看作是一个普通的用户态进程,包括它的编译、连接和加载方式和普通程序没有什么两样。

2.2 原理介绍

   DPDK 对从内核层到用户层的网络流程相对传统网络模块进行了特殊处理,下面对传统网络模块结构和DPDK中的网络结构做对比:

   * 传统 linux 网络层数据处理流程:

   硬件中断 ---> 取包分发至内核线程 ---> 软件中断 ---> 内核线程在协议栈中处理包 ---> 处理完毕通知用户层
   用户层收包 --> 网络层 ---> 逻辑层 ---> 业务层

   * dpdk 网络层数据处理流程:

   硬件中断 ---> 放弃中断流程
   用户层通过设备映射取包 ---> 进入用户层协议栈 ---> 逻辑层 ---> 业务层

   通过以上对比后总结 dpdk:

   * dpdk 优势:

   减少了中断次数。
   减少了内存拷贝次数。
   绕过了linux的协议栈,进入用户协议栈,用户获得了协议栈的控制权,能够定制化协议栈降低复杂度

   * dpdk劣势:

   内核栈转移至用户层增加了开发成本.
   低负荷服务器不实用,会造成内核空转.

下载 dpdk-17.02 版:
http://dpdk.org/download

2.3 dpdk 安装使用

    下载 dpdk-17.02 版后解压,进入文件夹,dpdk-17.02/usertools/,执行 dpdk-setup.sh 进入安装界面:

选项 13 -- 编译
选项 16 -- 插入驱动程序
选项 20 -- 设置内存映射大小(1024)
选项 22 -- 绑定网卡
选项 32 -- 退出

     完成 dpdk17.02 版安装。

3、ans 简介

    ANS(Acceleted Network Stack) 是一个基于 DPDK 的 TCP/IP stack,可以运行在 linux userspace。用户可以自由添加、删除 ether 接口和 IP 地址,添加、删除静态路由。

Support environment:

    EAL is based on dpdk-1.7.0
    Development enviroment is based on x86_64-native-linuxapp-gcc
    TCP/IP stack is based on FreeBSD 10.0-RELEASE

Support feature:

    Netdp initialize
    Ether layer
    ARP
    IP layer
    Routing
    ICMP
    TCP
    UDP
    Commands for adding, deleting, showing IP address
    Commands for adding, deleting, showing static route

c 实现 github 源码,包含安装过程:
https://github.com/opendp/dpdk-ans

4、dpdk-nginx

    dpdk-nginx 是基于 ans 协议改造的 nginx,使 nginx 可以保留大部分原有功能且具有 dpdk 的高速处理数据的特性。

    c 实现 github 源码,包含安装过程:
    https://github.com/opendp/dpdk-nginx

5、nginx 和 dpdk-nginx 压测数据对比

    本节基于 nginx 静态欢迎页,使用 wrk 工具对 nginx 和 dpdk-nginx 进行压力测试,测试数据如下:

5.1 wrk nginx test data

./wrk -t10 -c 1k -d30s http://192.168.1.203/index.html
Running 30s test @ http://192.168.1.203/index.html
  10 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    24.90ms   96.79ms   1.80s    94.48%
    Req/Sec     3.38k     1.78k   11.35k    70.29%
  981045 requests in 30.10s, 790.58MB read
  Socket errors: connect 390, read 0, write 0, timeout 454
Requests/sec:  32597.37
Transfer/sec:     26.27MB
./wrk -t10 -c 1k -d30s http://192.168.1.203/index.html
Running 30s test @ http://192.168.1.203/index.html
  10 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     4.51ms   19.90ms 818.57ms   98.56%
    Req/Sec     3.78k     3.19k   17.76k    85.42%
  875360 requests in 30.09s, 705.41MB read
  Socket errors: connect 903, read 0, write 0, timeout 0
Requests/sec:  29088.84
Transfer/sec:     23.44MB
./wrk -t10 -c 1k -d30s http://192.168.1.203/index.html
Running 30s test @ http://192.168.1.203/index.html
  10 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    26.01ms  100.35ms   1.64s    95.54%
    Req/Sec     2.61k     1.26k    9.97k    73.64%
  774384 requests in 30.09s, 624.04MB read
  Socket errors: connect 592, read 0, write 0, timeout 87
Requests/sec:  25731.99
Transfer/sec:     20.74MB

5.2 wrk nginx-dpdk 4 核

./wrk -t10 -c 1k -d30s http://10.0.0.2/index.html
Running 30s test @ http://10.0.0.2/index.html
  10 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    10.63ms   39.98ms   1.51s    98.92%
    Req/Sec    11.36k     2.50k   19.73k    78.57%
  3340966 requests in 30.10s, 2.64GB read
  Socket errors: connect 0, read 0, write 0, timeout 31
Requests/sec: 110997.02
Transfer/sec:     89.87MB
./wrk -t10 -c 1k -d30s http://10.0.0.2/index.html
Running 30s test @ http://10.0.0.2/index.html
  10 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.80ms   19.03ms   1.51s    99.72%
    Req/Sec     9.68k     3.86k   33.09k    69.36%
  2747471 requests in 30.01s, 2.17GB read
  Socket errors: connect 0, read 0, write 0, timeout 35
Requests/sec:  91548.78
Transfer/sec:     74.12MB
./wrk -t10 -c 1k -d30s http://10.0.0.2/index.html
Running 30s test @ http://10.0.0.2/index.html
  10 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     2.43ms   15.35ms   1.47s    99.69%
    Req/Sec    10.99k     3.04k   24.30k    71.45%
  3255284 requests in 30.08s, 2.57GB read
  Socket errors: connect 0, read 0, write 0, timeout 29
Requests/sec: 108214.54
Transfer/sec:     87.61MB

6、小结

    由以上数据可以看出,dpdk-nginx 在相同的测试条件是 nginx qps 的 3 倍多。

7、后续问题

    这里 dpdk-nginx 还未到达 c1000k 的性能,并且尚存在一些错误请求,为什么呢?网上其他网友的测试数据显示 dpdk-nginx 是可以到达 c1000k 的并发能力的,我这里尚有需要优化或改进的地方。

可能原因和尚待研究的方向:
(1)网卡为千兆网卡,达到 c1000k 需要更高的网卡配置?
(2)nginx 集成瓶颈?
(3)网线或 dpdk 、linux 参数优化项等其他原因?

dpdk-nginx 源码来自网友 bulestar,感谢其在本贴研发过程中给予的支持!

展开阅读全文

没有更多推荐了,返回首页