本文主要用于介绍如何编译安装queryperf来对DNS服务器进行压测,以及CoreDNS常见的几种配置下的压测性能表现。
1、queryperf
1.1 编译安装
queryperf
是bind9出品的一款测试dns服务器性能的工具,目前在9.12.4
版本的bind源码中还存在,再往后的新版本就没看到有queryperf
了。
[root@coredns1 home]# wget https://ftp.isc.org/isc/bind9/9.12.4/bind-9.12.4.tar.gz
[root@coredns1 home]# tar -zxvf bind-9.12.4.tar.gz
[root@coredns1 home]# cd bind-9.12.4/contrib/queryperf
[root@coredns1 queryperf]# ./configure
[root@coredns1 queryperf]# make
[root@coredns1 queryperf]# file queryperf
queryperf: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, not stripped
1.2 常用操作
# 将编译好的二进制文件直接复制到系统的bin目录中即可全局操作
[root@coredns1 queryperf]# cp queryperf /usr/local/bin/
[root@coredns1 home]# queryperf -h
DNS Query Performance Testing Tool
Version: $Id: queryperf.c,v 1.12 2007/09/05 07:36:04 marka Exp $
Usage: queryperf [-d datafile] [-s server_addr] [-p port] [-q num_queries]
[-b bufsize] [-t timeout] [-n] [-l limit] [-f family] [-1]
[-i interval] [-r arraysize] [-u unit] [-H histfile]
[-T qps] [-e] [-D] [-R] [-c] [-v] [-h]
-d specifies the input data file (default: stdin)
-s sets the server to query (default: 127.0.0.1)
-p sets the port on which to query the server (default: 53)
-q specifies the maximum number of queries outstanding (default: 20)
-t specifies the timeout for query completion in seconds (default: 5)
-n causes configuration changes to be ignored
-l specifies how a limit for how long to run tests in seconds (no default)
-1 run through input only once (default: multiple iff limit given)
-b set input/output buffer size in kilobytes (default: 32 k)
-i specifies interval of intermediate outputs in seconds (default: 0=none)
-f specify address family of DNS transport, inet or inet6 (default: any)
-r set RTT statistics array size (default: 50000)
-u set RTT statistics time unit in usec (default: 100)
-H specifies RTT histogram data file (default: none)
-T specify the target qps (default: 0=unspecified)
-e enable EDNS 0
-D set the DNSSEC OK bit (implies EDNS)
-R disable recursion
-c print the number of packets with each rcode
-v verbose: report the RCODE of each response on stdout
-h print this usage
在压测之前需要我们自己准备压测的测试数据,格式为域名 查询类型
,如:
tinychen.com A
tiny777.com A
tinychen.com MX
tiny777.com MX
tinychen777.com AAAA
常用的操作命令有:
# 对192.168.1.1进行压测,查询域名为文件query.domain.list的内容
queryperf -s 192.168.1.1 -d query.domain.list
# 对192.168.1.1的5353端口进行压测,查询域名为文件query.domain.list的内容
queryperf -s 192.168.1.1 -p 5353 -d query.domain.list
# 对192.168.1.1的5353端口进行压测,查询域名为文件query.domain.list的内容,压测压力为1000qps
queryperf -s 192.168.1.1 -p 5353 -d query.domain.list -T 1000
# 对192.168.1.1的5353端口进行压测,查询域名为文件query.domain.list的内容,压测压力为1000qps,每次查询超时时间为3s
queryperf -s 192.168.1.1 -p 5353 -d query.domain.list -T 1000 -t 3
2、压测数据
2.1 机器硬件配置
虚拟机为16核16G配置,宿主机为R730,配置是
双路E5-2640 v4
+82599万兆网卡
物理机为R640,配置是
双路银牌Silver 4114
+128G内存
+x710万兆万卡
这里需要额外提一下,CoreDNS比较吃网卡和CPU,对于硬盘IO的要求并不算特别高(主要取决于写日志的量),对内存占用较低
2.2 CoreDNS配置
CoreDNS配置的复杂程度会直接影响具体实例的性能表现,简单来说就是启用的插件越多,性能表现越差;比较影响性能表现的插件主要是日志相关的插件,如log插件开启全量日志记录,我们测试启用的插件主要有:log、errors、bind、reload、ready、prometheus、loadbalance、cache、acl、secondary、transfer、hosts、forward、import、file、kubernetes
。
2.3 数据汇总
机器配置 | CoreDNS配置 | 性能表现 |
---|---|---|
虚拟机 | 多插件配置+全量日志记录 | 30K qps |
物理机 | 多插件配置+全量日志记录 | 55K qps |
物理机 | 多插件配置+关闭log和error插件 | 70K qps |
物理机 | 最少插件配置 | 75K qps |
2.4 Q&A
-
虚拟机和物理机数据差距并不算特别大?
首先要明确:CoreDNS并没有完全吃满物理机上面的所有硬件配置,因此在物理机这里的性能表现瓶颈处于CoreDNS本身,而虚拟机的性能表现瓶颈才是硬件配置;
其次要知道:我们的虚拟机相互之间的影响比较严重,30K qps的性能表现是同宿主机上面的其他虚拟机基本处于摸鱼状态,由于宿主机资源超售严重,一旦其他虚拟机利用率过高,必然会影响性能表现;而使用物理机则不用担心这类问题;
-
log插件对性能的影响?
log插件对性能的影响确实较大,但是仅限于全量写入查询日志的时候,如果对普通的查询日志的需求低于性能需求,可以考虑只配置部分特殊类型日志,如只记录错误日志
log denial error
;还有些同学可能会担心日志落盘速度慢是否会影响查询响应速度,实测在使用rsyslog记录日志的时候,所有查询请求均响应完之后一段时候内,rsyslog还在落盘相关日志,因此可以确定逻辑上并非是必须要等日志落盘结束后才响应请求;
-
Prometheus插件采集到的数据和queryperf的数据不一致?
如果压测的时间太短(几秒到几分钟不等),会导致高峰时间持续太短而Prometheus插件无法准确暴露数据,同时还要考虑Prometheus服务端的采集频率已经Grafana面板的显示设置等;最好的方式是进行一段时间较长的压测,如三十分钟以上;