Kernel CPU高的定位方法

在某些场景下,客户设备会遇到CPU持续高占用的情况,通过FortiGate自带的CPU Profiling程序,可以收集到CPU高时的代码级别的Debug信息。

通常来说,CPU可以在Kernel/System Space和User Space内工作,Kernel Space用于运行操作系统的可执行文件,以下方法仅适用于Kernel Space下CPU使用率高的情况,不适用于某个用户进程(如IPS engine/WAD)CPU占用高的情况。如下所示,获取的CPU状态信息中,System或softirg占用较高,即为Kernel Space CPU使用率高(而不是使用diagnose sys top中看到的用户进程占用CPU高)。

FortiGate # get system performance status

CPU states: 0% user 99% system 0% nice 1% idle 0% iowait 0% irq 0% softirq
CPU0 states: 0% user 99% system 0% nice 1% idle 0% iowait 0% irq 0% softirq
CPU1 states: 0% user 98% system 0% nice 2% idle 0% iowait 0% irq 0% softirq

FortiGate # get system performance status
CPU36 states: 0% user 0% system 0% nice 0% idle 0% iowait 0% irq 100% softirq
CPU37 states: 0% user 0% system 0% nice 0% idle 0% iowait 0% irq 100% softirq
CPU38 states: 0% user 0% system 0% nice 0% idle 0% iowait 0% irq 100% softirq
CPU39 states: 0% user 0% system 0% nice 0% idle 0% iowait 0% irq 100% softirq

定位方法

  1. 在Kernel Space下CPU使用率持续高的情况下,使用如下命令收集信息。

    diag sys profile cpumask 15    //抓取特定的CPU核心,这里以15为例
    diag sys profile start    //开启profile程序,等待1分钟左右,再执行后续命令
    diag sys profile stop
    diag sys profile show order
    diag sys profile show detail
    diag sys profile sysmap
    
  2. 以上操作执行完成后,使用如下命令输出CPU profile的结果。

    FortiGate # diag sys profile show order
    
    0xffffffffa007990f: 2322 fqdn_ip_check+0x4f/0xa0
    0xffffffffa0078537: 547 oal_ioctl+0xa57/0x1070
    0xffffffff803ac8ec: 100 __write_lock_failed+0xc/0x20
    0xffffffffa00323bb: 57 __iprope_check_one_policy+0x32b/0x21c0
    0xffffffffa002bd4b: 38 timer_function+0xffb/0x2e70
    0xffffffffa009c287: 37 __iprope_tree_check+0x1f7/0x3e0
    
  3. 以上结果表明CPU在收集期间正在执行的函数,这些函数有两种类型,一种为标准的Linux函数,其意义何以在Linux标准中找到,另一种为Fortinet私有的函数。常见代表的意义如下:

函数名称 含义 排查方法
poll_idle CPU没有在做任何操作 忽略
inet_hash_connect
inet_check_established
用于打开Socket连接 通常在显式代理中出现,可能是FortiGate无法在出接口上打开更多的端口导致,解决方法是在显示代理的出接口上设置更多的端口或IP(config web-proxy explicit)
inet_frag_find
ip_defrag
分片 执行分片相关的调试命令(如sniffer、diagnose snmp ip frags),检查用户网络的MTU设置
is_csf_valid ISDB 与ISDB进程或SD-WAN有关,检查调用大量ISDB条目的相关配置
read_ses_rate SNMP 检查是否有大批量查询FortiGate SNMP OID的流量
__local_bh_enable_ip
rb_next
fqdn_check
FQDN 检查是否存在大量引用FQDN的策略
strncasecmp FTP 与FTP Session Helper会话有关
queue_work_on
process_one_work
Internal loop inside linux kernel
__write_lock_failed 通用Linux函数,表示进程正在等待进程锁释放
sal_no_sleep FIB转发表项变化 检查是否有大规模的路由变化(BGP/OSPF/IPsec tunnel up/down)
__posix_lock_file 配置变更/更新特征库 本地配置变更,或FortiGate正在更新特征库
fqdn_ip_check
oal_ioctl
__write_lock_failed
被拒绝的流量 DDoS攻击、或大量数据包被FortiGate阻断
ip_session_mark_one_dirty
ip6_session_mark_one_dirty
会话正在dirty 使用命令“diag sys cmdb info”检查配置变化情况,收集fcnacd进程的Debug信息,也可能有FortiClient终端注册情况导致的Session Dirty
release_pages
pagevec_lru_move_fn
与WAD向IPS发送数据有关 与UTM深度包检测有关
do_gettimeoffset_tsc IPS检测相关
unix_find_other.constprop 配置变更 与移动安全策略顺序有关,使用“fnsysctl cat /proc/net/unix”收集信息
add_ip_mcast_session 与组播流量转发有关

Copyright © 2023 Fortinet Inc. All rights reserved. Powered by Fortinet TAC Team.
📲扫描下方二维码分享此页面👇
该页面修订于: 2023-09-12 15:24:08

results matching ""

    No results matching ""