当前位置: 首页 > news >正文

数据库系统load飙高问题解决思路

工作过程中有时候会接收到数据库服务器器load 飙高的报警,比如:
 load1 15.25 base: 8.52,collect time:2014-08-30
如何处理load 异常飙高的报警呢? 本文尝试从原理,原因,解决方法来阐述这类问题的解决思路。

一 原理分析
     CPU作为服务器的关键资源经常成为性能瓶颈的根源,CPU使用率高并不总是意味着CPU工作繁忙,它有可能是正在等待其他子系统。在进行性能分析时,将所有子系统当做一个整体来看是非常重要的,因为在子系统中可能会出现瀑布效应。衡量CPU 系统负载的指标是load,load 就是对计算机系统能够承担的多少负载的度量,简单的说是进程队列的长度。简单的例子比如食堂有五个窗口,当有小于五个学生来打饭,五个窗口都能及时处理,但是当学生个数超过5个,必然会出现等待的学生。请求大于当前的处理能力,会出现等待,引起load升高。
Load Average 就是一段时间(1min,5min,15min)内平均Load。平均负载的最佳值是1,这意味着每个进程都可以在一个完整的CPU 周期内完成。
14:50:31 up 166 days,  1:54, 295 users,  load average: 0.05, 0.04, 0.00

二 原因分析
   
   一般导致MySQL服务器load飙高的原因可能有以下几种情况:
    1 业务并发调用全表扫描/带有order by 排序的SQL语句.
    2 SQL语句没有合适索引/执行计划出错/update/delete where扫描全表,阻塞其他访问相同表的sql执行.
    3 存在秒杀类似的业务比如聚划算10点开团或者双十一秒杀,瞬时海量访问给数据库带来冲击。
    4 数据库做逻辑备份(需要全表扫描)或者多实例的压缩备份(压缩时需要大量的cpu计算,会导致系统服务器load飙高)
    5 磁盘写入方式改变 比如有writeback 变为 write through
       RAID卡都有写cache(Battery Backed Write Cache),写cache对IO性能的提升非常明显,因为掉电会丢失数据,所以必须由电池提供支持。
       电池会定期充放电,一般为90天左右,当发现电量低于某个阀值时,会将写cache策略从writeback置为writethrough,相当于写cache会失效,这时如果系统有大量的IO操作,可能会明显感觉到IO响        应速度变慢,cpu 队列堆积系统load 飙高。
    6 其他 欢迎补充 。

三 解决方法
   
    在Load average 高的情况下如何鉴别系统瓶颈?如何判断系统是否已经Over Load呢?要去检查判断是CPU不足,还是io不够快造成或是内存不足?
这里笔者处理的方式 一般根据cpu数量去判断,也就是Load平均要小于CPU的数量,负载的正常值在不同的系统中有着很大的差别。在单核处理器的工作站中,1或2都是可以接受的。多核处理器的服务器(比如24核)上,load 会到达20 ,甚至更高。以多实例混合公用一台24核物理机为例,当DBA收到数据库服务器load 飙高报警后,一般的处理步骤
   
 a) 数据库层面

     1 top -u mysql -c 检查当前占用cpu资源最多的进程命令。-c 是为了显示出进程对应的执行命令语句,方便查看是什么操作导致系统load飙高。
     2 根据不同的情况获取pid 或者MySQL的端口号
     3 如果是MySQL 数据库服务导致laod 飙高,则可以使用如下命令
         show processlist;
         SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND <> 'sleep' AND TIME>100;
        或
         orzdba 工具检查逻辑读/thread active的值。用法orzdba --help
         orztop 工具检查当前正在执行的慢sql,用法orztop -P $port 
     4 获取异常的sql之后,剩下的比较好解决了。结合第一部分中的几条原因
        a 选择合适的索引
        b 调整sql 语句 比如对应order by 分页采用延迟关联
        c 业务层面增加缓存,减少对数据库的直接访问等

 b) OS 系统层面 检查系统IO
    使用iostat 命令查看r/s(读请求),w/s(写请求),avgrq-sz(平均请求大小),await(IO等待), svctm(IO响应时间)
    r/s ,w/s是每秒读/写请求的次数。
    util是设备的利用率。如果它接近100%,通常说明设备能力趋于饱和(并不绝对,比如设备有写缓存)。有时候可能会出现大于100%的情况,这多半是计算时四舍五入引起的。
    svctm是平均每次请求的服务时间。这里有一个公式:(r/s+w/s)*(svctm/1000)=util。举例子:如果util达到100%,那么此时  svctm=1000/(r/s+w/s),假设IOPS是1000,则svctm大概在1毫秒左右,如果长时间大于这个数值,说明系统出了问题。
    await是平均每次请求的等待时间。这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
  avgqu-sz是平均请求队列的长度。毫无疑问,队列长度越短越好。

四 参考资料

[1] the system Load is a measure of the amount of work that a compute system is doing 
[2] unix Load Average Part1:How It Works
[3] understanding-load-averages 
[4] 延迟关联解决order by 性能问题
[5] RAID磁盘写策略改变导致的故障
[6] Unix/Linux 的 Load 初级解释
 
   http://blog.itpub.net/22664653/viewspace-1262635/

转载于:https://www.cnblogs.com/zping/p/11175616.html

相关文章:

  • mysql中的union用法
  • loadfrom 与 loadfile 区别
  • 调研:“淘宝村”、“网店村”是如何发家的?
  • python-元组
  • 关于Kubernetes Master高可用的一些策略
  • K8S集群Master高可用实践
  • 【转载】使用宝塔对Linux系统进行界面化管理操作
  • Layui 获取表单提交数据
  • Spring 自动代理
  • MyBatis原理总结(代码实现流程)
  • (转)mysql使用Navicat 导出和导入数据库
  • 鼻炎、鼻窦炎可尝试药膳
  • node自定义模块的路径查找
  • Keras(七)Keras.layers各种层介绍
  • mysql优化过程中遇见的坑(mysql优化问题特别注意)
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【React系列】如何构建React应用程序
  • 4个实用的微服务测试策略
  • css的样式优先级
  • extjs4学习之配置
  • in typeof instanceof ===这些运算符有什么作用
  • Spring Cloud Feign的两种使用姿势
  • Vue 2.3、2.4 知识点小结
  • VuePress 静态网站生成
  • 将 Measurements 和 Units 应用到物理学
  • 利用DataURL技术在网页上显示图片
  • 入手阿里云新服务器的部署NODE
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​水经微图Web1.5.0版即将上线
  • #vue3 实现前端下载excel文件模板功能
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (06)金属布线——为半导体注入生命的连接
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C语言)fread与fwrite详解
  • (c语言)strcpy函数用法
  • (二十三)Flask之高频面试点
  • (三)模仿学习-Action数据的模仿
  • (十八)SpringBoot之发送QQ邮件
  • (数据结构)顺序表的定义
  • (学习日记)2024.02.29:UCOSIII第二节
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (原創) 未来三学期想要修的课 (日記)
  • (转)创业的注意事项
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .NET Framework杂记
  • [20171113]修改表结构删除列相关问题4.txt
  • [Android]创建TabBar
  • [Angular] 笔记 18:Angular Router
  • [C++]打开新世界的大门之C++入门
  • [HeMIM]Cl,[AeMIM]Br,[CeEIM]Cl,([HO-PECH-MIM]Cl,[HOOC-PECH-MIM]Cl改性酚醛树脂
  • [JS入门到进阶] 7条关于 async await 的使用口诀,新学 async await?背10遍,以后要考!快收藏
  • [Kubernetes]8. K8s使用Helm部署mysql集群(主从数据库集群)