【案例】RAID卡写策略改变引发的问题

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:
一 现象描述
      开发反馈某产品的agent  的进程hang在某些线程上,查看日志,agent  master 累积很多未处理的消息队列。 在17:00 – 21:00 之间,有一定程度的写入量低峰,猜测可能是写入数据库变慢了,不过从目前得到的信息来看无法完全确定。
"pool-10-thread-12" prio=10 tid=0x000000005f36d000 nid=0x1d81 runnable [0x00000000441de000]
   java.lang.Thread.State: RUNNABLE
     at java.net.SocketInputStream.socketRead0(Native Method)
     .......
     at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:189)
     - locked <0x00002aaab6da9758> (a com.mysql.jdbc.util.ReadAheadInputStream)
    .....
     at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140)
     at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626)
     - locked <0x00002aaab6da9b30> (a java.lang.Object)
     at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2111)
     at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2407)
     at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
     at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
     .......
     at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:619)
     at org.springframework.jdbc.core.JdbcTemplate.batchUpdate(JdbcTemplate.java:866)
     .......
     at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:793)
     at org.apache.mina.core.filterchain.IoFilterEvent.fire(IoFilterEvent.java:71)
     at org.apache.mina.core.session.IoEvent.run(IoEvent.java:63)
  .......
     at org.apache.mina.filter.executor.OrderedThreadPoolExecutor$Worker.run(OrderedThreadPoolExecutor.java:714)
     at java.lang.Thread.run(Thread.java:619)

二 问题分析

    业务代码层面: 查看进程堆栈发现,用于处理 handler 的线程池全部耗尽,并且都在处理数据库的操作 ,导致 agent后续上报的监控数据或者心跳都不能及时被 master接受,agent 也就被hang住!
    数据库层面:检查数据库服务端的max_connections 为1024 远大于应用连接池配置的16。
   分析到这里,简单来看只要加大应用程序的连接池线程数即可!但是思考一下,为什么3个多月运行平稳,反而现在出现异常?agent 等待数据被处理,说明涉及到数据库相关操作处理速度缓慢,而一般响应慢,有以下原因:

1 sql程序不够优化,需要调整索引结构或者应用访问数据库方式,比如增加缓存。
2 os 磁盘IO异常,导致访问数据慢。    
对于 本例 应用为写入型insert 居多,而无优化空间。到服务器上查看IO使用率:{数据}
avg-cpu:  %user   %nice  %system  %iowait  %steal   %idle
              14.31    0.00     4.82        19.67    0.00    61.20
Device:     rrqm/s   wrqm/s  r/s         w/s       rkB/s      wkB/s    avgrq-sz  avgqu-sz     await  svctm   %util
sda          0.02     143.19   18.47    199.18  1487.19  2673.67    38.23    435.77      3.55   3.22     99.5
%util 已经跑满,r/s 为17  。
我们数据库服务器的配置为 12块的300G 的SAS  盘做RAID10,最大可以支撑3k-5k   tps。

root@rac1 # megacli -LDInfo -Lall -aALL  
Adapter 0 -- Virtual Drive Information:
Virtual Disk: 0 (Target Id: 0)
Name:
RAID Level: Primary-1, Secondary-0, RAID Level Qualifier-0
....
Default Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Current Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Access Policy: Read/Write
Disk Cache Policy: Disabled
查看RAID 卡的日志表明,磁盘的io策略由于RAID卡充放电的原因由WB改为WT。 
root@rac1#megacli  -FwTermLog dsply -aALL
11/08/14  3:36:58: prCallback: PR completed for pd=0a
11/08/14  3:36:58: PR cycle complete
11/08/14  3:36:58: EVT#14842-11/03/12  3:36:58:  35=Patrol Read complete
11/08/14  3:36:58: Next PR scheduled to start at 11/10/12  3:01:59 
11/08/14  0:48:04: EVT#14843-11/04/12  0:48:04:  44=Time established as 11/04/12  0:48:04; (25714971 seconds since power on)
11/08/14 15:30:13: EVT#14844-11/05/12 15:30:13: 195=BBU disabled; changing WB virtual disks to WT  ---问题的原因
11/08/14 15:30:13: Change in current cache property detected for LD : 0!
11/08/14 15:30:13: EVT#14845-11/05/12 15:30:13:  54=Policy change on VD 00/0 to [ID=00,dcp=0d,ccp=0c,ap=0,dc=0,dbgi=0,S=0|0] from [ID=00,dcp=0d,ccp=0d,ap=0,dc=0,dbgi=0,S=0|0]
抽丝剥茧之后,明显是磁盘raid 卡充电将磁盘的写策略有write back 修改为write through ,io性能急剧下降导致应用层的线程等待问题。

三 拓展
   介绍一点 RAID 卡知识

   RAID卡都有写cache(Battery Backed Write Cache),写cache对IO性能的提升非常明显,因为掉电会丢失数据,所以必须由电池提供支持。电池会定期充放电,一般为90天左右,当发现电量低于某个阀值时,会将写cache策略从writeback置为writethrough,相当于写cache会失效,这时如果系统有大量的IO操作,可能会明显感觉到IO响应速度变慢,cpu 队列堆积系统load 飙高。
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
2月前
|
弹性计算 负载均衡 定位技术
阿里云服务器ECS【地域】如何选择?不同地域区别及优缺点对比
阿里云服务器地域选择需综合考虑用户地理位置、网络延迟、备案要求、内网互通、价格差异及产品功能等因素。建议根据用户所在地区就近选择地域,以降低延迟、提升访问速度。同时注意地域一旦选定不可更改,需谨慎选择。
|
5月前
|
弹性计算
阿里云服务器公网带宽收费标准:按固定带宽和使用流量计费规则
阿里云ECS公网带宽提供两种计费模式:按固定带宽和按使用流量计费。按固定带宽适合稳定需求场景,费用基于带宽值与使用时长;按使用流量计费适用于波动需求场景,按实际流量线性收费。出网流量收费,入网免费,带宽限制分别为100 Mbps(按流量)和200 Mbps(包年包月)。用户可根据业务特点选择最优方案,结合CDT免费流量额度进一步降低成本。详情参考官方文档。
|
存储 数据采集 数据可视化
认识DataHub:企业级数据管理的第一步
【10月更文挑战第23天】在数字化转型的时代,数据管理成为了企业发展的核心竞争力之一。如何高效地管理和利用海量数据,成为了每个企业都需要面对的问题。DataHub作为一款企业级数据管理平台,以其强大的功能和灵活的架构,为企业提供了一站式的数据管理解决方案。作为一名数据管理爱好者,我将从个人的角度出发,详细介绍DataHub的基本概念、主要功能、应用场景,以及为什么选择DataHub作为数据管理解决方案。此外,我还会提供简单的安装指南和快速入门教程,帮助初学者快速上手使用DataHub。
1357 1
|
数据采集 监控 大数据
不限量住宅IP代理指南2024版
住宅IP代理是一种特别的代理形式,它通过互联网服务提供商(ISP)池获取真实住宅用户的IP地址。在此背景下,住宅IP通常与特定的物理位置绑定,从而在网络上看起来像是真实用户。该服务为企业及个人执行数据密集型活动时提供了可靠的支持
不限量住宅IP代理指南2024版
|
Linux C语言
CentOS 7.8升级gcc-8.2
CentOS 7.8升级gcc-8.2
1223 0
CentOS 7.8升级gcc-8.2
|
1天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
11天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~

热门文章

最新文章