性能与基准
本文档收纳 README 中移出的性能说明,并按版本保留公开基准快照。目标不是宣称绝对胜负,而是展示 ForgeDNS 在不同策略复杂度、并发水平和传输路径下的性能轮廓。
性能关注点
ForgeDNS 关注的不是“最简单场景下的极限数字”,而是下面这些更接近真实部署的问题:
- 开启缓存、规则、回退、重写后,热路径是否仍然可控
- 多上游并发竞争时,整体时延是否可接受
- 新增协议和插件后,结构是否还能继续优化
- 系统联动和观测逻辑是否会拖慢主响应路径
指标说明
QPS越高越好- 平均延迟与抖动(latency stddev)越低越好
run_dnsperf_compare.sh更适合看中高并发吞吐与排队效应run_dnsperf_latency_compare.sh更适合看低并发延迟,固定clients == outstanding- 这两组快照更适合分别观察 ForgeDNS 相对 mosdns 的优势分布
- 由于 2026-04-13 的 compare pack 已更新场景目录、查询集和部分 workload 口径,
v0.1.0与v0.3.0的绝对数字不建议直接做版本回归比较
说明:
- 绿色 表示 ForgeDNS 在该指标上更优
- 红色 表示 mosdns 在该指标上更优
- 中性色 表示差距较小,仅用于辅助阅读,不代表统计显著性
v0.3.0
高并发吞吐与平均延迟
测试环境:
- 时间:2026-04-13
- 系统:Linux
6.8.12-2-pvex86_64 - 选择器:
core - 对比版本:ForgeDNS
v0.3.0,mosdnsv5.3.4-0-gb732318
压测参数:
- 工具:
dnsperf warmup_seconds=2bench_seconds=8bench_repeats=3dnsperf_clients=32dnsperf_threads=4dnsperf_outstanding=1024dnsperf_max_qps=unlimited
结果阅读方式:
baseline UDP forward、concurrent upstreams、dual-entry UDP/TCP这类带上游转发或上游竞争的场景,主要反映的是端到端体验,结果会明显受到上游链路时延、上游响应稳定性和竞争策略影响,不应简单理解为“本地处理开销谁更小”cache hotpath、local answers、server local UDP/TCP更接近本地处理成本domain set、composite provider chain更适合看复杂规则、数据集和插件组合下的表现
下表展示按 repeat 聚合后的中位数:
| 场景 | ForgeDNS QPS | mosdns QPS | QPS 对比 | ForgeDNS 平均延迟 | mosdns 平均延迟 |
|---|---|---|---|---|---|
| baseline UDP forward | 35,498.1 | 36,883.2 | -3.8% | 7.735 ms | 11.244 ms |
| cache hotpath | 139,133.9 | 134,881.6 | +3.1% | 0.637 ms | 0.721 ms |
| dual-entry UDP | 35,800.9 | 35,382.3 | +1.2% | 7.092 ms | 10.170 ms |
| dual-entry TCP | 37,295.1 | 37,221.2 | +0.2% | 24.646 ms | 25.083 ms |
| concurrent upstreams | 21,038.7 | 13,319.4 | +58.0% | 10.404 ms | 20.601 ms |
| local answers | 126,268.4 | 149,119.6 | -15.3% | 0.783 ms | 0.639 ms |
| domain set | 165,647.7 | 36,383.7 | +355.3% | 0.549 ms | 4.078 ms |
| ip set | 133,355.1 | 150,756.7 | -11.5% | 0.740 ms | 0.637 ms |
| composite provider chain | 158,693.6 | 25,972.4 | +511.0% | 0.532 ms | 6.251 ms |
低并发延迟扫图
测试环境:
- 时间:2026-04-13
- 系统:Linux
6.8.12-2-pvex86_64 - 选择器:
latency-core - 对比版本:ForgeDNS
v0.3.0,mosdnsv5.3.4-0-gb732318
压测参数:
- 工具:
dnsperf warmup_seconds=1bench_seconds=5bench_repeats=3latency_client_levels=1 2 4dnsperf_threads=1dnsperf_timeout=5dnsperf_outstanding=matches_client_count
下面三张表优先展示平均延迟与抖动,QPS 只作为辅助校验指标。颜色沿用上面的规则:延迟或抖动更低的一侧为绿色,更高的一侧为红色,持平时使用中性色。
clients=1, outstanding=1
| 场景 | ForgeDNS 平均延迟 | mosdns 平均延迟 | 延迟对比 | ForgeDNS 抖动 | mosdns 抖动 | 抖动对比 |
|---|---|---|---|---|---|---|
| baseline UDP forward | 6.716 ms | 5.708 ms | +17.66% | 0.170 ms | 1.140 ms | -85.09% |
| cache hotpath | 0.029 ms | 0.031 ms | -6.45% | 0.017 ms | 0.021 ms | -19.05% |
| dual-entry UDP | 5.949 ms | 6.394 ms | -6.96% | 0.426 ms | 2.364 ms | -81.98% |
| dual-entry TCP | 5.984 ms | 6.118 ms | -2.19% | 0.380 ms | 0.829 ms | -54.16% |
| local answers | 0.026 ms | 0.029 ms | -10.34% | 0.016 ms | 0.019 ms | -15.79% |
| domain set | 0.025 ms | 0.108 ms | -76.85% | 0.011 ms | 0.095 ms | -88.42% |
| composite provider chain | 0.025 ms | 0.156 ms | -83.97% | 0.012 ms | 0.129 ms | -90.70% |
| server local UDP | 0.025 ms | 0.027 ms | -7.41% | 0.013 ms | 0.013 ms | +0.00% |
| server local TCP | 0.027 ms | 0.030 ms | -10.00% | 0.009 ms | 0.018 ms | -50.00% |
clients=2, outstanding=2
| 场景 | ForgeDNS 平均延迟 | mosdns 平均延迟 | 延迟对比 | ForgeDNS 抖动 | mosdns 抖动 | 抖动对比 |
|---|---|---|---|---|---|---|
| baseline UDP forward | 6.001 ms | 7.382 ms | -18.71% | 0.262 ms | 0.858 ms | -69.46% |
| cache hotpath | 0.033 ms | 0.037 ms | -10.81% | 0.050 ms | 0.053 ms | -5.66% |
| dual-entry UDP | 6.408 ms | 5.923 ms | +8.19% | 1.247 ms | 0.488 ms | +155.53% |
| dual-entry TCP | 5.651 ms | 5.633 ms | +0.32% | 0.417 ms | 0.518 ms | -19.50% |
| local answers | 0.040 ms | 0.031 ms | +29.03% | 0.021 ms | 0.018 ms | +16.67% |
| domain set | 0.029 ms | 0.111 ms | -73.87% | 0.013 ms | 0.104 ms | -87.50% |
| composite provider chain | 0.029 ms | 0.165 ms | -82.42% | 0.014 ms | 0.141 ms | -90.07% |
| server local UDP | 0.030 ms | 0.029 ms | +3.45% | 0.016 ms | 0.016 ms | +0.00% |
| server local TCP | 0.028 ms | 0.030 ms | -6.67% | 0.014 ms | 0.015 ms | -6.67% |
clients=4, outstanding=4
| 场景 | ForgeDNS 平均延迟 | mosdns 平均延迟 | 延迟对比 | ForgeDNS 抖动 | mosdns 抖动 | 抖动对比 |
|---|---|---|---|---|---|---|
| baseline UDP forward | 5.977 ms | 5.910 ms | +1.13% | 0.355 ms | 2.700 ms | -86.85% |
| cache hotpath | 0.044 ms | 0.060 ms | -26.67% | 0.028 ms | 0.063 ms | -55.56% |
| dual-entry UDP | 6.637 ms | 5.426 ms | +22.32% | 25.556 ms | 0.435 ms | +5774.94% |
| dual-entry TCP | 6.451 ms | 6.941 ms | -7.06% | 4.422 ms | 26.437 ms | -83.27% |
| local answers | 0.056 ms | 0.040 ms | +40.00% | 0.030 ms | 0.025 ms | +20.00% |
| domain set | 0.034 ms | 0.155 ms | -78.06% | 0.016 ms | 0.141 ms | -88.65% |
| composite provider chain | 0.034 ms | 0.221 ms | -84.62% | 0.015 ms | 0.172 ms | -91.28% |
| server local UDP | 0.042 ms | 0.038 ms | +10.53% | 0.024 ms | 0.024 ms | +0.00% |
| server local TCP | 0.042 ms | 0.039 ms | +7.69% | 0.026 ms | 0.022 ms | +18.18% |
v0.3.0 结果分析
- 如果你的策略依赖复杂规则集、多数据集匹配,或者经常做多上游并发竞争,
v0.3.0下 ForgeDNS 的整体表现更有优势;domain set、composite provider chain和concurrent upstreams都明显领先。 cache hotpath这一轮已经转为小幅领先,说明在缓存命中这类高频路径上,ForgeDNS 与 mosdns 的差距已经明显缩小。- 本地应答场景下,ForgeDNS 与 mosdns 的差距已经不大;响应侧
ip set过滤的结果也更多是在受本地应答路径性能上限影响,而不是一条完全独立的短板。 - 对于
forward、dual-entry、concurrent upstreams这类场景,应把结果理解为端到端代理体验,其中上游链路延迟和上游响应稳定性是主要因素,而不是单纯的本地实现差异。 - 低并发延迟扫图里,
domain set、composite provider chain、cache hotpath和server local TCP的延迟和抖动都更稳定;dual-entry UDP在clients=4时抖动明显偏高,说明这个场景的稳定性还需要继续观察。
v0.1.0
下面保留 2026-03-26 公开结果,作为 v0.1.0 历史快照。
高并发吞吐与平均延迟
测试环境:
- CPU:Intel N100,4 核
- 内存:1 GB
- 环境:PVE 虚拟机内的 LXC
- 系统:Linux
6.8.12-2-pvex86_64 - 时间:2026-03-26
- 被测版本:
forgedns v0.1.0,mosdnsv5.3.4-0-gb732318
压测参数:
- 工具:
dnsperf warmup_seconds=2bench_seconds=8bench_repeats=3dnsperf_clients=32dnsperf_threads=4dnsperf_outstanding=1024dnsperf_max_qps=unlimited
下表为每个场景 3 次测试平均值:
| 场景 | ForgeDNS QPS | mosdns QPS | QPS 对比 | ForgeDNS 平均延迟 | mosdns 平均延迟 |
|---|---|---|---|---|---|
| baseline UDP forward | 37,789.6 | 37,269.2 | +1.4% | 9.142 ms | 12.312 ms |
| cache hotpath | 131,982.3 | 133,380.3 | -1.0% | 1.235 ms | 0.696 ms |
| dual-entry UDP | 39,614.4 | 34,356.8 | +15.3% | 8.946 ms | 10.009 ms |
| dual-entry TCP | 36,257.9 | 35,975.4 | +0.8% | 25.403 ms | 25.577 ms |
| concurrent upstreams | 21,694.8 | 13,195.4 | +64.4% | 15.065 ms | 23.790 ms |
| fallback standby | 22,259.9 | 23,223.9 | -4.2% | 16.376 ms | 10.616 ms |
| local answers | 132,286.6 | 146,754.3 | -9.9% | 1.250 ms | 0.636 ms |
| DoH upstream (HTTP/2) | 29,781.6 | 25,835.7 | +15.3% | 13.363 ms | 11.445 ms |
| domain set | 172,061.7 | 35,966.1 | +378.4% | 0.901 ms | 4.210 ms |
| ip set | 134,257.4 | 150,923.0 | -11.0% | 1.227 ms | 0.625 ms |
| sequence base | 131,995.6 | 150,301.5 | -12.2% | 1.265 ms | 0.622 ms |
| match true | 135,326.0 | 153,289.5 | -11.7% | 1.217 ms | 0.629 ms |
| match false | 136,740.1 | 152,297.5 | -10.2% | 1.201 ms | 0.630 ms |
| match qname | 132,289.4 | 152,203.6 | -13.1% | 1.248 ms | 0.638 ms |
v0.1.0 当时的结论
- ForgeDNS 在多上游并发、DoH 上游、双入口 UDP 和大规模
domain_set场景下更有优势 - mosdns 在缓存命中、本地应答、基础
sequence和轻量 matcher 场景下目前仍然更快 fallback standby这类链路还有继续优化空间