This commit is contained in:
Alex Yang
2026-01-16 11:09:11 +08:00
parent 8159577be0
commit cdac4fcf43
284 changed files with 2813570 additions and 14 deletions

View File

@@ -0,0 +1,86 @@
# 优化DNS服务器parallel模式响应时间
## 问题分析
经过对代码的分析我发现parallel模式下响应时间过高的主要原因包括
1. **缺少超时机制**:当前实现会等待所有上游服务器响应,单个慢服务器会拖慢整个查询
2. **响应时间计算不合理**:使用所有响应的平均时间,而不是最快响应时间
3. **合并响应开销大**需要合并所有响应增加CPU和内存开销
4. **等待所有响应**:没有实现快速返回机制,即使收到第一个有效响应也会等待所有响应
5. **DNSSEC验证开销**每个响应都需要进行DNSSEC验证增加额外开销
## 优化方案
### 1. 添加超时机制
- 为每个上游服务器请求添加超时设置
- 超时时间可配置建议默认500ms
- 超时的请求不会影响整体响应时间
### 2. 实现快速返回机制
- 当收到第一个有效响应成功或NXDOMAIN立即返回给客户端
- 继续处理其他响应用于合并和缓存,但不影响当前查询的响应时间
- 优先返回带DNSSEC的响应
### 3. 优化响应时间计算
- 使用最快的响应时间作为查询的响应时间
- 保留平均响应时间用于统计,但不影响客户端感知的响应时间
### 4. 优化响应合并逻辑
- 只合并成功响应,忽略错误响应
- 合并时优先保留TTL较长的记录
- 减少不必要的内存分配和拷贝
### 5. 优化DNSSEC验证
- 只对需要返回的响应进行DNSSEC验证
- 缓存DNSSEC验证结果减少重复验证
### 6. 增加服务器健康检查
- 定期检查上游服务器的响应时间和可用性
- 只向健康的服务器发送请求
- 根据历史响应时间动态调整服务器权重
## 实现步骤
1. **修改forwardDNSRequestWithCache函数**
- 添加超时设置
- 实现快速返回逻辑
- 优化响应时间计算
2. **修改mergeResponses函数**
- 优化合并逻辑,减少开销
- 优先保留TTL较长的记录
3. **修改DNSSEC验证逻辑**
- 只对需要返回的响应进行验证
- 添加DNSSEC验证结果缓存
4. **添加服务器健康检查机制**
- 定期检查上游服务器
- 动态调整服务器列表
5. **添加配置选项**
- 超时时间配置
- 快速返回开关
- 健康检查配置
## 预期效果
- **响应时间显著降低**:客户端感知的响应时间将接近最快的上游服务器响应时间
- **资源利用率提高**:减少不必要的等待和计算
- **鲁棒性增强**:单个慢服务器不会影响整体性能
- **用户体验改善**更快的DNS解析速度
## 文件修改
- `/root/dns/dns/server.go`主要修改文件包含parallel模式的实现逻辑
- `/root/dns/config/config.go`:添加新的配置选项
- `/root/dns/dns/cache.go`如果需要添加DNSSEC验证结果缓存
## 测试计划
1. **性能测试**:比较优化前后的响应时间
2. **压力测试**:在高并发情况下测试性能
3. **可靠性测试**:测试单个服务器故障时的表现
4. **DNSSEC测试**确保DNSSEC验证仍然正常工作
5. **不同配置测试**:测试不同超时时间和服务器数量的影响