暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

服务器Cpu高分析小记

IT那活儿 2021-12-24
2225

点击上方“IT那活儿”,关注后了解更多精彩内容!!

背景说明


服务频繁告警CPU 100%,CPU高后瞬时恢复,导致数据库与系统时间段内hang住,以下对此问题进行分析。

故障具体分析

1. 进行检查分析

1.1 正常情况下cpu使用

相关数据库进程单进程占用cpu不高,总统cpu不高:

top - 11:22:57 up 402 days, 9:55, 8 users, load average: 0.12, 0.13, 0.17Tasks: 1205 total, 2 running, 1203 sleeping, 0 stopped, 0 zombie%Cpu(s): 0.3 us, 0.2 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 stKiB Mem : 98834632 total, 32530472 free, 16034276 used, 50269884 buff/cacheKiB Swap: 4194300 total, 4095716 free, 98584 used. 39917184 avail MemPID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND3963 root      20   0 4875340 251816   4096 S   7.6  0.3   4730:44 ds_am20543 oracle    20   0 35.674g 214680 207560 R   3.3  0.2   0:10.04 oracle_20543_ar3334 oracle    -2   0 35.667g  17916  14752 S   1.6  0.0  81:11.44 ora_vktm_archdb13357 grid      -2   0 1525768  16788  13784 S   1.6  0.0   8456:17 asm_vktm_+asm10944 root      20   0   16012   1344    964 S   1.0  0.0   1:05.65 zabbix_agentd12206 root      20   0  482680  70072  13484 S   1.0  0.1 399:42.68 titanagent16362 grid      20   0 1438088  41508  15136 S   1.0  0.0   2893:10 oraagent.bin25130 oracle    20   0  158812   3440   1560 R   1.0  0.0   0:00.20 top3128 root      20   0  377392   9476   5736 S   0.7  0.0   1064:39 vmtoolsd10885 grid      20   0 1990168  42280  11380 S   0.7  0.0   1352:54 ocssd.bin3364 oracle    20   0 35.677g  66040  53104 S   0.3  0.1  29:04.60 ora_dia0_archdb3509 oracle    20   0 35.667g  70196  66952 S   0.3  0.1   9:43.32 ora_mmnl_archdb4902 oracle    20   0 35.667g  17920  14812 S   0.3  0.0   0:06.05 ora_tt01_archdb5181 oracle    20   0 35.667g  18000  14888 S   0.3  0.0   0:20.32 ora_tt02_archdb5558 grid      20   0 1839656  51356  15452 S   0.3  0.1   1689:32 ohasd.bin10810 grid      20   0  913920  21860  11032 S   0.3  0.0   1456:31 cssdagent1 root      20   0  192516   5152   2308 S   0.0  0.0 222:20.47 systemd2 root      20   0       0      0      0 S   0.0  0.0   1:24.29 kthreadd

1.2 数据库alert时间段正常都为正常日志现象(为一些job执行失败错误):

2021-11-25T00:54:45.936741+08:00Errors in file /opt/app/oracle/diag/rdbms/archdb/archdb/trace/archdb_j000_16398.trc:ORA-12012: error on auto execute of job "SYS"."ORA$AT_OS_OPT_SY_101941"ORA-20001: Statistics Advisor: Invalid task name for the current userORA-06512: at "SYS.DBMS_STATS", line 47207ORA-06512: at "SYS.DBMS_STATS_ADVISOR", line 882ORA-06512: at "SYS.DBMS_STATS_INTERNAL", line 20059ORA-06512: at "SYS.DBMS_STATS_INTERNAL", line 22201ORA-06512: at "SYS.DBMS_STATS", line 471972021-11-25T01:00:13.261966+08:00TABLE SYS.WRP$_REPORTS: ADDED INTERVAL PARTITION SYS_P33783 (4347) VALUES LESS THAN (TO_DATE(' 2021-11-26 01:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))TABLE SYS.WRP$_REPORTS_DETAILS: ADDED INTERVAL PARTITION SYS_P33784 (4347) VALUES LESS THAN (TO_DATE(' 2021-11-26 01:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))

1.3 在cpu高达100%使用率时候操作系统会报出以下错误信息:

Message from syslogd@nsf-archdb-2-234 at Nov 26 17:53:22 ...kernel:NMI watchdog: BUG: soft lockup - CPU#7 stuck for 33s! [master:2495]Message from syslogd@nsf-archdb-2-234 at Nov 26 17:53:22 ...kernel:NMI watchdog: BUG: soft lockup - CPU#10 stuck for 24s! [ora_lg01_archdb:7165]Message from syslogd@nsf-archdb-2-234 at Nov 26 17:53:22 ...kernel:NMI watchdog: BUG: soft lockup - CPU#6 stuck for 22s! [oracle_1689_arc:1689]

1.4 内核软死锁错误信息分析:

此错误为操作系统出现cpu死锁bug现象,Cpu调度器调度一个驱动程序来运行,如果这个驱动程序有问题并且没有被检测到,那么这个驱动程序将会暂用cpu的很长时间。此时,看门狗进程会抓住(catch)这一点并且抛出一个软死锁(soft lockup)错误。

软死锁会挂起cpu使你的系统不可用。lockup分为soft lockup和hard lockup。soft lockup是指内核中有BUG导致在内核模式下一直循环的时间超过10s(根据实现和配置有所不同),而其他进程得不到运行的机会。hard softlockup是指内核已经挂起。

注意soft lockup(内核软死锁) 此bug不会让系统彻底死机,若干个进程(或者kernel thread)被锁死在了某个状态(一般在内核区域),多数情况下这个是由于内核锁的使用的问题。

2. 处理方法原因

内核参数kernel.watchdog_thresh(/proc/sys/kernel/watchdog_thresh)系统默认值为10。如果超过2*10秒会打印信息,注意:调整值时参数不能大于60。

调整该值可以延长watchdog等待时间,不能彻底解决问题,只能导致信息延迟打印。要解决此问题,还是要找到根本原因。

2.1 追加到配置文件中:

echo 30 > /proc/sys/kernel/watchdog_thresh

2.2 查看:

tail -1 /proc/sys/kernel/watchdog_thresh
30

2.3 临时生效:

sysctl -w kernel.watchdog_thresh=30

2.4 修改内核限制文件:

vi /etc/sysctl.confkernel.watchdog_thresh=30

3. 造成cpu死锁的可能原因

3.1 服务器电源供电不足,导致CPU电压不稳导致CPU死锁。

3.2 虚机所在的宿主机的CPU太忙或磁盘IO太高。

3.3 虚机的的CPU太忙或磁盘IO太高。

3.4 BIOS KVM开启以后的相关bug,关闭KVM可解决,但关闭以后物理机不支持虚拟化。

3.5 VM网卡驱动存在bug,处理高水位流量时存在bug导致CPU死锁。

3.6 BIOS开启了超频,导致超频时电压不稳,容易出现CPU死锁 。

3.7 Linux kernel存在bug。

3.8 KVM存在bug 。

3.9 clocksource tsc unstable on CentOS and cloud Linux with Hyper-V Virtualisation通过设置clocksource=jiffies可解决。

3.10 BIOS Intel C-State开启导致,关闭可解决。

3.11 BIOS spread spectrum开启导致

  • 当主板上的时钟震荡发生器工作时,脉冲的尖峰会产生emi(电磁干扰)。spread spectrum(频展)设定功能可以降低脉冲发生器所产生的电磁干扰,脉冲波的尖峰会衰减为较为平滑的曲线。

  • 如果我们没有遇到电磁干扰问题,建议将此项设定为disabled,这栏可以优化系统的性能表现和稳定性;

  • 否则应该将此项设定为enabled。如果对cpu进行超频,必须将此项禁用。因为即使是微小的脉冲值漂移也会导致超频运行的cpu锁死。

本 文 原 创 来 源:IT那活儿微信公众号(上海新炬王翦团队)

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论