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