Juniper 对等路由器的路由引擎 CPU 负载高的原因

网络工程 路由器 杜松
2021-07-27 14:47:28

最近,我们的两个瞻博网络对等路由器上的路由引擎 CPU 利用率从平均负载约 10-20% 增加到 80+%。我试图找出导致这种情况的原因(以及如何降低这种高负载)。

关于路由器的一些信息:都运行相同的 JunOS 版本,都连接到相同的两个对等 IXP LAN,并且拥有大量(数百个)(几乎相同的)IPv4 和 IPv6 会话。两个路由器都连接到不同的 IP 传输提供商,并以相同的方式连接到我们网络的其余部分。路由引擎的 CPU 负载并非稳定在 80% 以上,在几分钟到几小时内会回落到正常水平,但这些下降并不那么频繁。

我检查过的东西:

  • 在增加开始时没有进行任何配置更改
  • 指向控制平面的非单播流量没有增加
  • 转发的流量没有(实质性)变化(尽管即使增加也不重要)
  • show system processes summary表示rpd进程导致高 CPU 负载
  • 没有快速摆动的 BGP 对等体导致大量 BGP 变化

我能想到的一种可能的解释是 IXP 的两个路由器之一上的对等点(或多个)连接到发送大量 BGP 更新。目前,我只有关于传输会话的 BGP 消息数量的统计数据(显示没有异常活动),并且在对等 LAN 上有数百个 BGP 会话,如果我应该为所有会话。

我的问题是:

  • 我还应该检查其他任何事情来找出路由引擎上 CPU 负载增加的原因吗?
  • 如何轻松找出导致这些问题的会话(如果我的假设是正确的)?启用 BGP 跟踪选项会生成大量数据,但我不确定它是否能给我任何真正的见解。
2个回答

瞻博网络知识中心可能会为您提供一些有用的信息

如果 RPD 消耗高 CPU,则执行以下检查并验证以下参数:

  • 检查接口:检查路由器上是否有接口抖动。这可以通过查看 show log 消息和 show interfaces ge-x/y/z 扩展命令的输出来验证。解决他们为什么会扑腾的问题;如果可能,您可以考虑启用链路开启和链路关闭的保持时间。

  • 通过查看 show log 消息的输出,检查是否有与接口或任何 FPC/PIC 相关的 syslog 错误消息。

  • 检查路由:通过查看 show route summary 的输出来验证路由器获知的路由总数。检查它是否已达到最大限制。

  • 检查 RPD 任务:确定是什么使进程忙碌。这可以通过首先启用设置任务记帐来检查。重要提示:这本身可能会增加 CPU 的负载及其利用率;因此,当您完成所需的输出集合后,不要忘记将其关闭。然后运行 ​​show task accounting 并查找 CPU 时间较高的线程:

    user@router> show task accounting
    Task                       Started    User Time  System Time  Longest Run
    Scheduler                   146051        1.085        0.090        0.000
    Memory                           1        0.000            0        0.000  <omit>
    BGP.128.0.0.4+179              268       13.975        0.087        0.328
    BGP.0.0.0.0+179      18375163 1w5d 23:16:57.823    48:52.877        0.142
    BGP RT Background              134        8.826        0.023        0.099
    

找出与特定前缀或协议相关的线程占用高 CPU 的原因。

  • 您还可以通过查看 shell 命令的输出来验证路由是否振荡(或路由搅动): %rtsockmon –t

  • 检查 RPD 内存。有时高内存利用率可能会间接导致高 CPU。

我知道这个线程很旧,但为了完整起见:

如果高 cpu 随机发生并且您无法确定导致此问题的进程,我们可以创建下面的脚本。

使用此脚本,我们将在进程升高超过正常或预期阈值时捕获大量进程,这不应中断任何流量,但仍建议使用 MW。但是我看到您已将其缩小为 RPD。

snmp {
    health-monitor {
        interval 30;
        rising-threshold 60;
        falling-threshold 50;
    }
}

event-options {
    policy MONITOR-CPU {
        events snmpd_health_mon_thresh_cross;
        attributes-match {
            snmpd_health_mon_thresh_cross.event-name matches "Health Monitor.+CPU.+rising";
        }
        then {
            execute-commands {
                commands {
                    "show system processes extensive";
                }
                output-filename cpu-processes;
                destination local-flash;
                output-format text;
            }
        }                               
    }
    destinations {
        local-flash {
            archive-sites {
                /var/tmp;
            }
        }
    }
}

显示设置输出>

set snmp health-monitor interval 30
set snmp health-monitor rising-threshold 60
set snmp health-monitor falling-threshold 50
set event-options policy MONITOR-CPU events snmpd_health_mon_thresh_cross
set event-options policy MONITOR-CPU attributes-match snmpd_health_mon_thresh_cross.event-name matches "Health Monitor.+CPU.+rising"
set event-options policy MONITOR-CPU then execute-commands commands "show system processes extensive"
set event-options policy MONITOR-CPU then execute-commands output-filename cpu-processes
set event-options policy MONITOR-CPU then execute-commands destination local-flash
set event-options policy MONITOR-CPU then execute-commands output-format text
set event-options destinations local-flash archive-sites /var/tmp

您是否还检查过是否报告了任何 ddos​​ 消息?您可以运行以下命令:

show ddos-protection protocols statistics brief
show ddos-protection statistics
show ddos-protection version

然后,根据您所看到的内容,可以缩小范围,例如:

show ddos-protection protocols ttl statistics
show ddos-protection protocols ttl violations
show ddos-protection protocols ttl flow-detection detail  */*this cm needs prior config*/*

Juniper 在 KB22637 下也有此类问题的收集列表

高 CPU CLI 命令

set cli timestamp
show chassis routing-engine (multiple snapshots, atleast 5)
show system processes extensive (multiple snapshots atleast 5)
show system users
show system connections
show system statistics

开启任务记账,收集任务记账明细输出(3次,间隔30秒)。完成后不要忘记关闭它。

set task accounting on 
show task accounting detail
set task accounting off

show task memory detail
show task memeory summary
show task io
show task history
show task statistics
show task job
show task jobs
show krt queue
show krt state

日志

按照上面 Traceoptions 步骤 1 中的规定归档 /var/log

user@router# show routing-options 
traceoptions { 
file routing-trace size 10m files 20 world-readable; 
flag task; 
flag state; 
flag timer; 
}

此外,如果您运行的是容易出现错误的旧版本,您可能需要检查代码的生命支持:

http://www.juniper.net/support/eol/junos.html

需要提及的另一点可能是向量攻击是没有保护您的 RE 免受不需要的异常流量的影响。确保环回下有防火墙过滤器。

我在过去看到路由器上的脚本导致高 cpu 不确定 rpd 是否进入我的视野,但这是您可能不想忽视的事情。

如果您在日志中看到 RPD_MPLS_PATH_BANDWIDTH_CHANGE 有很多命中,您可能使用了非常激进的调整间隔

检查“显示系统队列:这是内核队列,可能会出现一些线索。