当前位置: 首页 > article >正文

CoreDNS实战(九)-性能压测

本文主要用于介绍如何编译安装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 数据汇总

机器配置机器配置性能表现
虚拟机多插件配置+全量日志记录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面板的显示设置等;最好的方式是进行一段时间较长的压测,如三十分钟以上;

http://www.kler.cn/a/158588.html

相关文章:

  • MongoDB聚合操作
  • 【Apache Paimon】-- 2 -- 核心特性 (0.9.0)
  • DataOps for LLM 的数据工程技术架构实践
  • 计算机网络-MSTP基础实验一(单域多实例)
  • Java通过calcite实时读取kafka中的数据
  • python+Django+MySQL+echarts+bootstrap制作的教学质量评价系统,包括学生、老师、管理员三种角色
  • vue.js怎么保证计算精度
  • AIGC: 关于ChatGPT中Function Call的调用
  • 2024年口碑比较好的猫罐头有哪些?2024年口碑比较好的猫罐头盘点
  • Python自动化办公:PDF文件的加密与解密
  • 【剑指offer|图解|位运算】训练计划VI+撞色搭配
  • Java的严格计算部分
  • 解决ant-design-vue中Select组件v-model值为空字符串不显示placeholder的bug
  • windows使用YOLOv8训练自己的模型(0基础保姆级教学)
  • 代码随想录二刷 | 栈与队列 | 用队列实现栈
  • 华容道问题求解第一部分_思路即方案设计
  • 掌握反转链表的艺术:LeetCode 206 深入解析与优化 - 双指针与递归方法精讲
  • 关于队列的简单理解
  • JS--异步的日常用法
  • 在vscode下将ipynb文件转成markdown(.md文件)的方法
  • 12.4 C++ 作业
  • 【win32_003】不同字符集下的通用字符串语法TCHAR、TEXT、PTSTR、PCTSTR
  • 有趣的代码——有故事背景的程序设计3
  • 驱动模块--内核模块
  • Qt 布局讲解及举例
  • 打破界限:SQL数据库水平扩展的8大挑战与机遇