本文目录导读:

dnsperf 是 Nominum(现属 Akamai)开发的一款非常流行的 DNS 性能测试工具,用于测量 DNS 服务器处理查询的能力(通常以 每秒查询数 QPS 为单位)。
以下是使用 dnsperf 测试 DNS 性能的完整指南,包括安装、基本用法、参数详解和结果解读。
安装
dnsperf 通常在 Linux 环境下运行,它依赖 openssl 和 ldns 库。
-
Ubuntu/Debian:
sudo apt update sudo apt install dnsperf
-
CentOS/RHEL/Fedora:
sudo yum install epel-release # 如果尚未安装 EPEL sudo yum install dnsperf
-
从源码编译: 如果需要最新版本或特定平台,可以从 GitHub 编译:
git clone https://github.com/DNS-OARC/dnsperf.git cd dnsperf ./configure make sudo make install
基本用法
dnsperf 的核心原理是:读取一个查询文件(包含要查询的域名和记录类型),然后以指定的速率或最大并发数向目标 DNS 服务器发送查询。
最简单的测试命令
dnsperf -s 8.8.8.8 -d queryfile.txt -l 30
-s:目标 DNS 服务器 IP(可以是多个,用逗号分隔)。-d:包含查询内容的文件路径。-l:测试持续时间(秒)。
在执行之前,我们需要先准备一个查询文件。
准备查询文件 (queryfile.txt)
这是 dnsperf 的核心输入,文件格式非常简单:每行一个查询,格式为 域名 记录类型。
示例 queryfile.txt
www.example.com A
mail.example.com A
example.com MX
example.com NS
www.google.com AAAA
生成大文件的技巧:
- 手动编写(适合少量测试)。
- 使用脚本从现有日志中提取域名。
- 使用工具生成随机域名(确保不命中本地缓存,避免测试结果虚高)。
关键参数详解
dnsperf 提供了丰富的参数来控制压力测试的行为:
| 参数 | 功能描述 | 示例 |
|---|---|---|
-s |
指定目标 DNS 服务器 IP(可重复使用) | -s 192.168.1.1 -s 8.8.8.8 |
-d |
指定查询文件 | -d queries.txt |
-l |
测试持续时间(秒) | -l 60 |
-c |
并发连接数(重要) | -c 100 |
-Q |
最大每秒查询数 QPS 限制 | -Q 5000 |
-t |
查询超时时间(秒,默认 5) | -t 3 |
-S |
统计输出间隔(秒,默认 1) | -S 5 |
-p |
目标 DNS 服务端口(默认 53) | -p 5353 |
-4 / -6 |
强制使用 IPv4 或 IPv6 | -4 |
-v |
显示详细输出(每条查询结果) | -v |
-y |
用于 TSIG 签名的密钥 | -y hmac-sha256:keyname:base64key |
-D |
启用 DNS 子网选项(EDNS Client Subnet) | -D |
-r |
使用 DoT (DNS over TLS) | -r -s 1.1.1.1 |
典型测试场景与命令
场景 1:极限性能测试(高并发)
模拟大量用户同时查询,测试服务器的最大承载能力。
dnsperf -s 10.0.0.1 -d queryfile.txt -l 30 -c 500 -q 100
-c 500: 设置 500 个并发连接。-q 100: 每个连接最大未完成查询数 100(总并发 = c * q),这个组合会产生 50,000 个并发查询。
场景 2:稳定性测试(长时间运行)
测试服务器在持续负载下是否稳定,有无内存泄漏。
dnsperf -s 10.0.0.1 -d queryfile.txt -l 3600 -c 200 -Q 10000
-Q 10000: 将每秒查询速率限制在 10,000 QPS,防止客户端施压过大。
场景 3:对比测试(多台服务器)
比较两台服务器的性能。
dnsperf -s 10.0.0.1 -d queryfile.txt -l 20 -c 100 dnsperf -s 10.0.0.2 -d queryfile.txt -l 20 -c 100
场景 4:模拟特定查询类型(如 DNSSEC、ECS)
# 测试 DNSSEC 性能(在查询文件中添加 DNSKEY 或 DS 记录类型查询) # 测试带 ECS 的负载 dnsperf -s 10.0.0.1 -d queries_with_ecs.txt -D
结果解读
测试结束后,dnsperf 会输出一个统计报告,以下是典型的输出示例和解读:
Statistics:
Queries sent: 250000
Queries completed: 249850
Queries lost: 150 (0.06%) # 丢失率 <0.1% 通常算优秀
Response codes: NOERROR 249850 (100.00%)
Average packet size: request 38, response 132
Run time (s): 30.001394
Queries per second: **8328.03** (QPS) # 核心指标:每秒请求数
Average Latency (s): **0.060121** (60毫秒) # 核心指标:平均响应时间
Latency StdDev (s): **0.012234** # 标准差越小,延迟越稳定
关键指标:
- Queries per second (QPS):越高越好,代表吞吐量。
- Average Latency:平均响应延迟,越低越好(通常在毫秒级)。
- Queries lost:丢包率,如果在高并发下丢包急剧增加,说明服务器达到瓶颈或配置不足以处理负载。
- Latency StdDev:延迟抖动,如果很大,说明服务器在处理不同请求时表现不稳定(可能是队列延迟、缓存未命中或资源争用导致)。
高级技巧与注意事项
-
客户端性能也是瓶颈:
- 当你使用
dnsperf从一台机器发送大量并发请求时,客户端的网络栈、CPU、内存也会成为瓶颈。 - 如果测试结果 QPS 突然上不去(例如卡在 10 万 QPS),检查一下客户端的
/etc/sysctl.conf中的网络参数(如net.ipv4.ip_local_port_range、net.core.somaxconn),通常需要调大临时端口范围。 - 建议使用多台
dnsperf客户端来对单一服务端施压,以获得极限值。
- 当你使用
-
缓存效应:
- 如果查询文件中的域名重复率很高,DNS 服务器会从缓存回复,导致测试结果虚高(因为缓存比递归查询快得多)。
- 真实性能测试应使用大量唯一域名,或通过
-T参数(随机化顺序)以及增加域名池大小来避免缓存。
-
避免测试工具自身影响:
- 不要用
dnsperf测试 DNS 服务器所在的同一台机器,网络延迟测试会不准确。 - 如果测试 DoT/DoH,
dnsperf需要单独编译支持,且性能受 TLS 握手中 socket 创建速率影响较大,可能需要调整-c和-q的值。
- 不要用
-
测试 DoT (DNS over TLS):
dnsperf -s 1.1.1.1 -d queryfile.txt -l 10 -c 10 -r
-
测试 DoH (DNS over HTTPS):
dnsperf原生不支持 DoH,需要使用其他工具(如dnsperf的变体doth或dns-over-https专用工具)。
一个标准的测试流程是:
- 准备一个包含 10 万行以上 唯一域名 的查询文件。
- 使用中等并发数(如
-c 100 -q 50)进行探测,找到服务器能稳定处理的最大 QPS。 - 使用极限并发数(如
-c 500 -q 100)发送负载,观察延迟和丢包率,判断服务器瓶颈值。 - 重点查看 QPS、平均延迟 和 丢包率 这三个核心指标。
标签: DNS性能测试