CoreDNS篇7-性能压测

本文最后更新于:February 21, 2022 am

本文主要用于介绍如何编译安装queryperf来对DNS服务器进行压测,以及CoreDNS常见的几种配置下的压测性能表现。

1、queryperf

1.1 编译安装

queryperf是bind9出品的一款测试dns服务器性能的工具,目前在9.12.4版本的bind源码中还存在,再往后的新版本就没看到有queryperf了。

1
2
3
4
5
6
7
$ wget https://ftp.isc.org/isc/bind9/9.12.4/bind-9.12.4.tar.gz
$ tar -zxvf bind-9.12.4.tar.gz
$ cd bind-9.12.4/contrib/queryperf
$ ./configure
$ make
$ 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 常用操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 将编译好的二进制文件直接复制到系统的bin目录中即可全局操作
$ cp queryperf /usr/local/bin/


$ 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

在压测之前需要我们自己准备压测的测试数据,格式为域名 查询类型,如:

1
2
3
4
5
tinychen.com A
tiny777.com A
tinychen.com MX
tiny777.com MX
tinychen777.com AAAA

常用的操作命令有:

1
2
3
4
5
6
7
8
9
10
11
# 对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

  1. 虚拟机和物理机数据差距并不算特别大?

    首先要明确:CoreDNS并没有完全吃满物理机上面的所有硬件配置,因此在物理机这里的性能表现瓶颈处于CoreDNS本身,而虚拟机的性能表现瓶颈才是硬件配置;

    其次要知道:我们的虚拟机相互之间的影响比较严重,30K qps的性能表现是同宿主机上面的其他虚拟机基本处于摸鱼状态,由于宿主机资源超售严重,一旦其他虚拟机利用率过高,必然会影响性能表现;而使用物理机则不用担心这类问题;

  2. log插件对性能的影响?

    log插件对性能的影响确实较大,但是仅限于全量写入查询日志的时候,如果对普通的查询日志的需求低于性能需求,可以考虑只配置部分特殊类型日志,如只记录错误日志log denial error

    还有些同学可能会担心日志落盘速度慢是否会影响查询响应速度,实测在使用rsyslog记录日志的时候,所有查询请求均响应完之后一段时候内,rsyslog还在落盘相关日志,因此可以确定逻辑上并非是必须要等日志落盘结束后才响应请求;

  3. Prometheus插件采集到的数据和queryperf的数据不一致?

    如果压测的时间太短(几秒到几分钟不等),会导致高峰时间持续太短而Prometheus插件无法准确暴露数据,同时还要考虑Prometheus服务端的采集频率已经Grafana面板的显示设置等;最好的方式是进行一段时间较长的压测,如三十分钟以上;