文章目录
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,感谢其在本贴研发过程中给予的支持!