# 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)