2023年12月6日发(作者:)
DNS压力测试方法指南
JerryLi 李兴华
2013-7-10
2
目录
DNS基础介绍 ...................................................................................................................................... 3
测试环境介绍 ....................................................................................................................................... 3
压力测试软件介绍 ......................................................................................................................... 3
压力测试调用文件内容 ................................................................................................................. 4
模拟根服务器 ................................................................................................................................ 6
测试用例 .............................................................................................................................................. 6
权威主DNS测试 .......................................................................................................................... 6
权威辅助DNS测试 ...................................................................................................................... 6
递归性能测试(无缓存) .............................................................................................................. 7
递归性能测试(全部缓存) .......................................................................................................... 7
补充内容 .............................................................................................................................................. 7
2
基础介绍
3
DNS 是域名系统
(Domain Name System) 的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。
既然DNS系统是因特网的一项核心服务,我们就必须要考虑其服务的能力,加之其内部的关键点是分布式数据库系统,我们需要有完善的测试手段来检验DNS真正的服务能力。
由于目前的DNS设备性能越来越高,光靠传统的手段并不能完全的达到测试环境的需求。因此本文介绍了一系列手段,综合性的对DNS系统进行完整的测试。
试环境介绍
压力测试软件介绍
本系列测试使用BIND软件包中自带的压力发生工具Queryperf。此工具使用方法简单,效率很高。通过多线程脚本,可以实现一个笔记本电脑高达50W以上的QPS的DNS请求数量。
使用单一进程运行Queryperf 命令如下:
queryperf -s 192.168.1.2 -d inputfile -l 15
-s
目标服务器地址
-d
调用文件的路径及文件名
-l
运行15秒
输出结果为:
DNS Query Performance Testing Tool
Version: $Id: queryperf.c,v 1.10 2006/12/05 04:32:29 roberts Exp $
[Status] Processing input data
[Status] Sending queries (beginning with 127.0.0.1)
[Status] Testing complete
Statistics:
Parse input file: multiple times
Run time limit: 15 seconds
Ran through file: 31 times
Queries sent: 879941 queries
3
Queries completed: 879941 queries
Queries lost: 0 queries
Not authoritative: 0 queries
Contain no answer: 0 queries
Percentage completed: 100.00%
Percentage lost: 0.00%
Started at: Wed Jul 29 13:48:18 2009
Finished at: Wed Jul 29 13:48:33 2009
Ran for: 15.000034 seconds
Queries per second: 58662.600 qps
Latency min/max/avg: 0.021/1.749/0.166 ms
4
为了保证测试结果,并且能达到最大的并发查询量,我们必须在客户端上同时运行多个压力测试的实例。我们通过linux脚本,将多个queryperf进程同时运行,然后进行汇总输出。下面是使用6个queryperf进程同时进行压力测试的脚本:
#!/bin/sh
SECS=60
#//运行时间
#//调用压力测试文件
#//目标DNS服务器地址
#//第一个进程
#//第二个进程
#//第三个进程
#//第四个进程
#//第五个进程
#//第六个进程
INPUT=
SERVER=10.34.31.2
queryperf -s $SERVER -d $INPUT -l $SECS > out1 2>&1 &
queryperf -s $SERVER -d $INPUT -l $SECS > out2 2>&1 &
queryperf -s $SERVER -d $INPUT -l $SECS > out3 2>&1 &
queryperf -s $SERVER -d $INPUT -l $SECS > out4 2>&1 &
queryperf -s $SERVER -d $INPUT -l $SECS > out5 2>&1 &
queryperf -s $SERVER -d $INPUT -l $SECS > out6 2>&1 &
wait
grep 'Queries per' out? | awk 'BEGIN { sum=0;}{ sum += $5;} END
{printf("Total: %.1f qpsn", sum);}' #//数据汇总
压力测试调用文件内容
Queryperf 会读取某一个文本本件,作为查询域名的序列。一般情况下,Queryperf会顺序的调用一个文本文件,直到达到最大行数,之后进行循环。因此我们在测试中,不同场景将使用不同的文件。
由于我们要对多个DNS的角色的服务器进行压力测试,因此准备了一下几种DNS查询源文件:
1. 权威DNS测试,要求10W条顺序记录,一个Zone。一般使用Excel生成,并导入进DNS设备。
4
2. 权威DNS测试,要求500个随机域,每个域包含一条SOA记录,一条NS记录,一条MX记录,24条A记录,24条CNAME记录,记录名称仍然随机。总共记录数目25500条。要求将5
500个域的记录导入到待测设备中。权威测试的调用文件如下:
3. 权威DNS反向解析测试,要求500个随机反向域,每个域包含一条SOA记录、一条NS记录和50条PTR记录。总记录数目26000条。要求将所有记录导入到设备中测试。权威DNS反向解析测试调用文件如下:
4. 权威DNS综合测试,要求合并上面两条的测试文件,形成51000条记录的文件,然后进行测试。
5. 递归查询测试。要求随机域名随机记录,记录不能循环,不能重复。此类型测试表现缓存DNS的性能,及记录进行Cache后的性能。要求设备上能查看到DNS Cache的命中率。
递归查询调用文件生成的脚本如下:(本人为网络工程师,脚本的东西一知半解,随便搞了一个)
#!/bin/bash
a=(a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5
6 7 8 9)
var=1
#creat N A
for var in {1..2100000}
do
for ((i=0;i<10;i++));do
echo -n ${a[$RANDOM % ${#a[@]}]} >>
done
echo -n "." >>
for ((i=0;i<10;i++));do
echo -n ${a[$RANDOM % ${#a[@]}]} >>
done
echo -n ".com A" >>
echo >>
done
echo
5
通过上面脚本可生成210万条的随机记录(由于环境为虚拟设备,上面的脚本基本运行的30分钟才将210w条记录生成完毕),为了保证不会重复,我们将生成的文件分割为6个文件,然后修改我们之前的压力测试脚本:
#!/bin/sh
INPUT1=35w_
#//调用压力测试文件 INPUT2=35w_
INPUT3=35w_
INPUT4=35w_
INPUT5=35w_
INPUT6=35w_
SERVER=10.34.31.2 #//目标DNS服务器地址
queryperf -s $SERVER -d $INPUT1 > out1 2>&1 & #//第一个进程
queryperf -s $SERVER -d $INPUT2 > out2 2>&1 & #//第二个进程
queryperf -s $SERVER -d $INPUT3 > out3 2>&1 & #//第三个进程
queryperf -s $SERVER -d $INPUT4 > out4 2>&1 & #//第四个进程
queryperf -s $SERVER -d $INPUT5 > out5 2>&1 & #//第五个进程
queryperf -s $SERVER -d $INPUT6 > out6 2>&1 & #//第六个进程
wait
grep 'Queries per' out? | awk 'BEGIN { sum=0;}{ sum += $5;} END
{printf("Total: %.1f qpsn", sum);}' #//数据汇总
6
我们让每个进程都调用不同的脚本,并且取消运行60秒,只允许每个进程调用一次文件内容。通过此方法保证发出去的请求完全不一致。
模拟根服务器
如果要进行递归服务器的测试,我们必须需要一个模拟的root服务器,并且能随机的给出任何请求的响应,并返回正确的结果。附上DNS root的模拟程序,在Linux环境中,运行./start_就可以模拟DNS根服务器。同样,./stop_为关闭DNS根服务器的服务。
试用例
权威主DNS测试
直接由压力发生器通过运行脚本进行测试,查看DNS设备的性能。DNS设备上要求包含500个随机Zone,且必须关闭Cache功能。压力测试机对主服务器进行查询,得到查询速度的统计。
DNS服务器千兆交换机压力发生器权威辅助DNS测试
6
在主DNS上配置500个随机Zone,从服务器通过Zone
DNS从服务器Transfer或其他技术将主服务器的记录同步,压力测试机对从服务器进行查询,得到查询速度的统计。
DNS主服务器7
千兆交换机
压力发生器递归性能测试(无缓存)
使用另一台电脑运行root模拟程序,在DNS服务器上配DNS root置转发器,并开启递归,清空DNS Cache。压力发生器使用随机生成的记录类型进行测试。每次测试均需要清除DNS服务器的缓存,已保证所有查询均不会命中DNS Cache。压力测试机对转发器进行查询,得到查询速度的统计。
DNS转发器千兆交换机压力发生器递归性能测试(全部缓存)
重复无缓存的测试,但不进行清除缓存的动作,即可得到100%DNSCache命中率的查询速度结果。
充内容
通过上述几种方法,我们可将DNS的权威主DNS、权威辅DNS、DNS转发器等不同的角色进行测试。当然,我们修改脚本的话,可以实现50% Cache命中率的情况下转发器的性能测试。请各位测试人员自行发挥。
压力测试记录表
序号
1
2
3
4
7
5
6
测试内容 结果为(QPS)
权威主DNS,顺序记录,第一次
权威主DNS,顺序记录,第二次
权威主DNS,随机正向记录,第一次
权威主DNS,随机正向记录,第二次
权威主DNS,随机反向记录,第一次
权威主DNS,随机反向记录,第二次
目标设备 微软DNS
Bind
7
8
9
10
11
12
13
14
15
16
15
16
权威辅DNS,顺序记录,第一次
权威辅DNS,顺序记录,第二次
权威辅DNS,随机正向记录,第一次
权威辅DNS,随机正向记录,第二次
权威辅DNS,随机反向记录,第一次
权威辅DNS,随机反向记录,第二次
转发器,顺序正向记录,第一次(无Cache)
8
转发器,顺序正向记录,第二次(Cache,100%命中)
转发器,随机正向记录,第一次(无Cache)
转发器,随机正向记录,第二次(Cache,100%命中)
转发器,随机反向记录,第一次(无Cache)
转发器,随机反向记录,第二次(Cache,100%命中)
如需要文件中提到的记录文件或脚本,或者有DNS相关问题的探讨,请通过
lxh@ 联系本文作者。
8


发布评论