{
    "name"  : "诊断CPU高",
    "problems" : {
        "CPU_status" : {
            "desc"      : "【问题】检测到 ${0} CPU占用高",
            "advice"    : "【建议】参考故障${1}的处理方法,\r\n故障描述：${2},\r\n故障原因：${3},\r\n故障解决方法：${4}"
        }
    },
    "task_ID" : {
        "bcmARL.0"                          : "5152",
		"gc_task"                           : "5183",
        "LISR INT"                          : "5322", 
        "OSIP task"                         : "6111",
		"ncc"                               : "6111",
        "buffcopy"                          : "6169",
		"tnet"                              : "6169"
    },
	
    "task_note": {
        "5152": {
            "task_dscr"   : "目前2014E的5b8版本存在VLAN互通的已知bug，且用户要求在项目初验时2014E版本必须支持MPLS功能，故在3月4日进行版本升级，升级到10.4(3b12) Release(151012)后发现CPU偏高，经过多台试点升级尝试，只要升级CPU都会偏高，该故障会导致对项目初验造成不良影响。133  29.71%  29.75%  29.74%    bcmARL.0 \r\n134   0.48%   0.40%   0.40%    tCOUNTER.0\r\n137   0.49%   0.48%   0.48%    bcmLINK.0",
            "task_reason" : "因为该线程调度较为频繁，所以表现出了这个线程占用CPU高。虽然该线程表现出占用CPU高，但在实际应用时未发现该线程存在问题，也未引起其他线程出现问题。另外，路由器上CPU统计不准确的问题一直都存在，原因是因为路由器有快转模块，而快转数据平面无法准确的给出CPU资源占用情况，所以造成控制面的线程CPU统计不准确。",
            "task_method" : "优化bcmarl线程（SDK代码），当有新地址学习到时，减小该线程挂起时间，当一定时间没有学习到新mac地址时，加大该线程挂起时间。已在2014EF上将代码同步到3t102,3t107,3b13,3b12p1。排除了类似问题。"
        },
        "5183": {
            "task_dscr"   : "客户现场现场测试：插入两块24ESW卡后，设备CLI挂死，导致测试无法进行，单独插入任意一块卡均不会发生.本地测试：1、软件版本3B12，插入两块24ESW卡后设备CLI挂死，ping不通引擎的接口地址。2、软件版本2B2，插入两块24ESW卡后设备正常使用。",
            "task_reason" : "插入两张交换卡时，在第一张交换卡在初始化时，会挂载ser-module命令；在第二张交换卡初始化时，也会挂载ser-moudle命令；使该命令被重复添加，导致了控制台挂死。",
            "task_method" : "已经通过代码优化形式将修改同步到10.4(3b12)P1、10.4(3b13)分支。"
        },
        "5322": {
            "task_dscr"   : "实施了版本RSR20_10.3(5T86)_R158050的版本升级后，发现网点路由器的bfd震荡，bfd interval 900 min_rx 900 multiplier 3隔一段时间BFD，down一次，升级前无问题。另有一个网点之前CPU一直很高70%，当时将所有的接口IP REF配置后CPU降下来了。5月3日升级后CPU又高了，IP REF重新配置后cpu也无法降下来。",
            "task_reason" : "经过分析，是由于连接同步卡的接口未使用，但是还是接了线缆，而同步线缆上还是收到了很多的中断报文，所以导致设备上低级中断占用的CPU很高，将不使用的同步接口shutdown后，现在设备运行正常，所以分析是由于传输设备一致在发送信号给同步线卡导致的，非问题;当然还有一种情况就是当设备在进行大量的数据包转发时候，可会出现LISR INT任务CPU较高，这时候主要是快转本身耗费的CPU资源，亦属于正常情况。",
            "task_method" : "在CPU高的设备中，shutdown端口链路状态UP的Serial端口后，CPU立即下降，很快恢复到正常状态。再或者通过接口限速降低设备的转发压力。"
        },
        "6111": {
            "task_dscr"   : "1、外网线路插上之后CPU马上飙高cpu的OSIP_TASK与NCC进程高;2、目前已经通过更换外网IP地址进行规避已经可以基本确定为外部网络攻击导致的。",
            "task_reason" : "在没有启用dialer peer配置时，也创建了任务tucl，从而导致大量报文上进程处理，占用了大量的CPU和内存资源。该问题跟之前遇到的“香港稻香酒店RSR10内存不足”是类的问题。",
            "task_method" : "更新版本。"
        },
        "6169": {
            "task_dscr"   : "设备内存告警，CPU高，断网。详见附件。内网是傻瓜交换机，跑的是无盘系统。",
            "task_reason" : "确认了上诉问题，属于大量环路报文上进程导致：现场有大量环路报文，抗攻击也没开启，大量报文上进程自然很耗内存和CPU，应该是正常的；同时没开BGP，但有BGP告警，这是由于内存不足触发的，和BGP负责人钟建强确认，这也属于正常现象。",
            "task_method" : "建议更换RSR E/F新品,老RSR20内存很小，会不断提示内存不足，导致上述现象。20-14E/F的内存比老20大很多,没有这个问题。至于CPU，遇到攻击报文而导致CPU利用率高则属于正常现象，如果想降低CPU利用率，可以考虑开启设备抗攻击功能（control-plane 命令模式下配置ef-rnfp enable）。"
        }
    }
	
}
---------------------------code-------------------------------
res = cli('show cpu')
#res = "CPU Using Rate Information\r\nCPU utilization in five seconds:  0.00%\r\nCPU utilization in one minute  :  1.45%\r\nCPU utilization in five minutes:  0.32%\r\n  NO   5Sec   1Min   5Min   Process \r\n  0   21.00%   21.00%   21.00%    LISR INT \r\n  1   21.00%   0.00%   0.01%    OSIP task \r\n  2   0.00%   21.00%   0.00%    gc_task \r\n  3   0.00%   0.00%   21.00%    bcmARL.0 \r\n  4   21.00%   21.00%   21.00%    ncc \r\n" 
rates = res.match(/\d+\s+(.*)%\s+(.*)%\s+(.*)%\s+(.*)\r?\n/g);
print rates
i = 0
taskStr = ''
isProblemFound = false

while  i < (rates.length - 1) :
    singalRate = rates[i]
    singnalRateArr = singalRate.match(/\d+\s+(.*)%\s+(.*)%\s+(.*)%\s+(.*)/);
    if singnalRateArr[1] >= 20 || singnalRateArr[2] >= 20 || singnalRateArr[3] >= 20:
	    isProblemFound = true
		#taskStr = ''
        #if taskStr != '' :idle
            #taskStr = taskStr + ' ' + singnalRateArr[4]
        #else :
            taskStr = singnalRateArr[4]
        #end
		
		taskStr = taskStr.replace(/(^\s*)|(\s*$)/g,"")
		print taskStr
		task_ID        = get_configure_value('task_ID')
		task_note      = get_configure_value('task_note')
		IDs            = task_ID[taskStr]
		if IDs != null : 
		    print IDs
			taskNoteJson   = task_note[IDs]
			trouble_dscr   = taskNoteJson['task_dscr']
			trouble_reason = taskNoteJson['task_reason']
			trouble_method = taskNoteJson['task_method']
			add_problem('CPU_status',[taskStr,IDs,trouble_dscr,trouble_reason,trouble_method])
		end
    end
	i = i + 1
end

if isProblemFound :
    return 'warn'
else:
    return 'success'
end



