域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网,DNS通常使用UDP53端口(也支持TCP53)。除了在公网使用DNS做域名解析之外,在内网环境下,为了支持内部域名解析或者是一些高可用服务时,通常需要自建DNS服务。那么自建的DNS服务性能如何,则需要在部署生产环境之前进行性能测试。
本文就介绍一种使用Jmeter进行DNS压测的方法。很多场景下,Jmeter都是用作web服务的压测工具,得益于插件的支持,Jmeter还可以扩展出很多其他的功能,比如通过UDP Protocol Support插件,能够模拟发送UDP消息,而DNS服务通常使用的就是UDP协议,构造合适的UDP请求,就可可以用来压测DNS服务。
整个压测过程包含三个部分,1、软件和环境准备;2、压测脚本构造;3、压测和结果分析
软件环境准备
本次压测基于Jmeter 3.2 和 JDK 8 ,在windows x64环境下生成压测脚本
基本环境安装
安装过程不再赘述,安装完成后,在Jmeter安装路径下执行bin/jmeter.bat打开Jmeter,能够正常打开则表示安装无误
安装插件
插件下载 下载 plugins-manager.jar 然后复制到 lib/ext 目录下, 并重启Jmeter
重启完成后在 选项 下选择 “Plugins Manager”,进入到插件管理界面,输入UDP,勾选UDP Protocol Support,插件管理器会自动安装对应的插件,安装完成后重启Jmeter
压测脚本构建
首先,新建一个线程组,添加UDP request用于发送请求,Summary Report 用于收集测试信息
然后,选择UDP request,构建UDP请求信息,包含两个信息:
1、压测的DNS服务器和端口,例如本次压测以114DNS作为测试,则应该填写114.114.114.114 端口为53
2、UDP 请求的request data信息,此处根据不同的Encode/Decode Class,有不同的方法,这里介绍最常见的两种
第一种,通过Wireshark工具获取,此时Encode/Decode Class设置如下
kg.apc.jmeter.samplers.HexStringUDPDecoder
a、打开Wireshark开始抓包,然后在命令行执行nklookup www.baidu.com
b、停止Wireshark抓包,过滤条件设置为 dns,找到刚才DNS解析的请求报文
c、在报文详情中右击”Domain Name System(query)”,然后选择”Copy => Byptes(Hex Stream)”, 然后把复制到的数据粘贴到jmeter UDP Request的request data中
完成后如图所示
第二种,通过指定解析DNS的域名和记录类型,此时Encode/Decode Class设置如下
kg.apc.jmeter.samplers.DNSJavaDecoder
在jmeter UDP Request的request data中按照如下格式填写信息
www.baidu.com. A IN
完成后如图所示
压测和结果分析
DNS服务器有两个指标比较重要:响应时间和失败率。
UDP消息是无状态的,有可能会在网络传输中丢失。如果发生丢失,那么客户端就会一直等待,直到超时。因此在测试中,根据业务需求选择合适的超时时间。
设置合适的并发数和循环次数,然后开始压测,待测试完成后即可在Summary Report看到结果统计信息,如下图
小结
1、Jmeter是一款强大的工具,通过其插件功能,能够拓展其压测的范围,基于UDP request,不仅可以测试DNS,还可以测试NTP 等UDP协议的服务。
2、本文主要用于演示压测过程,实际压测时根据Jmeter官方建议使用命令行而非GUI