记一次高io wait问题分析及解决-设置合理的SGA

一、背景

由于行内某交易系统需要进行版本更新,为保证新版本上线后可以达到最优效果,根据需求,对该系统的Oracle数据库进行了一次深入诊断、分析和优化。在分析过程中,果然发现了一些由于SGA设置问题导致的系统运行风险。经过简单的优化,问题最终得以顺利解决。本文对整个分析排查过程、解决方案及最终效果进行了简单的描述和记录。

二、分析过程

数据库在日常没有发现性能问题时只需进行一些常规检查,日常进行的常规检查主要包括以下操作:
  • 空间查看:

df -h
  • 内存查看:

内存使用情况:
free -g

大页使用情况:
cat /proc/meminfo|grep Huge

内存页表使用情况:
cat /proc/meminfo|grep Table

  • CPU查看:

cat /proc/cpuinfo
  • 主机动态性能查看:

vmstat 1
检查后发现,除主机动态性能外,其他检查项均正常,主机动态性能的问题为输出结果中wa比较高;一般来讲vmstat中wa为0,说明压力正常;当该值较大时,说明io等待比较严重,这可能是磁盘大量随机访问造成的,也有可能是磁盘的带宽出现了瓶颈。
该主机上仅运行了该交易系统的数据库,因此造成大量io访问的也只有可能是db。进一步到数据库中进行分析,查看此时数据库的等待事件:
select event,sql_id,count(*) from v$session group by event,sql_id order by 3;
此时,并没有发现数据库有严重的等待,看起来较为异常的仅有一个read by other session和gc的等待事件,对相关事件的sql进行分析,可以发现该sql如下:

该sql是应用程序框架直接生成,对该sql进行分析,发现其执行计划看似合理,但其实并不好,mct_id虽然走了索引范围扫描,但是返回的行数都是在30w以上,也就是说这个条件的筛选率并不好(这里我个人认为,这个操作和全表扫描没什么太大区别)。

经过查询,发现该表还是比较大,整个数据有大概2000w。此时,从表的数量、执行计划来看,我们不难判断该sql肯定会造成大量的逻辑读,而在Oracle集群中,大量的逻辑读产生read by other session和gc等待的现象并不奇怪。

但是需要注意的是,数据库中除了这个sql,并没有其他的异常等待事件,而大量的逻辑读,一般是从cache中读取数据,cache中读取数据也不会造成严重的iowait才对。所以,很有可能造成严重的iowait另有其因。
为了进一步确认问题,生成一个awr对数据库在这个时间段的整体情况进行分析:

从DB TIME上来看,整个数据库的压力并不大,看起来并没有什么瓶颈。但是继续看load profile和instance efficiency percentages就可以发现有两个明显的问题,即physical read和buffer hit;从awr中明显可以看到,此时数据库的物理读比较大(9000+块/秒),而buffer hit仅有80%。

很明显,buffer的命中率过低。该值过低则说明我们需要查询的数据,在buffer中可能并没有。此时,数据库则会到磁盘中对数据进行读取。因此,也会造成此时数据库的物理读非常大。
此时,第一个想法就是看看数据库的内存分配情况是否出现不合理,导致大部分的数据无法缓存到内存中。继续从awr的内存部分进行查看:

发现SGA的大小为4G。而在最开始检查该数据库主机分配的内存大小为16G。可以看出来,SGA分配的比例有确实有点小,仅占整个主机的1/4。

三、原因说明

根据上述的排查过程,其实可以明显发现,在该系统中目前有四个个问题比较明显:
1.buffer hit命中率较低;
2.物理读较高;
3.存在sql运行效率差;
4.系统的iowait略高;
结合四个问题,基本上可以得出下述结论:
由于数据库的SGA分配过小,数据库中存在一些运行效率不高的sql,导致客户端需要从数据库中返回大量的数据。数据库中获取数据需要先从buffer中读取数据(此时,会产生逻辑读),如果buffer中无法找到数据,则会到磁盘上读取数据(此时,产生物理读)。因此,不仅产生了大量的逻辑读,也产生了大量的物理读,而buffer的命中率也由于buffer中无法缓存更多的数据导致buffer hit很低。
另外,我们从生成的sqlrpt中也可以看到,此时sql的逻辑读和物理读都非常大:

由于产生了大量的物理读,那么就会产生大量的io消耗;该系统磁盘为stata盘,磁盘读写性能也有限,故最终造成了高iowait。

四、优化处理

了解原因后,针对该系统的优化处理就相对简单,主要可以分为两种方式:
1.增加缓存大小,让数据库可以缓存更多数据;
2.优化sql语句,减少数据读取量;
针对第一点,由于主机分配的内存为16G,那么我们可以加大SGA(比较保守的情况下,我们将SGA的大小从4G增加到8G);
而针对于第二点,由于sql是应用程序生成,应用方修改有些难度,那么我们则建议将该表用做分区表,从而减小数据获取量;

五、优化效果

由于该系统是行内交易类的生产系统,修改分区表结构,属于重大变更,没有经过测试环境无法直接上生产,所以最终就能优化SGA。
不过仅仅优化完SGA后完成后,整体效果也还是非常明显的。在第二天的同一时间点,数据库连接的session更多的情况下,数据库的db_time提升了2倍多,数据库物理读从9000+下降至1000+,buffer hit的命中率从80%提升到99%。而主机中的iowait也基本消失。
墨天轮原文链接:https://www.modb.pro/db/74414(复制到浏览器或者点击“阅读原文”立即查看)
END
(0)

相关推荐

  • MySql 三大日志:binlog、redo log 和 undo log

    Keeper导读:日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息.mysql日志主要包括错误日志.查询日志.慢查询日志.事务日志.二进制日志几大类.作为开发,我们重点需要关注的 ...

  • 养老概念掀起涨停潮!三大指数低开高走,后市如何分析——骑牛看熊5月11日淘金收评

    [盘面分析] 周二的盘面表现相对弱势,近期强势的钢铁.煤炭.有色等周期股开盘后大幅度走低,反而是调整较为明显的券商.酿酒板块有所表现,再加上第七次全国人口普查数据正式公布,直接带动了养老概念受到资金的 ...

  • 【追根溯源记单词】 1.4bar的义项分析[视频讲解]

    [追根溯源记单词] 1.4bar的义项分析 1本义 1.11.棒.条(形状特征):(门.窗等的)闩或杠: (炉灶等的)格栅(功能特征)[形状和功能:家里] 2形状特征引申 2.12.(色.光等的)带. ...

  • Word表格行高无法调整?分析原因都在这

    经常在编辑Word表格的时候,遇到很多表格问题,真难!今天给大家分享表格中无法调整行高的这个问题,原来是设置了文字段前段后距离的问题. 解决方法: 选中表格,进入开始-段落,将段前和段后的间距改成0行 ...

  • 龙高股份涨停板的分析

    龙高股份,次新股,涨停板第七天,缺口不破,双针插底,主力护盘明显. 并且有一个极缩阳反包,而极缩阳反包易出妖 ,我们在年初分享的极缩阳反包易成妖股之和胜股份:已经大涨了五十个点. 极缩阳反包是妖股的配 ...

  • 脸上颧骨高的女人面相分析,一定会克夫吗?

    在面相学中,若是女人颧骨相理佳者,则有好的帮夫运.那么,脸上颧骨高的女人面相怎么样呢?面相颧骨中,骨为阳,肉为阴.如果女人脸上的颧骨太高,不是吉相,尤其是尤其是脸小颧高的女人.颧骨是高是低怎么看呢?女 ...

  • 高分辨足底压力分析系统

    高分辨足底压力分析系统,顾名思义,就是指采样频率高 (>100Hz).稳定性和分辨率高的足底压力分析系统.足底压力分析是步态分析的重要环节.人体在正常行走过程中,脚与地面必然产生接触,产生足底压 ...

  • 五分钟学控糖(3):糖尿病患者空腹/餐前血糖高 升糖原因分析

    经过前两节课程的基础知识铺垫,咱们这节课开始讲实战. 五分钟学控糖(1)--控糖基本法:"控糖天平"和升糖.降糖"砝码" 五分钟学控糖(2):糖尿病患者空腹.餐 ...

  • “吴中四才子”之一:祝允明佳作草书墨迹《云江记》,高清

    小知识 明代帝王大都酷爱书法,以书法自娱.丛帖汇刻之风尤胜于往昔,整个明代盛行帖学.明前期的台阁体书法,流行了近百年,日趋表现为板刻.值化,使书法失去了艺术情趣和个人风格.在这种气氛笼罩下,祝允明敢于 ...

  • 罕见!赵孟頫行书《明肃楼记》,高清大图可珍藏!

    赵孟頫行书<明肃楼记>卷,台北故宫博物院藏.从书风看,与赵孟頫晚年作品相近. [释文]<明肃楼记>至元十六年.诏立後卫亲军都督指挥司.设使副签事统选兵万人.车驾所至.常从营白鹰 ...