告警:IO利用率飚至60%+,请及时排查优化!

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

导读:通常引起IO升高的因素很多,比如高并发或大字段写入、硬盘老化有坏块、Raid卡电池损坏或充放电、硬件自检等都会引起IO升高。本文主要对硬件自检导致的IO问题排查做简要说明。

 
 

 

现象

监控报警,IO最大利用率达60%+,应用TP99超时,成功率降低,如下为当时监控图:

 

 

遇到此问题的排查方向

 

第一, 定时任务导致。

先看时间,是否为定时任务导致,比如备份。如果binlog之前生成较多,过期后自动清理也会导致IO升高,可以通过磁盘空间监控查看。

 

第二,并发较大写磁盘频繁。

一般此问题不会造成IO util 50%以上。如果事物较大或者并发较大,general log或slow log会有记录,我们可以先看下当前线程连接情况,再结合general log或slow log查看是哪些SQL导致。是否需要优化SQL还是控制并发,以及调整数据库刷新频率置成双0模式。

 

第三,硬件因素导致。

IO util 50%以上,很大几率是硬件问题导致,磁盘是否有坏块。最常见的就是Raid卡电池损坏(充放电),如果电池损坏没有开启写缓存,则会直接写磁盘,IO会升高。我们可以通过如下命令检查,除HP服务器外其他采用MegaCli查看硬件信息,HP采用自带hpssacli命令查看,切记不要使用老命令hpacucli,此命令会导致部分HP型号服务器操作系统直接Hang。

 

服务器大多是LSI的MegaRAID卡,MegaCli兼容服务器命令

 

查看磁盘坏块:

\

 

查看缓存策略:

\

 

此种状态为BBU损坏时不写Raid卡缓存

 

修改为BBU损坏时写Raid卡缓存:

\

 

生成自检及电池充放电日志:

\

 

打开物理磁盘缓存:

\

 

HP服务器hpssacli命令

 

HP查看电池状态:

hpssacli ctrl all show status

 

HP查看缓存策略:

hpssacli ctrl all show detail|grep -i Cache

 

查看插槽号和逻辑磁盘号:

hpssacli ctrl all show config detail|egrep -i 'Logical Drive:|slot:'

 

打开物理磁盘缓存:

hpssacli ctrl slot=0 modify drivewritecache=enable

 

查看阵列号及SSDSmartPath:

hpssacli ctrl all show config detail|egrep -i 'Array:|HP SSD Smart Path'

 

SSD需要注意:(打开逻辑缓存需要先关闭SSD Smart Path功能)

hpssacli ctrl slot=0 array A modify ssdsmartpath=disable

 

打开逻辑磁盘缓存:

hpssacli ctrl slot=0 logicaldrive 1 modify caching=enable

 

在没有电池的情况下开启raid写缓存:

hpssacli ctrl slot=0 modify nobatterywritecache=enable

 

设置读写百分比:

hpssacli ctrl slot=0 modify cacheratIO=10/90

 

了解以上服务器命令后,分析三种情况:

 

  • 无Raid卡电池(损坏)

 

查看Raid卡电池状态:

\

 

这种情况,如果没有修改默认WriteCache OK if Bad BBU模式或者No-Battery Write Cache: Enabled,在电池损坏时会转换成WT模式。从而导致IO非常高。

 


\

 

修改成WC模式后,IO使用率可以从99.6%降到2%左右,效果十分显著。

 

但这种情况下存在一个问题:因为没有Raid卡电池保护,即突然断电或者主板故障时会造成数据丢失风险。数据库服务器一般采用双电模式,掉电风险较低,但是主板故障相对较高,所以BBU坏时是否要打开Write Cache,需要根据业务情况综合取舍。

 

  • Raid卡电池处于充放电阶段

 

首先我们先了解BBU充放电原理:

BBU由锂离子电池和电子控制电路组成。锂离子电池的寿命取决于其老化程度,从出厂之后,无论它是否被充电及它的充放电次数多与少,锂离子电池的容量将慢慢的减少。这意味着一个老电池无法像新电池那么持久。也就决定了BBU的相对充电状态(Relative State of Charge)不会等于绝对充电状态(Absolute State of  Charge)。

 

为了记录电池的放电曲线,以便控制器了解电池的状态,例如最大和最小电压等,同时为了延长电池的寿命,默认会启用自动校准模式(AutoLearn  Mode)。在learn cycle期间,Raid卡控制器不会启用BBU直到它完成校准。整个过程大概1小时左右。这个过程中,会禁用WriteBack模式,以保证数据完整性,同时会造成性能的降低。

 

整个Learn Cycle分为三个步骤:

  1. 控制器把BBU电池充满电(该步骤可能是放电后充电或直接充电,如果电池刚好满电,则直接进入第二阶段);

  2. 开始校准, 对BBU电池执行放电;

  3. 放电完成后,完成校准,并重新开始充电,直接达到最大电量,整个Learn Cycle才算完成 。

 

注意:如果第二或第三阶段被中断,重新校准的任务会停止,而不会重新执行。

 

再来说超级电容:

超级电容优于锂电池,采用电容+Flash子板的方式来将非正常掉电后的脏数据刷入Flash中永久保存。超级电容在50℃环境下可以使用5年,而且故障率低,不用例行充放电。目前大部分raid卡厂商也转向使用超级电容+Flash的备电方案。

 

采用MegaCli方式查看电池充放电周期:

\

 

查看充电状态:

\

 

HP查看电容状态:

\


惠普服务器为何没有同类问题?

  1. 目前服务器除了HP服务器Raid卡采用镍氢电池、超级电容外,大部分服务器Raid卡还都采用的是锂电池。

  2. 镍氢电池、超级电容,它没有惰性,并且特性和锂电池不同,它并不需要通过完全放电来校准电量。

  3. 当镍氢电池由于自放电而导致电量降低时到一定程度时(比如80%),阵列卡控制器会感知到这一信息并对电池进行娟流充电以补充失去的电量,整个过程对用户是透明的,也不需要关闭缓存,因此并不会影响IO性能。

 

各品牌服务器充放电周期:

 


\

 

所以,Raid卡电池充放电阶段,会禁用WriteBack模式,以保证数据完整性,同时会造成性能的降低。

 

通过下面命令生成日志,可以查看充放电详细信息:


\

 

  • 服务器硬件自检

 

除了Raid卡电池外,还有一个影响IO的重要因素那就是硬件自检。回到文章前面提到的监控图,同一业务的8台服务器于11月12日凌晨3:00开始IO开始升高,4:00左右达到最高峰IO利用率达70%左右,之后开始下降直至平稳正常。此系统已经平稳运行了很长时间,并没有做什么上线操作。

 

 

因为是凌晨3:00出现,而且备份正好是凌晨3:00开始,首先想到可能是备份导致的IO上升,但是登上服务器检查发现这几组机器并没有部署备份。

 

那么接下来可能会认为这段时间事物量较大,通过监控发现这个时间段并没有大量并发,而且此时间段为业务低峰期,相对访问操作较少。

 

 

开始着手分析硬件,怀疑为Raid卡电池导致,通过命令生成硬件自检及raid卡电池充放电日志1.log和2.log,部分日志内容如下:

 


\

 

 

 

通过分析日志发现,此时Raid卡电池运行正常,也没有进行充放电。而是系统进行了硬件自检,时间是每周六凌晨3:00开始。而且这几台为同一批机器,再查看更久的监控,发现每周六凌晨3:00 都会出现IO较高现象。自检期间IO消耗比较大,如果期间有事物处理,会出现慢SQL、超时等现象,导致TP99报警。

 

问题原因找到了,该如何优化?

 

如果调整的话需进入BIOs修改,因为服务器产品不同,修改方法可能不一样。

 

以DELL、ThinkServer为例:

 

通过ILO  F1进入BIOS,首先需要把BIOS的Legacy修改成UEFI模式:

 

1.进入boot manage修改 boot mode为UEFI Only

 

2.进入Miscellaneous Boot Settings修改Storage OpROM Policy为UEFI Only

 

3.F10保存后重启再进入Boot manage里面可以看到Adapters and UEFI Drivers 选项

 

4.依次进入Controller Management—>Asvanced Controller Management—>Schedule  Consistency Check即可看到一致性检查项:

 

5.修改后,选择Apply Changes,务必执行这一步,选择应用生效

 

6.再把前面的UEFI修改回Legacy模式,否则无法进入操作系统,重启即可

 

7.调整后,结合监控和日志检查,没有再出现凌晨3:00 IO升高现象

 

8.这里的Monthly指的是30天,而不是正常月,所以日期还是不固定9) 调整观察一段时间后,每周六的IO升高现象不再出现,不建议关闭此功能

 

总结

 

杜绝以上问题,需要从服务器初始化就做好:

 

1.调整硬件一致性自检策略,由每周调整为每月,并根据业务情况修改日期。但有一点需要注意,这里的月指的是固定30天,即使调整日期以后还是会错乱。不知道服务器厂商以后是否会修改。

 

2.针对电商来说,618和双11是最大的两个大促,日期相对固定,所以在大促前最好计算一下,是否会赶上,提前做好调整,相对影响更小、更安全。

 

3.修改Raid卡缓存策略

 

WriteBack,ReadAdaptive,Direct,Write Cache if Bad BBU模式:

此模式下存在在BBU有问题时(如电池失效)期间,突然断电或者主板故障都会导致数据丢失风险。

 

WriteBack,ReadAdaptive,Direct,No Write Cache if Bad BBU模式:

在BBU有问题时, 不使用Write Cache。但是可能发生Write Cache策略变更的情况(由WriteBack变成WriteThrough),导致IO性能急剧下降。

 

所以,修改成哪种模式需要结合实际业务来定,建议无论是否有raid卡电池都改成WriteBack,ReadAdaptive,Direct,Write Cache if Bad BBU模式。

 

4.不建议关闭硬件自检,可以适当延长自检周期,通过自检可以及时发现硬件问题,监控更及时。

 

5.不建议关闭Raid卡电池Auto Learn模式,通过这个校准,能延长电池寿命,不作电池校准的Raid卡,电池寿命将从正常的2年降为8个月。

 

6.另外mysql innodb_flush_method建议设成O_DIRECT模式:数据文件的写入操作是直接从mysql innodb buffer到磁盘(raid卡缓存)的,并不用通过OS缓冲,而真正的完成也是在flush这步,日志还是要经过OS缓存。

 

innodb_flush_log_at_trx_commit、sync_binlog改成0模式也会提升IO性能,但数据安全性会大打折扣,所以不到万不得已建议不要调成双0。

原文发布时间为:2017-03-30

本文来自云栖社区合作伙伴DBAplus

 

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
23天前
|
人工智能 Cloud Native Java
云原生技术深度解析:从IO优化到AI处理
【10月更文挑战第24天】在当今数字化时代,云计算已经成为企业IT架构的核心。云原生作为云计算的最新演进形态,旨在通过一系列先进的技术和实践,帮助企业构建高效、弹性、可观测的应用系统。本文将从IO优化、key问题解决、多线程意义以及AI处理等多个维度,深入探讨云原生技术的内涵与外延,并结合Java和AI技术给出相应的示例。
81 1
|
3月前
|
缓存 Linux 调度
[kvm]硬盘IO优化
[kvm]硬盘IO优化
|
5月前
|
Java 开发者
Java IO流实战技巧:如何优化InputStream/OutputStream和Reader/Writer的使用?
【6月更文挑战第26天】Java IO流优化涉及缓冲、资源管理、字符编码和流式处理。使用Buffered流提高读写效率,如`BufferedInputStream`和`BufferedReader`。确保资源关闭使用try-with-resources,如`try (InputStream is = ...) {...}`。处理文本时指定编码,如`InputStreamReader(is, StandardCharsets.UTF_8)`防止乱码。流式处理大文件,分块读写避免内存溢出,以减少内存占用。这些技巧能提升程序性能和健壮性。
234 0
|
5月前
|
SQL 数据处理 API
实时计算 Flink版产品使用问题之holo的io以及cpu使用较为稳定,sink端busy一直在20%左右,有时候50%,该如何优化
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
Java 大数据 数据库
【Spring底层原理高级进阶】Spring Batch清洗和转换数据,一键处理繁杂数据!Spring Batch是如何实现IO流优化的?本文详解!
【Spring底层原理高级进阶】Spring Batch清洗和转换数据,一键处理繁杂数据!Spring Batch是如何实现IO流优化的?本文详解!
|
6月前
|
NoSQL Java Linux
【Linux IO多路复用 】 Linux 网络编程 认知负荷与Epoll:高性能I-O多路复用的实现与优化
【Linux IO多路复用 】 Linux 网络编程 认知负荷与Epoll:高性能I-O多路复用的实现与优化
183 0
|
6月前
|
Rust
【一起学Rust · 项目实战】命令行IO项目minigrep——重构优化模块和错误处理
【一起学Rust · 项目实战】命令行IO项目minigrep——重构优化模块和错误处理
68 0
|
6月前
|
监控 分布式数据库 流计算
Flink 异步IO优化任务
Flink 异步IO优化任务
90 0
|
移动开发 Java 数据处理
深入理解Java IO流:补充和优化
深入理解Java IO流:补充和优化
网络通信优化-传统IO流及如何优化IO操作
网络通信优化-传统IO流及如何优化IO操作
108 0