dperf 原本设计用于四层负载均衡测试,TCP协议栈、HTTP协议栈设计相当简略,不适合对Nginx进行测试。由于以下原因,决定给dperf支持完整的HTTP协议:
封在家里50多天,要找点有趣的事情,充实丰富生活
给 dperf 做一个受众更广的特性,让它能帮助更多的人
很多年一直想解决七层性能测试问题
作为HTTP客户端运行,能够解析HTTP响应
不支持作为HTTP服务器运行(未来支持)
不支持HTTPS
用来测试nginx的性能,不是测试功能
在内网运行,带宽很高、极少发生丢包
只支持HTTP GET,不支持POST
HTTP响应的header不会跨报文
无拥塞控制
限制PATH长度,把HTTP请求限制在一个报文内,这样发送数据就不会超过接收窗口,所以发送方向不需要考虑拥塞控制
接收方向收到数据后,解析完就丢弃,基本可以做到线速,可以把接收窗口设置为极大,不要收缩接收窗口
HTTP解析
要求报文符合HTTP协议格式
只需要关注报文长度、长/短连接相关的头部,要求这些头部不能跨报文:Connection,Content-Length, Transfer-Encoding
整个解析过程不缓存报文,只需要记录状态
不使用DPDK GRO的原因
DPDK GRO不支持IPV6
VXLAN支持可能有较大挑战(猜测)
dperf协议栈非常快,在协议栈上的开销非常小,GRO对性能的贡献有限(猜测)
我希望四层、七层处理逻辑统一,不使用GRO逻辑更简单
丢包与乱序
假设极少丢包,如果丢报文,说明以及测到了极限,应该降低压力
假设没有乱序,如果乱序,简单起见(不想缓存报文),就认为丢包了,也许以后可以改进一下
不支持SACK,不想缓存报文
其他TCP特性
不支持Timestamp
支持Delay ACK,大概0.1ms刷一次delay的ACK
只涉及三个配置项,详见 配置文档 :
protocol http
http_path /xxxx
http_host www.dperf.com
例子,客户端是dperf,服务器是nginx。
mode client
cpu 0
protocol http
duration 1d
keepalive 1ms
http_path /16k
cps 1
cc 10
port 0000:00:04.0 172.16.192.111 172.16.199.174
client 172.16.192.111 1
server 172.16.199.174 1 listen 80 1
dperf 可以作为性能测试工具,测试nginx等HTTP服务器的性能。当前仍然在测试阶段,希望大家积极试用、反馈。接下来dperf会作为一个测试用的高性能的HTTP服务器。
希望 dperf 对你有帮助,如果喜欢,请去github上加个star吧,谢谢!