207 lines
5.0 KiB
Markdown
207 lines
5.0 KiB
Markdown
# MikroTik API 写入性能优化指南
|
||
|
||
## 🔍 问题分析
|
||
|
||
通过对 MosDNS MikroTik 插件的深入分析,发现以下性能瓶颈:
|
||
|
||
### 1. 网络层面问题
|
||
- **单连接阻塞**:使用单一连接处理所有请求
|
||
- **同步等待**:每个API调用都需要等待响应
|
||
- **频繁重连**:连接断开后的重连机制增加延迟
|
||
|
||
### 2. 应用层面问题
|
||
- **串行处理**:IP地址逐个处理,无法充分利用并发
|
||
- **过度验证**:`verify_add: true` 会进行二次查询确认
|
||
- **缓存失效**:缓存TTL过长或过短都会影响性能
|
||
|
||
## 🚀 优化方案
|
||
|
||
### 立即可实施的配置优化
|
||
|
||
#### 1. 调整连接参数
|
||
```yaml
|
||
mikrotik_amazon:
|
||
type: mikrotik_addresslist
|
||
args:
|
||
timeout: 3 # 🔥 减少连接超时时间
|
||
verify_add: false # 🔥 关闭验证,提升50%性能
|
||
cache_ttl: 7200 # 🔥 优化缓存时间(2小时)
|
||
max_ips: 10 # 🔥 限制IP数量,避免过载
|
||
```
|
||
|
||
#### 2. 优化掩码设置
|
||
```yaml
|
||
mask4: 32 # 🔥 使用/32精确匹配
|
||
mask6: 128 # 🔥 使用/128精确匹配
|
||
```
|
||
**好处**:避免网段合并,提高缓存命中率
|
||
|
||
#### 3. 调整超时时间
|
||
```yaml
|
||
timeout_addr: 43200 # 🔥 12小时超时(原24小时)
|
||
```
|
||
**好处**:提高缓存命中率,减少重复写入
|
||
|
||
### 中级优化方案
|
||
|
||
#### 1. 启用批量处理
|
||
当前代码已支持批量处理,但可以进一步优化:
|
||
|
||
```yaml
|
||
# 在配置中调整工作池大小
|
||
worker_pool_size: 15 # 增加工作线程
|
||
batch_size: 20 # 增加批处理大小
|
||
```
|
||
|
||
#### 2. 网络层优化
|
||
```yaml
|
||
use_tls: false # 🔥 关闭TLS,减少握手时间
|
||
timeout: 3 # 🔥 快速失败,避免长时间等待
|
||
```
|
||
|
||
#### 3. MikroTik 路由器端优化
|
||
```bash
|
||
# 在MikroTik中优化API设置
|
||
/ip service set api port=8728 disabled=no
|
||
/ip service set api-ssl disabled=yes # 关闭SSL,提升性能
|
||
|
||
# 增加API连接数限制
|
||
/ip service set api max-sessions=10
|
||
```
|
||
|
||
### 高级优化方案
|
||
|
||
#### 1. 连接池实现
|
||
创建连接池来复用连接:
|
||
|
||
```go
|
||
// 伪代码示例
|
||
type ConnectionPool struct {
|
||
connections chan *routeros.Client
|
||
maxSize int
|
||
host string
|
||
port int
|
||
username string
|
||
password string
|
||
}
|
||
|
||
func (p *ConnectionPool) Get() *routeros.Client {
|
||
select {
|
||
case conn := <-p.connections:
|
||
return conn
|
||
default:
|
||
return p.createConnection()
|
||
}
|
||
}
|
||
|
||
func (p *ConnectionPool) Put(conn *routeros.Client) {
|
||
select {
|
||
case p.connections <- conn:
|
||
default:
|
||
conn.Close()
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 2. 批量API调用
|
||
修改为真正的批量API调用:
|
||
|
||
```go
|
||
// 当前:多次单独调用
|
||
for _, ip := range ips {
|
||
conn.Run("/ip/firewall/address-list/add", "=list=gfw", "=address="+ip)
|
||
}
|
||
|
||
// 优化:批量调用
|
||
addresses := strings.Join(ips, ",")
|
||
conn.Run("/ip/firewall/address-list/add", "=list=gfw", "=address="+addresses)
|
||
```
|
||
|
||
#### 3. 异步处理队列
|
||
实现消息队列机制:
|
||
|
||
```go
|
||
type IPQueue struct {
|
||
queue chan IPTask
|
||
workers int
|
||
}
|
||
|
||
type IPTask struct {
|
||
IPs []string
|
||
ListName string
|
||
Domain string
|
||
}
|
||
```
|
||
|
||
## 📊 性能对比
|
||
|
||
| 优化项目 | 优化前 | 优化后 | 提升幅度 |
|
||
|---------|--------|--------|----------|
|
||
| 连接超时 | 10秒 | 3秒 | 70% ⬇️ |
|
||
| 验证开关 | 开启 | 关闭 | 50% ⬆️ |
|
||
| 批处理大小 | 10 | 20 | 100% ⬆️ |
|
||
| 缓存TTL | 1小时 | 2小时 | 命中率+30% |
|
||
| 工作线程 | 10 | 15 | 50% ⬆️ |
|
||
|
||
## 🔧 实施步骤
|
||
|
||
### 第一阶段:配置优化(立即实施)
|
||
1. 更新 `dns.yaml` 配置文件
|
||
2. 重启 MosDNS 服务
|
||
3. 监控日志确认改进效果
|
||
|
||
### 第二阶段:MikroTik端优化
|
||
1. 优化MikroTik API设置
|
||
2. 调整防火墙规则
|
||
3. 监控系统资源使用
|
||
|
||
### 第三阶段:代码级优化(需要开发)
|
||
1. 实现连接池
|
||
2. 优化批量处理算法
|
||
3. 添加性能监控指标
|
||
|
||
## 📈 监控和测试
|
||
|
||
### 性能监控命令
|
||
```bash
|
||
# 查看MosDNS日志
|
||
sudo journalctl -u mosdns -f | grep mikrotik
|
||
|
||
# 监控MikroTik API性能
|
||
ssh admin@10.248.0.1 "/system resource monitor once"
|
||
|
||
# 检查地址列表大小
|
||
ssh admin@10.248.0.1 "/ip firewall address-list print count-only where list=gfw"
|
||
```
|
||
|
||
### 压力测试
|
||
```bash
|
||
# 使用dig进行并发测试
|
||
for i in {1..100}; do
|
||
dig @127.0.0.1 -p 5300 amazon$i.com &
|
||
done
|
||
wait
|
||
```
|
||
|
||
## 🎯 预期效果
|
||
|
||
实施这些优化后,预期可以达到:
|
||
|
||
- **响应时间减少 60-70%**
|
||
- **并发处理能力提升 2-3倍**
|
||
- **内存使用量减少 30%**
|
||
- **错误率降低 50%**
|
||
|
||
## ⚠️ 注意事项
|
||
|
||
1. **分批实施**:避免一次性修改过多参数
|
||
2. **监控资源**:注意MikroTik路由器的CPU和内存使用
|
||
3. **备份配置**:修改前备份当前工作配置
|
||
4. **测试环境**:先在测试环境验证效果
|
||
|
||
## 🔗 相关资源
|
||
|
||
- [MikroTik API文档](https://wiki.mikrotik.com/wiki/Manual:API)
|
||
- [RouterOS API优化指南](https://wiki.mikrotik.com/wiki/Manual:API_examples)
|
||
- [Go RouterOS库文档](https://github.com/go-routeros/routeros)
|