实战课堂:一则CPU 100%的故障分析处理知识和警示

简介:

案情描述:

11点20分,DBA接到CPU告警短信,业务数据库2节点CPU使用率达到100%;

11点22分,DBA登陆业务数据库进行核查,发现数据库两个节点CPU使用率达到100%,并且有library cache lock以及大量cursor: pin S wait on X异常等待事件,数据库执行查询缓慢并时常出现挂起的情况。应用人员反馈语句缓慢,事务有积压;

11点24分,DBA对业务数据库两个节点执行hang analyze信息收集。

注意,当我们遭遇到这种情况时,DBA 在处理中的通常过程就是:

首先通过 v$session 、v$session_wait、v$lock 去确定当前数据库的等待情况,锁信息等;

如果数据库能够响应,通过ASH报告,可以获取更直观的输出,看看阻塞的情况和情形,然后进行下一步的判断;

如果数据库失去响应,或者响应困难,则可以通过 Hang Analyze 进行信息采集,以便后续分析;

关于数据库挂起的诊断跟踪,参考我们之前的文章:DBA必备技能:数据库挂起时进行转储分析诊断案例

案情继续:

11点30分,由于数据库严重挂起,进程积压严重,告知相关部门后,为了尽快恢复业务,重启数据库。

11点35分,数据库重启完毕,CPU资源得到释放,应用恢复正常。

在实践中,有时候排查问题可能要遗留到事后,在当时为了尽快恢复业务,用户就采取了重启数据库的方式。

现在是DBA需要找出原因,防范后续问题的时间了。很多情况下,专业DBA是在这一阶段出场,需要找出Root Cause,并且给出防范解决方案。

首先通过ASH记录的信息,可以发现,从11月10日11点10分40秒左右,开始出现libaray cache lock以及cursor: pin S wait on X等待事件,这不一定意味着问题,正常解析也会出现

de8028d54b0a97e7c12f54e16ae3e122cbd896af

从11点10分46秒开始,等待cursor: pin S wait on X等待事件的会话越来越多:

2dc811c0f14ade854914a01387b82b15e2ea8439

这些等待cursor: pin S wait on X的会话都被三个会话阻塞(实例1上sid为7530的会话,实例1上sid 11124的会话,实例1上sid为3802的会话)。

5d828a5615bc79a0b80dfdd9c7a31c88680594a5

而上述三个会话等待事件为libarary cache lock, 同时被实例1上sid为13906的会话阻塞。

d8de3089d3563290d4eb7e20a894aeac1ccaf442

而实例1上sid为13906的会话是从portal_sso2主机上以UNIRECHARGE用户登陆门户库,并在11点10分38秒的时候,开始执行alter table的操作,但是语句一直没有执行完:

c7dd3f0108c986b72033fc544be62ee15d3605bd

通过结合hang analzye收集到的信息分析:

f0972934e40676891c6e80bc6f3ef61bcef1c408

该会话执行的alter table语句为:

alter table T_ZT_ORDER add history_record char(1) default ‘0’;

综合上述分析,造成数据库CPU高消耗的主要原因是由于开发人员,在生产高峰时段执行了DDL 语句:“Alter table T_ZT_ORDER add history_record char(1) default ‘0’”而引发的。

事实上,自从Oracle 11g开始,当我们在表上增加具有缺省值的新字段时,Oracle首先修改数据字典,并不会直接更新所有数据,以减少锁定。元数据的设置在 ecol$ 中:

insert into ecol$(tabobj#, colnum, binarydefval, guard_id) values (:1, :2, :3, :4)

update ecol$ set binaryDefVal = :3 where tabobj# = :1 and colnum = :2

由于增加字段会导致表结构的变化,统计信息会被清除:

delete from tab_stats$ where obj#=:1

SQL 需要重新解析,就需要在表上获得 Library cache lock ,这个锁定无法获得,数据库产生阻塞。

在这个案例中,DDL操作在繁忙时段没有及时完成,阻塞了2139个会话,就导致了一次数据库事故。

那么如何防范问题呢?不以规矩,不成方圆,后续改进措施建议:

1). 建议开发人员按照操作规范,在进行DDL语句操作前进行相关备案,并且不要在繁忙时段在生产环境执行DDL操作;

2). 建议DBA加强对开发此类DDL操作进行监控。

这就是来自生产的一次故障处理和排查,通过这样的过程,我们能够看到,在生产环境中一次小的操作,就可能导致严重的生产故障,一个DDL都不应该草率执行。


原文发布时间为:2018-05-20

本文作者:墨墨

本文来自云栖社区合作伙伴“数据和云”,了解相关信息可以关注“数据和云”。

相关文章
|
8月前
|
人工智能 并行计算 PyTorch
【PyTorch&TensorBoard实战】GPU与CPU的计算速度对比(附代码)
【PyTorch&TensorBoard实战】GPU与CPU的计算速度对比(附代码)
390 0
|
安全 Windows
一次简单的服务器 cpu 占用率高的快速排查实战
一次简单的服务器 cpu 占用率高的快速排查实战
|
3月前
|
监控 并行计算 数据处理
构建高效Python应用:并发与异步编程的实战秘籍,IO与CPU密集型任务一网打尽!
在Python编程的征途中,面对日益增长的性能需求,如何构建高效的应用成为了每位开发者必须面对的课题。并发与异步编程作为提升程序性能的两大法宝,在处理IO密集型与CPU密集型任务时展现出了巨大的潜力。今天,我们将深入探讨这些技术的最佳实践,助你打造高效Python应用。
47 0
|
1月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
108 7
|
6月前
|
并行计算 监控 数据处理
构建高效Python应用:并发与异步编程的实战秘籍,IO与CPU密集型任务一网打尽!
【7月更文挑战第16天】Python并发异步提升性能:使用`asyncio`处理IO密集型任务,如网络请求,借助事件循环实现非阻塞;`multiprocessing`模块用于CPU密集型任务,绕过GIL进行并行计算。通过任务类型识别、任务分割、避免共享状态、利用现代库和性能调优,实现高效编程。示例代码展示异步HTTP请求和多进程数据处理。
71 8
|
8月前
|
运维 Linux Docker
Docker详解(十一)——Docker容器CPU资源限额实战Docker详解
Docker详解(十一)——Docker容器CPU资源限额实战
157 5
|
8月前
|
XML Java API
Android App开发之创建JNI接口获取CPU指令集讲解及实战(附源码 简单易懂)
Android App开发之创建JNI接口获取CPU指令集讲解及实战(附源码 简单易懂)
228 0
|
C++ 索引 Windows
调试实战——程序CPU占用率飙升,你知道如何快速定位吗?
程序CPU占用率飙升,你知道如何快速定位吗?
|
存储 开发工具 Python
Pyside6-QtCharts+psutil实战-绘制一个CPU监测工具
Pyside6-QtCharts+psutil实战-绘制一个CPU监测工具
382 0
|
存储 安全 芯片