Routing Protocol Multi-core Support

RouterOS v7 通过将 FIB 更新、BGP 处理和协议处理等任务分配到独立的进程来实现多核路由。每个子任务使用私有或共享内存,BGP 输入/输出亲和性可通过 CLI 自定义。内存使用和任务状态可以使用专用命令进行监控,从而提升多核设备上的性能。

路由协议多核支持

RouterOS v7 可以在多个进程之间拆分任务。

一个 "main" 任务启动和停止子任务,并在它们之间处理数据。每个子任务可以分配 "private"(私有)内存(仅该任务可访问)和 "shared"(共享)内存(所有路由任务均可访问)。

启用多进程路由后,以下任务在独立的进程中运行:

  • FIB 更新。
  • 路由策略配置。
  • 配置与报告 - 处理静态路由配置、"route print" 命令、SNMP 监控等。
  • BFD 协议处理
  • OSPF 协议处理。
  • RIP 协议处理。
  • ISIS 协议处理。
  • EVPN 处理。
  • PIM-SM。
  • LDP 协议处理。
  • Fantasy - 处理用于测试目的的虚拟路由条目生成。
  • BGP 连接和配置处理。
  • BGP 接收(每个对端一个任务,或按特定参数分组)。
  • BGP 发送(每个对端一个任务,或按特定参数分组)。

BGP 子任务

BGP 接收和发送可以按特定参数拆分为子任务。例如,你可以按对端运行输入,或将所有对端输入分组并在主进程中运行。你可以在 /routing/bgp/template 中通过 input.affinity 和 output.affinity 参数控制这种拆分。在核心数较少的设备上,调整亲和性值可以提升性能,因为任务之间共享数据比在单个任务内处理相同数据略慢。例如,在单核或双核设备上,在主进程或实例进程中运行输入和输出可以提升性能。

警告

BGP 最多可以生成 100 个唯一进程。 你可以使用 /routing/stats/process/print 命令监控所有当前使用的任务及其分配的私有/共享内存。

示例输出:

[admin@BGP_MUM] /routing/stats/process> print interval=1
Columns: TASKS, PRIVATE-MEM-BLOCKS, SHARED-MEM-BLOCKS, PSS, RSS, VMS, RETIRED, ID, PID, RPID, PROCESS-TIME, KERNEL-TIME, CUR-BUSY, MAX-BUSY, CUR-CALC, MAX-CALC
   #  TASKS                         PRIVATE-M  SHARED-M  PSS        RSS      VMS      R  ID       PID  R  PROCESS-  KERNEL-TI  CUR-  MAX-BUSY  CUR-  MAX-CALC
   0  routing tables                11.8MiB    20.0MiB   19.8MiB    42.2MiB  51.4MiB  7  main     195  0  15s470ms  2s50ms     20ms  1s460ms   20ms  35s120ms
      rib                                                                                                                                                    
      connected networks                                                                                                                                     
   1  fib                           2816.0KiB  0         8.1MiB     27.4MiB  51.4MiB     fib      255  1  5s730ms   7m4s790ms        23s350ms        23s350ms
   2  ospf                          512.0KiB   0         3151.0KiB  14.6MiB  51.4MiB     ospf     260  1  20ms      100ms            20ms            20ms    
      connected networks                                                                                                                                     
   3  fantasy                       256.0KiB   0         1898.0KiB  5.8MiB   51.4MiB     fantasy  261  1  40ms      60ms             20ms            20ms    
   4  configuration and reporting   4096.0KiB  512.0KiB  9.2MiB     28.4MiB  51.4MiB     static   262  1  3s210ms   40ms             220ms           220ms   
   5  rip                           512.0KiB   0         3151.0KiB  14.6MiB  51.4MiB     rip      259  1  50ms      90ms             20ms            20ms    
      connected networks                                                                                                                                     
   6  routing policy configuration  768.0KiB   768.0KiB  2250.0KiB  6.2MiB   51.4MiB     policy   256  1  70ms      50ms             20ms            20ms    
   7  BGP service                   768.0KiB   0         3359.0KiB  14.9MiB  51.4MiB     bgp      257  1  4s260ms   8s50ms           30ms            30ms    
      connected networks                                                                                                                                     
   8  BFD service                   512.0KiB   0         3151.0KiB  14.6MiB  51.4MiB     12       258  1  80ms      40ms             20ms            20ms    
      connected networks                                                                                                                                     
   9  BGP Input 10.155.101.232      8.2MiB     6.8MiB    17.0MiB    39.1MiB  51.4MiB     20       270  1  24s880ms  3s60ms           18s550ms        18s550ms
      BGP Output 10.155.101.232                                                                                                                              
   10  Global memory                            256.0KiB                                  global     0  0    

路由表更新机制

以下插图以更友好的方式说明路由表更新机制的工作原理。

路由协议不断循环执行以下过程:

  • "main" 进程等待来自其他子任务的更新 (1)。
  • "main" 在以下情况下开始计算新路由 (2–4):
    • 收到来自子任务的更新;
    • 协议尚未发布所有路由;
    • 配置或链路状态发生了变化。
  • 在新路由计算期间 (5),会发生以下事件:
    • 所有收到的更新都被应用到路由;
    • 确定网关可达性;
    • 解析递归路由;
  • "publish" 事件运行,发布 "current" 路由。在此阶段,"current" 路由不会改变,但协议仍可以接收和发送更新 (6)。
  • 执行清理并释放未使用的内存 (7)。在此步骤中,新的 "current" 表中不再使用的任何内容(路由、属性等)都会被移除。

将 "updated" 和 "current" 视为路由表的两份副本。"current" 表 (2) 是当前正在使用的表,而 "updated" (1) 是将在下一次发布事件中发布的候选路由表 (3 和 4)。这种方法防止协议在 "main" 进程执行 "publish" 时用缓冲的更新填满内存。相反,协议将最新的更新直接发送到主进程,主进程随后将新更新复制到 "updated" 表中。OSPF 稍微复杂一些:它在内部有一个类似的过程来选择当前 OSPF 路由,然后将其发送到 "main" 以进行进一步处理。