项目概述
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
1 | curl -fsSL https://raw.githubusercontent.com/palemoky/dnspick/main/install.sh | sh |
Windows(PowerShell)
1 | irm https://raw.githubusercontent.com/palemoky/dnspick/main/install.ps1 | iex |
💡 macOS 用户无需手动处理 Gatekeeper 拦截,脚本会自动解除隔离标记。
手动安装
你也可以从 GitHub Releases 页面下载预编译版本。
- 前往最新 Release 页面。
- 根据你的操作系统和 CPU 架构下载对应压缩包(如
dnspick-windows-amd64.zip、dnspick-linux-arm64.tar.gz)。 - 解压后即可在终端中使用。
建议将可执行文件移动到系统 PATH 包含的目录中:
1 | # Linux / macOS |
更新 dnspick
随时原地升级到最新版本:
1 | dnspick update |
dnspick 运行时会在后台检查新版本。在交互式终端中发现新版本会自动原地更新;输出被管道接管或在 CI 中则只打印提示(不会自我修改)。该检查不阻塞主流程,离线时静默跳过。
macOS 提示「已损坏 / 移动到垃圾桶」
由于 dnspick 未经过 Apple 付费公证,macOS Gatekeeper 会拦截从网络下载的程序,出现「无法验证开发者」「已损坏,应移到废纸篓」等提示。文件并非真正损坏,任选以下方式解除即可:
1 | # 推荐:解除下载隔离标记(一行搞定) |
- 图形界面方式:在访达中右键点击 → 选择「打开」→ 弹窗中再次确认「打开」
- 较新 macOS:双击运行一次(会被拦截),然后到 系统设置 → 隐私与安全性,点击底部「仍要打开」
快速开始
直接运行即可开始测试:
1 | dnspick |
输出示例:
1 | dnspick: benchmarking 33 DNS servers against 20 domains... |
高级用法
自定义测试参数
1 | # 查看所有可用参数 |
| 参数 | 简写 | 默认值 | 描述 |
|---|---|---|---|
--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 | -q | 3 | 每个域名的查询次数 |
--timeout | -t | 2s | 单次查询超时 |
--concurrency | -c | 16 | 同时测试的服务器数量上限 |
--no-system-dns | false | 不检测系统默认 DNS | |
--lang | $LANG | 界面语言:en 或 zh | |
--json | false | 输出 JSON 到 stdout(不显示进度界面) |
JSON 输出(用于自动化)
1 | 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.verdict | best(已最优)/ 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 值得一试。