项目概述

dnspick 是由开发者 palemoky 创建的一个跨平台命令行 DNS 性能测试工具。它并发基准测试一批主流及自定义 DNS 服务器,涵盖 UDP、DNS-over-TLS (DoT)、DNS-over-HTTPS (DoH) 和 DNS-over-HTTP/3 (DoH3) 四种协议,对一组常用的国内/国外域名反复查询,结合平均延迟与成功率给出综合评分,同时自动检测当前系统默认 DNS 并纳入对比,最后推荐最优选择。

项目亮点

  • 🌐 跨平台:完美运行于 Windows、macOS、Linux、Raspberry Pi (ARM/ARM64) 等主流平台
  • 🔒 多协议:同时测试 UDP、DoT、DoH(RFC 8484)、DoH3(基于 QUIC)
  • 📊 综合评分:不仅测速,还结合成功率智能打分,避免"虽快但不稳定"的 DNS 跻身前列
  • 🔍 自动检测当前 DNS:自动探测系统默认 DNS 并参与对比,给出是否需要切换的建议
  • 🔄 自更新:运行时自动检查新版本,交互式终端中可原地升级
  • 🌏 中英双语界面:默认跟随系统 LANG,支持手动切换

安装教程

一键安装(推荐)

脚本会自动检测操作系统与 CPU 架构,下载对应版本并安装到 PATH。

Linux / macOS

curl -fsSL https://raw.githubusercontent.com/palemoky/dnspick/main/install.sh | sh

Windows(PowerShell)

irm https://raw.githubusercontent.com/palemoky/dnspick/main/install.ps1 | iex

💡 macOS 用户无需手动处理 Gatekeeper 拦截,脚本会自动解除隔离标记。

手动安装

你也可以从 GitHub Releases 页面下载预编译版本。

  1. 前往最新 Release 页面。
  2. 根据你的操作系统和 CPU 架构下载对应压缩包(如 dnspick-windows-amd64.zip、dnspick-linux-arm64.tar.gz)。
  3. 解压后即可在终端中使用。

建议将可执行文件移动到系统 PATH 包含的目录中:

# Linux / macOS
sudo mv dnspick /usr/local/bin/

# Windows(PowerShell,以管理员权限运行)
Move-Item dnspick.exe C:\Windows\System32\

更新 dnspick

随时原地升级到最新版本:

dnspick update

dnspick 运行时会在后台检查新版本。在交互式终端中发现新版本会自动原地更新;输出被管道接管或在 CI 中则只打印提示(不会自我修改)。该检查不阻塞主流程,离线时静默跳过。

macOS 提示「已损坏 / 移动到垃圾桶」

由于 dnspick 未经过 Apple 付费公证,macOS Gatekeeper 会拦截从网络下载的程序,出现「无法验证开发者」「已损坏,应移到废纸篓」等提示。文件并非真正损坏,任选以下方式解除即可:

# 推荐:解除下载隔离标记(一行搞定)
xattr -dr com.apple.quarantine ./dnspick
  • 图形界面方式:在访达中右键点击 → 选择「打开」→ 弹窗中再次确认「打开」
  • 较新 macOS:双击运行一次(会被拦截),然后到 系统设置 → 隐私与安全性,点击底部「仍要打开」

快速开始

直接运行即可开始测试:

dnspick

输出示例:

dnspick: benchmarking 33 DNS servers against 20 domains...

Progress: 45% (594/1320)
┌──────────────┬────────┬────────────────┬────────┐
│   Domestic   │ Status │    Foreign     │ Status │
├──────────────┼────────┼────────────────┼────────┤
│ baidu.com    │ ✔      │ google.com     │ ✔      │
│ qq.com       │ ✔      │ youtube.com    │ 60%    │
│ taobao.com   │ 60%    │ github.com     │ -      │
└──────────────┴────────┴────────────────┴────────┘

--- Benchmark Results ---
┌────┬───────────────────────┬─────────────────┬─────────────┬────────────────┬────────┐
│ #  │      DNS Server       │     Address     │ Avg Latency │  Success Rate  │ Score  │
├────┼───────────────────────┼─────────────────┼─────────────┼────────────────┼────────┤
│ 1  │ Freenom 2 (UDP)       │ 80.80.81.81     │ 6.16ms      │ 100.0% (40/40) │ 162.33 │
│ 2  │ Cloudflare 2 (UDP)    │ 1.0.0.1         │ 6.227ms     │ 100.0% (40/40) │ 160.58 │
│ 3  │ DNSPod 1 (UDP)        │ 119.28.28.28   │ 6.337ms     │ 100.0% (40/40) │ 157.80 │
└────┴───────────────────────┴─────────────────┴─────────────┴────────────────┴────────┘

--- Top 3 Recommendations ---
#1: Freenom 2 (UDP) (80.80.81.81)
    Score: 162.33, avg latency: 6.16ms, success rate: 100.0%
#2: Cloudflare 2 (UDP) (1.0.0.1)
    Score: 160.58, avg latency: 6.227ms, success rate: 100.0%
#3: DNSPod 1 (UDP) (119.28.28.28)
    Score: 157.80, avg latency: 6.337ms, success rate: 100.0%

高级用法

自定义测试参数

# 查看所有可用参数
dnspick --help

# 每个域名查询 5 次,使用自定义域名列表
dnspick -q 5 -d "google.com,github.com,youtube.com"

# 单次查询超时 1 秒,并发数降到 8
dnspick -t 1s -c 8

# 强制使用英文界面
dnspick --lang en

# 输出机器可读 JSON(适合脚本和 CI)
dnspick --json | jq '.recommendation.top'
参数简写默认值描述
--domains-d内置列表自定义测试域名(逗号分隔,自动去重)
--servers-s内置列表自定义 DNS 服务器(协议按 scheme 自动推断:1.1.1.1 → UDP,tls://host → DoT,https://host/dns-query → DoH,h3://host/dns-query → DoH3)
--queries-q3每个域名的查询次数
--timeout-t2s单次查询超时
--concurrency-c16同时测试的服务器数量上限
--no-system-dnsfalse不检测系统默认 DNS
--lang$LANG界面语言:en 或 zh
--jsonfalse输出 JSON 到 stdout(不显示进度界面)

JSON 输出(用于自动化)

dnspick --json | jq '.recommendation.top'

JSON 输出的关键字段:

字段描述
results[]所有被测服务器,按综合评分降序排列
results[].avg_latency_ms平均延迟(毫秒,微秒精度)
results[].success_rate成功率,范围 0.0–1.0
recommendation.top[]成功率超过 98% 的 Top 3 推荐
recommendation.system_dns.verdictbest(已最优)/ good_enough(无需更换)/ switch(建议切换)/ all_failed(全部失败)

综合评分计算方式

综合评分 = (1 / 平均延迟秒数) × 成功率²

  • 延迟项 1 / 平均延迟:延迟越低,分数越高,呈反比放大
  • 可靠性权重 成功率²:成功率做平方惩罚,对丢包/超时非常敏感。100% 成功率乘以 1.0,90% 只剩 0.81,50% 直接砍到 0.25

这样可以避免"延迟很低但偶尔解析失败"的 DNS 排到前面。


技术细节

  • 语言: Go 1.21+
  • 许可证: MIT License
  • 构建: GitHub Actions 跨平台自动构建,支持 Windows、macOS、Linux(含 ARM/ARM64)
  • 当前版本: 持续更新中,266+ GitHub 星标
  • 仓库: palemoky/dnspick

适用场景

  • 🏠 家庭用户:检测 ISP 提供的 DNS 是否足够快,探索更快的公共 DNS
  • 🏢 网络管理员:批量评估不同 DNS 解析器的性能,为企业网络选型
  • 📊 开发者:在 CI/CD 中集成 DNS 性能监控,确保解析质量
  • 🌍 跨境访问优化:对比国内外 DNS 对不同域名的解析延迟,找到最优搭配

总结

dnspick 是一个轻量但功能完整的 DNS 性能测试工具,支持四种主流 DNS 协议(UDP、DoT、DoH、DoH3),提供智能综合评分和自动当前 DNS 检测。其一键安装脚本大大降低了使用门槛,macOS 用户也不必担心 Gatekeeper 拦截(脚本自动处理)。如果你正在寻找一款能帮你选出最优 DNS 的工具,dnspick 值得一试。

项目地址: https://github.com/palemoky/dnspick