如何诊断和解决CPU高度消耗(100%)的数据库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何诊断和解决CPU高度消耗(100%)的数据库相关的知识,希望对你有一定的参考价值。

oracle的性能判断需要综合数据库的多个运行指标来判断: 1、进程数量和占用cpu:这个主要看有没有长时间占用cpu的进行。通常会判断大出sql,需要优化;这个可以用执行计划或者awr报告查看; 2、内存占用:主要用系统命令查看ora_占用和系统 参考技术A

CPU占用过高诊断思路

mpstat -P ALL 1,查看cpu使用情况,主要消耗在sys即os系统调用上

perf top,cpu主要消耗在_spin_lock

生成perf report查看详细情况

CPU主要消耗在mutex争用上,说明有锁热点。

采用pt-pmp跟踪mysqld执行情况,热点主要集中在mem_heap_alloc和mem_heap_free上。

Pstack提供更详细的API调用栈

Innodb在读取数据记录时的API路径为

row_search_for_mysql --》row_vers_build_for_consistent_read --》mem_heap_create_block_func --》mem_area_alloc --》malloc --》  _L_unlock_10151 --》__lll_unlock_wait_private


row_vers_build_for_consistent_read会陷入一个死循环,跳出条件是该条记录不需要快照读或者已经从undo中找出对应的快照版本,每次循环都会调用mem_heap_alloc/free。

而该表的记录更改很频繁,导致其undo history list比较长,搜索快照版本的代价更大,就会频繁的申请和释放堆内存。

Linux原生的内存库函数为ptmalloc,malloc/free调用过多时很容易产生锁热点。

当多条 SQL 并发执行时,会最终触发os层面的spinlock,导致上述情形。


解决方案

将mysqld的内存库函数替换成tcmalloc,相比ptmalloc,tcmalloc可以更好的支持高并发调用。

修改my.cnf,添加如下参数并重启

[mysqld_safe]malloc-lib=tcmalloc

上周五早上7点执行的操作,到现在超过72小时,期间该实例没有再出现cpu长期飙高的情形。

以下是修改前后cpu使用率对比

DBbrain诊断日 | DBA休假,数据库CPU使用率过高怎么办?


为更好的帮助DBA运维数据库,腾讯云将于每月12日在社群直播开展DBbrain诊断日,腾讯云高级产品经理迪B哥直播解析经典数据库运维难题,结合腾讯云数据库智能管家DBbrain的能力,为大家提供问题优化思路和方法,玩转数据库!


本期诊断日主要分享内容:如何使用智能管家DBbrain解决MySQL实例CPU使用率过高的问题?


1


前言



在使用MySQL的过程中,经常会遇到由于数据库性能问题导致的业务故障。对于研发、运营、产品等非运维职能的同事来说,往往更愿意请DBA来协助定位问题和优化。如果公司确有DBA在,那么经验丰富的DBA可能可以依靠经验快速解决某些常见故障,但大多数情况下往往会通过下面“三板斧”进行排查:


1. 网络层面检查

比如是否有网络抖动延迟,偶发性大量丢包或者上联交换机故障等等。


2OS层面的检查

常用检查负载的命令w或者sar -q 1 、通过top查看%us、%wa,sar  -d 、iotop确认磁盘I /O等等。


3数据库层面检查

通过查看processlists、information_schema、slow query、error log等方面溯源问题SQL或者存在的隐患。


对于经验丰富的DBA来说,这“三板斧”早已了然于心,但大多数研发同学为了处理看似简单的数据库问题(现象往往是报错、超时或者业务明显卡顿以及不可用),不仅要面对一系列繁杂的命令、参数,而且更重要的一点是通过这些命令和方法查看到的都是故障的“现场”和“证据”,因此还需要依靠丰富的运维经验去判断和识别,至于处理方法和优化手段更是极度依靠DBA的数据库知识体系和实战经验的。


如果碰巧遇到DBA休假,就算研发同学会使用“三板斧”,真正处理问题的时候也会面面相觑。


莫慌,腾讯云数据库智能管家DBbrain能够轻松帮助客户解决数据库运维问题,是一个可为用户提供数据库性能、安全、管理等功能的智能运维平台。


本文就以“CPU使用率过高”的常见数据库问题为例,通过理论和实践相结合的方式为大家介绍如何使用DBbrain来提高数据库运维效率。


1


DBbrain处理CPU使用率过高的三大法宝



大家都知道数据库CPU使用率过高常常容易导致系统异常,比如响应变慢、无法获取连接、超时(大量的超时重试往往是性能“雪崩”的罪魁祸首)等。而在CPU使用率过高的场景中,很多均是由异常SQL所导致的(大量锁冲突、锁等待或事务未提交也有可能导致实例CPU使用率高)。


简单的分析下CPU使用率过高的原因,当数据库执行业务查询、修改语句时,CPU会先从内存中请求数据块(默认是8kB,可以人工调整)。如果内存中存在对应的数据,CPU执行计算任务后会将结果返回给用户(可能涉及到排序类高消耗CPU的动作)。如果内存中不存在对应的数据,数据库会触发从磁盘获取数据的动作。这两个数据获取过程分别称为逻辑读和物理读。


因此,性能较低的SQL,在执行时容易让数据库产生大量的逻辑读,从而导致CPU使用率过高(也可能让数据库产生大量的物理读,从而导致IOPS和I/O延时过高)。


DBbrain为用户提供了三大法宝来排查和优化导致CPU使用率过高的异常SQL语句:


一. 异常诊断:7*24小时异常发现诊断,提供实时优化建议。


二. 慢SQL分析:针对当前实例的出现的慢SQL进行分析,并给出慢SQL的优化建议。


三. SQL透视:利用云数据库审计数据(全量SQL),多维度深入分析SQL语句并给出优化建议。


下面我们详细介绍每个法宝的使用方法。


一、 使用“异常诊断”功能排查数据库异常


本功能为官方推荐,“异常诊断”功能提供了“傻瓜式”的故障主动定位和优化,不需要数据库运维经验均可理解,而且不仅仅包括CPU使用率过高的异常,几乎涵盖所有数据库高频的异常和故障。


操作步骤及示例如下:


1. 登录腾讯云数据库管理控制台。


2在左侧导航栏中,选择 数据库智能管家DBbrain > 异常诊断,进入异常诊断主页。


3在左上角选择(可输入和搜索)目标实例,切换至目标实例。


4在页面中选择“实时”或“要查询的历史时间”。


5若该时间段内存在故障,可在“诊断提示”中查看到概要信息,可点击查看详情。


6. 单击【查看详情】或【诊断提示】的记录项可进入诊断详情页。


  • 事件概要:包括诊断项、起止时间、风险等级、持续时长、概要等信息。

  • 现象描述:异常事件(或健康巡检事件)的外在表现现象的快照和性能趋势。

  • 智能分析:分析导致性能异常的根本原因,定位具体操作。

  • 专家建议:提供优化指导建议,包括但不限于 SQL 优化(索引建议、重写建议)、资源配置优化和参数调优。


DBbrain诊断日 | DBA休假,数据库CPU使用率过高怎么办?


7. 单击【专家建议,即可查看DBbrain针对该故障给出的优化建议(本例中是SQL语句的优化建议)。本例中的SQL语句执行时缺少对应的索引,导致该语句执行时要进行全表扫描,单次执行成本高,所以大量并发场景下就很容易导致CPU使用率过高,可能会达到100%的状况。

DBbrain诊断日 | DBA休假,数据库CPU使用率过高怎么办?


二、使用“慢SQL分析”功能排查导致CPU使用率过高的SQL


1. 登录腾讯云数据库管理控制台。


2在左侧导航栏中,选择 数据库智能管家DBbrain >慢SQL分析,进入慢SQL分析页。


3在左上角选择(可输入和搜索)目标实例,切换至目标实例。


4在页面中选择要查询的时间。


5若此实例在该时间段中有慢SQL,图示中会以柱形图的方式显示慢SQL产生的时间点和个数。单击柱形图,下方的列表就会显示其对应的所有慢SQL信息(模板聚合之后的SQL),右方会显示该时间段内SQL的耗时分布。

DBbrain诊断日 | DBA休假,数据库CPU使用率过高怎么办?


6. 针对SQL列表中SQL执行的数据进行判断和筛选,下面简单介绍一种判断方式:


  • 先按照平均耗时(或者最大耗时)逆序,重点关注耗时处在top的SQL(不推荐使用总耗时,容易受到执行次数多而累加的干扰。

  • 然后关注返回行数和扫描行数的值。

  • 发现“返回行数”和与“扫描行数”值相等的SQL,大概率是全表查找并返回了。

    DBbrain诊断日 | DBA休假,数据库CPU使用率过高怎么办?

  • 接着发现几行SQL都有很多扫描行数但返回行数都为0或特别小,说明系统产生了大量的逻辑读和物理读。当查找的数据量过大且内存不足时,该请求必然会产生大量物理I/O请求。而且大量的逻辑读会占用大量的CPU资源,导致CPU使用率上涨。

    DBbrain诊断日 | DBA休假,数据库CPU使用率过高怎么办?


7. 单击SQL语句,可查看该SQL语句的详情、资源消耗以及优化建议。


  • 分析页:可查看完整的 SQL 模板、SQL 样例以及优化建议和说明,您可根据 DBbrain 给出的专家建议优化 SQL,提升 SQL 质量,降低延迟。

    DBbrain诊断日 | DBA休假,数据库CPU使用率过高怎么办?

  • 统计页:可根据统计报表的总锁等待时间占比、总扫描行数占比、总返回行数占比,横向分析该条慢 SQL 产生的具体原因,以及进行对应优化。

  • 耗时分布页:可查看该类型的 SQL(进过聚合后汇总的)运行的时间分布区间,以及来源 IP 的访问占比。


三、使用“SQL透视”功能排查导致CPU使用率过高的SQL


1. 登录腾讯云数据库管理控制台。


2在左侧导航栏中,选择 数据库智能管家DBbrain >SQL透视,进入SQL透视页。


3在左上角选择(可输入和搜索)目标实例,切换至目标实例。


前提条件:实例需要开通 数据库审计 功能。如未开通,则在创建 SQL 透视任务时会报如下错误,可单击【一键开通】,完成数据库 SQL 审计的开通和配置。

DBbrain诊断日 | DBA休假,数据库CPU使用率过高怎么办?

4. SQL透视图可选择 QPS 或慢查询次数,单击视图右上角的【创建审计任务】,选择任务开始时间和时间间隔,单击【确定】。任务创建成功后,页面列表中会显示任务生成,任务创建完成后,找到目标记录并单击“查看SQL分析”,进入SQL分析详情页。


DBbrain诊断日 | DBA休假,数据库CPU使用率过高怎么办?



5. 在 SQL 分析页,可选择 SQL Type、Host、User 或 SQL Code 维度的视图,并可选择时间段拉伸视图来查看具体时间点的数据。下面表格中会展示该时间段内 SQL 的聚合详情以及执行信息。若对图中时间进行部分拉伸选中,表格中的 SQL 数据会随之变化,只显示图中时间范围内的 SQL 分析结果。

DBbrain诊断日 | DBA休假,数据库CPU使用率过高怎么办?

6. SQL分析详情页下方表格中展示了聚合后的SQL执行的信息,包括执行次数、总延迟、最大延迟、最小延迟、总影响行数、最大影响行数、最小影响行数等。可根据各项信息的组合排序,识别出待优化的SQL下面列举一个示例:


根据执行次数逆序排列,以定位执行次数较大或者执行次数有异常变化的语句,然后分析SQL执行次数的合理性并根据DBbrain给出的建议优化SQL语句。

DBbrain诊断日 | DBA休假,数据库CPU使用率过高怎么办?


通过查看执行次数、总延迟、最大延迟,可以判断出执行次数最多的前两个SQL语句的平均执行延迟很短,说明这两个SQL语句性能未出现异常。但观察第三条语句就会明显发现其单条执行时间在100s左右,因为执行次数较少,故总延迟未在top前2,但这类SQL是需要进行优化的,可点击SQL查看DBbrain给出的专家建议、资源消耗分析曲线以及来源IP分析等。

DBbrain诊断日 | DBA休假,数据库CPU使用率过高怎么办?


还有一类SQL也需要引起重视,可以看到第四条语句的最大延迟和最小延迟相差很大,达到了200s以上,说明整个系统存在波动,需要进一步分析波动是因为网络问题还是数据量变化导致了执行计划改变。

DBbrain诊断日 | DBA休假,数据库CPU使用率过高怎么办?


如果SQL语句的执行次数和平均耗时相对比较合理,而且执行次数大的SQL也是最优的,那么性能达到瓶颈的话,建议升级实例规格配置或者进行读写分离功能来打散执行次数较大的SQL语句。或者采用前置缓存数据库,例如mc、redis等方式进行优化。


1


避免数据库出现CPU使用率过高的tips



当然,在我们运维过程中,能避免问题的出现肯定比问题出现再去解决好得多,所以给看到这里的小伙伴一些避免数据库出现CPU使用率过高的小妙招


  • 应用设计和开发过程中,要考虑SQL的性能,遵守MySQL优化的一般优化原则,降低查询的逻辑IO,避免复杂和低效的SQL堆砌。

  • 新功能上线前,要使用测试环境数据(尽量仿真)进行SQL性能测试。

  • 对核心数据库实例设置CPU使用率告警(留有余量),CPU使用率保证一定的冗余。

  • 熟悉DBbrain的性能优化类的功能(比如实例概览、异常诊断、慢日志分析等),时刻掌握数据库运行情况。同时DBbrain还提供了SQL限流功能,协助业务进行降级来紧急应对性能洪峰。



DBbrain诊断日 | DBA休假,数据库CPU使用率过高怎么办?

欢迎投稿

DBbrain诊断日 | DBA休假,数据库CPU使用率过高怎么办?

工作中遇到棘手故障不知道怎么办?欢迎投稿到诊断日,被选中的案例将由腾讯云资深专家“会诊”,并在DBbrain诊断日在线分析教学,帮您提供解决方案。投稿即有机会获得企鹅公仔,问题被选中即得腾讯云数据库千元代金券~投稿请关注“腾讯云数据库”官方微信后,回复“投稿”即可




往期推荐




(点击图片即可跳转阅读)



 特惠体验云数据库  




↓↓更多惊喜优惠请点这儿~

以上是关于如何诊断和解决CPU高度消耗(100%)的数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何修复电源powerd100+%CPU使用率 - macOS

如何修复电源powerd100+%CPU使用率 - macOS

如何修复电源powerd100+%CPU使用率 - macOS

如何修复电源powerd100+%CPU使用率 - macOS

Valgrind 挂在 pthread_spin_lock 消耗 100% CPU

JAVA程序占CPU100%,求解决办法!