# dnspick：一句话选出最适合你的 DNS 服务器

> dnspick 是一个跨平台 DNS 性能基准测试工具，支持 UDP、DoT、DoH、DoH3 四种协议，自动检测当前系统 DNS 并给出推荐。本文提供详细的安装教程与使用指南。

- Canonical: https://www.zeroxin.xin/2026/07/26/dnspick%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/
- Published: 2026-07-26T11:30:00+08:00
- Updated: 2026-07-26T11:27:50+08:00
- Categories: 开源项目
- Tags: 开源项目, 网络工具, DNS, Go, 命令行

## 项目概述

**dnspick** 是由开发者 [palemoky](https://github.com/palemoky/dnspick) 创建的一个跨平台命令行 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

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

#### Windows（PowerShell）

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

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

### 手动安装

你也可以从 [GitHub Releases](https://github.com/palemoky/dnspick/releases) 页面下载预编译版本。

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

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

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

# Windows（PowerShell，以管理员权限运行）
Move-Item dnspick.exe C:\Windows\System32\
```

### 更新 dnspick

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

```bash
dnspick update
```

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

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

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

```bash
# 推荐：解除下载隔离标记（一行搞定）
xattr -dr com.apple.quarantine ./dnspick
```

- **图形界面方式**：在访达中右键点击 → 选择「打开」→ 弹窗中再次确认「打开」
- **较新 macOS**：双击运行一次（会被拦截），然后到 **系统设置 → 隐私与安全性**，点击底部「仍要打开」

---

## 快速开始

直接运行即可开始测试：

```bash
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%
```

---

## 高级用法

### 自定义测试参数

```bash
# 查看所有可用参数
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` | `-q` | `3` | 每个域名的查询次数 |
| `--timeout` | `-t` | `2s` | 单次查询超时 |
| `--concurrency` | `-c` | `16` | 同时测试的服务器数量上限 |
| `--no-system-dns` | | `false` | 不检测系统默认 DNS |
| `--lang` | | `$LANG` | 界面语言：`en` 或 `zh` |
| `--json` | | `false` | 输出 JSON 到 stdout（不显示进度界面） |

### JSON 输出（用于自动化）

```bash
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](https://github.com/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](https://github.com/palemoky/dnspick)

