【Oracle生产运维】数据库服务器负载过高异常排查处理

说明

在Oracle数据库运维工作中,经常会遇到Oracle数据库服务器平均负载(load average)突然异常升高,如果放任不管,严重的情况下会出现数据库宕机、服务器重启等重大故障。因此,当发现数据库服务器平均负载异常高的时候,必须予以重视,并立即开展处理工作。

很多刚工作或者是没这方面处理经验的同学可能遇到这种情况就会开始慌张,不知从何下手,无法快速定位出引起负载异常的原因。

下面介绍我在工作中常用的排查思路供大家参考。截图的结果皆在实验环境中截取,与实际生产环境有较大出入,只作为操作演示。

1 负载过高现象

巡检发现、监控平台或者在操作系统中执行命令,显示load average值异常过高。

Linux常用的load average监控命令:

[oracle@oracle11g ~]# sar -q 1 5

此命令可以查看当前的平均负载,以及一分钟以来、五分钟以来和十五分钟以来的平均负载。

引起Oracle数据库服务器负载异常增高的原因有很多不同情况,以下是比较常见的情况:

  • 大量排序、SQL解析、慢SQL引起CPU过高;
  • 大量直接路径读、全表扫描、并发读写引起IO繁忙。

2 确认高负载类型

需要确认负载突然异常增高是CPU还是IO或者共同引起的,缩小问题范围,为下一步定位具体原因做准备。

登录数据库服务器,切换到orace用户。

2.1 检查平均负载

[oracle@oracle11g ~]$ sar -q 1 5
Linux 2.6.32-642.el6.x86_64 (oracle11g)         06/09/2024      _x86_64_        (1 CPU)05:34:11 AM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15
05:34:12 AM         0       382      0.49      0.43      0.47
05:34:13 AM         0       382      0.49      0.43      0.47
05:34:14 AM         0       382      0.49      0.43      0.47
05:34:15 AM         0       382      0.49      0.43      0.47
05:34:16 AM         0       382      0.49      0.43      0.47
Average:            0       382      0.49      0.43      0.47

说明:

  • runq-sz:运行队列,也就是等待运行的进程数;
  • plist-sz:进程创建的总数,包括线程;
  • ldavg-1:最后1分钟的平均负载;
  • ldavg-5:最后5分钟的平均负载;
  • ldavg-15:最后15分钟的平均负载。

如果runq-sz值很高,表明可能是CPU资源使用率过高引起的,若值低可能是IO过高引起的。

这里只是一个初步判断,需要执行下面的命令确认猜测。

2.2 检查CPU使用率

1)执行top命令查看所有进程的cpu和内存使用情况

[oracle@oracle11g ~]$ top -c

image.png

主要观察排在前几位的进程的%CPU,一般当负载异常时,前面两三个进程的%CPU会在100%。

top命令也可以看到平均负载load average的情况。

2)执行iostat命令查看CPU平均利用率

image.png

说明:

  • %user:用户空间的cpu使用率;
  • %idle:空闲的cpu。

如果%idle过高,说明CPU使用率过高。

2.3 检查I/O传送速率

1)查看IO等待

%iowait为CPU等待IO的百分比,如果非常高,则说明IO有瓶颈。

[oracle@oracle11g ~]$ iostat -c 1 5
Linux 2.6.32-642.el6.x86_64 (oracle11g)         06/09/2024      _x86_64_        (1 CPU)avg-cpu:  %user   %nice %system %iowait  %steal   %idle0.05    0.00    0.16    0.10    0.00   99.70avg-cpu:  %user   %nice %system %iowait  %steal   %idle0.00    0.00    1.01    0.00    0.00   98.99avg-cpu:  %user   %nice %system %iowait  %steal   %idle0.00    0.00    0.00    0.00    0.00  100.00avg-cpu:  %user   %nice %system %iowait  %steal   %idle0.00    0.00    1.00    1.00    0.00   98.00avg-cpu:  %user   %nice %system %iowait  %steal   %idle0.00    0.00    0.00    1.02    0.00   98.98

2)查看IO速率

[oracle@oracle11g ~]$ sar -b 1 5
Linux 2.6.32-642.el6.x86_64 (oracle11g)         06/09/2024      _x86_64_        (1 CPU)05:42:33 AM       tps      rtps      wtps   bread/s   bwrtn/s
05:42:34 AM     12.12      4.04      8.08    129.29     97.98
05:42:35 AM     12.12      0.00     12.12      0.00    114.14
05:42:36 AM      8.08      0.00      8.08      0.00     97.98
05:42:37 AM     15.15      4.04     11.11    129.29    130.30
05:42:38 AM     43.43      7.07     36.36    226.26    502.02
Average:        18.18      3.03     15.15     96.97    188.48

说明:

  • tps:每秒钟的I/O操作总数。这个值如果持续很高,可能表明磁盘I/O非常繁忙;
  • rtps:每秒钟的读操作数。高读操作数可能表明有大量的数据被读取;
  • wtps:每秒钟的写操作数。高写操作数可能表明有大量的数据被写入;
  • bread/s:每秒钟从物理设备读入的数据量,单位为 块/s。块的大小通常为512字节;
  • bwrtn/s:每秒钟向物理设备写入的数据量,单位为 块/s;
  • rb/c 和 wb/c:分别是每次读取和写入操作的平均块数。如果这个值很低,可能表明有许多小的I/O请求,这可能导致磁盘性能问题。

3 定位问题,找出引起高负载的SQL语句

Oracle数据库问题的大部分原因基础都是由SQL语句引起的。

假设经过上面的排查,确定为CPU使用率高引起的高负载,下面通过几个脚本定位到引起CPU使用率过高的SQL语句。

3.1 直接找到引起高负载的TOP SQL

登录数据库,检查近xx分钟的资源使用率(CPU、IO)TOP5的SQL:

SQL>
select ash.sql_id,sum(decode(ash.session_state,'on cpu',1,0)) "cpu",sum(decode(ash.session_state,'waiting',1,0)) -sum(decode(ash.session_state,'waiting',decode(en.wait_class,'user i/o',1,0),0)) "wait",sum(decode(ash.session_state,'waiting',decode(en.wait_class,'user i/o',1,0),0)) "io",sum(decode(ash.session_state,'on cpu',1,1)) "total"from v$active_session_history ash,v$event_name enwhere sql_id is not null and en.event#=ash.event# and ash.sample_time > sysdate -&min/(24*60)group by ash.sql_idorder by sum(decode(ash.session_state,'on cpu',1,1)) desc;

根据sql_id找到对应的sql_text:

SQL> select SQL_TEXT from v$sqltext where sql_id = '&sql_id' order by piece;

3.2 根据进程号找出SQL

前面查看cpu负载的时候使用了top命令,输出的信息中就包含有进程号PID,根据这个PID可以定位到具体是哪条SQL语句。

image.png

将异常的PID代入Oracle的几个常用的性能视图:

SQL>
set long 999999999999999999
set pages 200
select st.sql_id,st.sql_testfrom v$sqltext st,v$session se,v$process pwhere st.sql_id = se.sql_idand se.paddr = p.addrand p.spid = '&PID'order by st.piece;

得到的sql_test即为引起CPU高负载的SQL语句。

3.3 根据等待事件判断找出SQL

此方法需要对常见的等待事件比较熟悉。

查看当前正在执行的会话和相应等待事件:

SQL>
set lines 300
col machine for a20
col username for a20
col event for a30
col program for a25
col state for a10
select inst_id,sid,serial#,sql_id,sql_hash_value shv,event,username,program,machine,blocking_instance bi,blocking_session bs,seconds_in_wait wait_mfrom gv$sessionwhere (event not like '%dbms%' and event not like '%gcs remote%' and event not like '%mon timer%'and event not like '%SQL Net%' and event not like '%Streams AQ%' and event not like '%jobq slave wait%'and event not like '%ASM background timer%' and event not like '%DIAG idle wait%'and event not like '%VKTM logical idle Wait%' and event not like '%ges remote message%' and event not like '%Space Manager slave idle wait%' and event not like '%class slave wait%' and event not like '%wait for unread  message on broadcast channel%' and event not like '%pmon timer%')and status = 'ACTIVE' and wait_class != 'idle'and sql_id is not null   order by event,sql_id desc; 

主要看出现大量重复的sql_id和event。

注意,当同时存在大量与CPU和IO相关的等待事件时,应根据前面排查的结果侧重分析。即,当明确了是CPU问题时,就应带看CPU相关的等待事件对应的sql_id。

3.4 查看ASH或AWR报告

生成ASH报告或AWR报告需要将快照时间段设置在高负载期间。

当负载异常持续事件是短时间(10-20分钟)时,生成ASH报告。当负载异常持续事件是长时间(1小时以上)时,生成AWR报告。

分析报告也是需要对等待事件比较熟悉,此处就不对ASH报告和AWR报告的分析方法做说明,请自行查阅资料。

报告生成方法:

------ASH
# su - oracle
$ cd
$ sqlplus / as sysdba
SQL> @?/rdbms/admin/ashrpt.sql------AWR
# su - oracle
$ cd
$ sqlplus / as sysdba
SQL> @?/rdbms/admin/awrrpt.sql

报告生成的目录在oracle用户家目录下。

4 问题处理

找出引起高负载的问题SQL语句后,反馈给业务或应用或开发进行检查处理,同时也需要配合他们进行分析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/346421.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

log4j日志打印导致OOM问题

一、背景 某天压测,QPS压到一定值后机器就开始重启,出现OOM,好在线上机器配置了启动参数-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/**/**heapdump.hprof。将dump文件下载到本地,打开Java sdk bin目录下的jvisualvm工具&a…

事业单位——被逆袭篇

目录 一、结果 二、考试 三、时间 四、复习 五、总结 一、结果 图1:2024年浙江广播电视集团下属浙江省中波发射管理中心公开招聘笔面试结果 准考证号笔试面试总成绩排名备注107016070.866.48310702416555.44107134390.871.681入围107146869.869.08210715406454.…

电影推荐系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,用户管理,免费电影管理,付费电影管理,电影论坛管理 前台账户功能包括:系统首页,个人中心,付费电影&#x…

Java:111-SpringMVC的底层原理(中篇)

这里续写上一章博客(110章博客): 现在我们来学习一下高级的技术,前面的mvc知识,我们基本可以在67章博客及其后面相关的博客可以学习到,现在开始学习精髓: Spring MVC 高级技术: …

Spring Boot 项目启动时在 prepareContext 阶段做了哪些事?

概览 如果你对Spring Boot 启动流程还不甚了解,可阅读《Spring Boot 启动流程详解》这篇文章。如果你已了解,那就让我们直接看看prepareContext() 源码。 private void prepareContext(ConfigurableApplicationContext context, ConfigurableEnvironme…

邻接矩阵深度优先遍历

深度优先遍历,就是一条路,走到底,然后再走下一个岔路。 下面代码就主要使用递归来进行,当然也可以借助栈来实现。 private void traverse(char v, boolean[] visited) {int index _getIndexOfV(v);//获取v顶点在vertexS字符数组…

synchronized 的底层实现

用户态与内核态 JDK 早期,synchronized 叫做重量级锁, 因为申请锁资源必须通过 kernel(指大多数操作系统的核心部分),系统调用。 ;hello.asm ;write(int fd, const void *buffer, size_t nbytes)section datamsg db …

Spring Boot整合Redis实现发布/订阅功能

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

selenium非全新的方式同时启动多个浏览器又互不影响的一种实现方法,欢迎讨论!

最近在做模拟浏览器批量定时自动点击实现批量操作功能,主要使用selenium,但是发现selenium直接调用本地浏览器,启动的是一个全新的(与手动打开的不一致),网站可以检测到,每次都要双重验证(密码登…

AI服务器相关知识

在当今社会,人工智能的应用场景愈发广泛,如小爱同学、天猫精灵等 AI 服务已深入人们的生活。随着人工智能时代的来临,AI 服务器也开始在社会各行业发挥重要作用。那么,AI 服务器与传统服务器相比,究竟有何独特之处&…

收音机的原理笔记

1. 收音机原理 有线广播:我们听到的声音是通过空气振动进行传播,因此可以通过麦克风(话筒)将这种机械振动转换为电信号,传到远处,再重新通过扬声器(喇叭)转换为机械振动&#xff0c…

物联网概念

物联网 物联网简介物联网体系结构物联网体系结构定义物联网体系结构设计原则物联网体系结构四层物联网体系结构感知控制层数据传输层数据处理层应用决策层 物联网关键技术感知标识技术网络与通信技术云计算技术安全技术 已有物联网相关应用架构无线传感器网络的体系结构EPC/UID…

DeepSORT(目标跟踪算法)中自由度决定卡方分布的形状

DeepSORT(目标跟踪算法)中自由度决定卡方分布的形状 flyfish 重要的两个点 自由度决定卡方分布的形状(本文) 马氏距离的平方在多维正态分布下服从自由度为 k 的卡方分布 独立的信息 在统计学中,独立的信息是指数据…

onesixtyone一键扫描SNMP服务(KALI工具系列二十)

目录 1、KALI LINUX 简介 2、onesixtyone工具简介 3、在KALI中使用onesixtyone 3.1 目标主机IP(win) 3.2 KALI的IP 4、操作示例 4.1 扫描目标主机 4.2 加上团队名称 4.3 输出详细结果 4.4 扫描整个网段 5、总结 1、KALI LINUX 简介 Kali Lin…

网络网络层之(6)ICMPv6协议

网络网络层之(6)ICMPv6协议 Author: Once Day Date: 2024年6月2日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 通信网络技术_Once-Day的博客-CS…

从年金理论到杠杆效应,再到财务报表与投资评估指标

一、解释普通年金终值和普通年金现值的概念。 普通年金终值:以利率为1%,每期收款100元,5期为例,普通年金终值的折算过程如图: 普通年金现值:以利率为1%,每期收款100元,5期为例&am…

powerdesigner各种字体设置

1、设置左侧菜单: 步骤如下: tools —> general options —> fonts —> defalut UI font ,选择字体样式及大小即可,同下图。 2、设置Table的字体大小 Tools------>Display Prefrences------>Table------->Format---------…

Gitlab安装配置

gitlab git是一个分布式的代码版本管理软件。用于敏捷高效地处理任何或小或大的项目。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 1.版本控制 是指对软件开发过程中各种程序代码,配置文件及说明文档等文件变更的管…

基于Python+FFMPEG环境下载B站歌曲

题主环境 WSL on Windows10 命令如下 # python3.9 pip install --pre yutto yutto --batch https://www.bilibili.com/video/BV168411o7Bh --audio-only ls | grep aac | xargs -I {} ffmpeg -i {} -acodec libmp3lame {}.mp3WinAmp

线程知识点总结

Java线程是Java并发编程中的核心概念之一,它允许程序同时执行多个任务。以下是关于Java线程的一些关键知识点总结: 1. 线程的创建与启动 继承Thread类:创建一个新的类继承Thread类,并重写其run()方法。通过创建该类的实例并调用st…