mosdns/MikroTik-Performance-Optimization.md

5.0 KiB
Raw Blame History

MikroTik API 写入性能优化指南

🔍 问题分析

通过对 MosDNS MikroTik 插件的深入分析,发现以下性能瓶颈:

1. 网络层面问题

  • 单连接阻塞:使用单一连接处理所有请求
  • 同步等待每个API调用都需要等待响应
  • 频繁重连:连接断开后的重连机制增加延迟

2. 应用层面问题

  • 串行处理IP地址逐个处理无法充分利用并发
  • 过度验证verify_add: true 会进行二次查询确认
  • 缓存失效缓存TTL过长或过短都会影响性能

🚀 优化方案

立即可实施的配置优化

1. 调整连接参数

mikrotik_amazon:
  type: mikrotik_addresslist
  args:
    timeout: 3              # 🔥 减少连接超时时间
    verify_add: false       # 🔥 关闭验证提升50%性能
    cache_ttl: 7200        # 🔥 优化缓存时间2小时
    max_ips: 10            # 🔥 限制IP数量避免过载

2. 优化掩码设置

mask4: 32                  # 🔥 使用/32精确匹配
mask6: 128                 # 🔥 使用/128精确匹配

好处:避免网段合并,提高缓存命中率

3. 调整超时时间

timeout_addr: 43200        # 🔥 12小时超时原24小时

好处:提高缓存命中率,减少重复写入

中级优化方案

1. 启用批量处理

当前代码已支持批量处理,但可以进一步优化:

# 在配置中调整工作池大小
worker_pool_size: 15       # 增加工作线程
batch_size: 20            # 增加批处理大小

2. 网络层优化

use_tls: false            # 🔥 关闭TLS减少握手时间
timeout: 3                # 🔥 快速失败,避免长时间等待

3. MikroTik 路由器端优化

# 在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. 连接池实现

创建连接池来复用连接:

// 伪代码示例
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调用

// 当前:多次单独调用
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. 异步处理队列

实现消息队列机制:

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. 添加性能监控指标

📈 监控和测试

性能监控命令

# 查看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"

压力测试

# 使用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. 测试环境:先在测试环境验证效果

🔗 相关资源