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
定位方法
在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
以上操作执行完成后,使用如下命令输出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
以上结果表明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 | 与组播流量转发有关 |