mysql占用CPU过高解决

背景

        总结一次处理上线问题的经过。大量客户反馈说官方网站无法访问,赶紧登录数据库服务器后,居然数据库cpu飙升到1000%,业务网站无法访问。初步定位由于数据库原因,重启后,很快又飙升到1000%,没办法,只能通过监控数据库性能,定位导致数据库出现问题的语句,在找到使用该语句的接口。监控运行之后,果然发现是由于sql语句效率太低,导致数据库无法正常处理请求。

        项目上线后,会因为数据量大导致mysql cpu占用大,或业务页面卡顿,用户体验不好。需要进行对mysql数据库的监控。通过在数据库服务器运行监控mysql脚本,可以有效定位到出现问题的功能点。在针对mysql中运行的语句进行优化。这时,数据库监控脚本的重要性便体现出来。

准备

        在linux服务器中编写如下脚本文件,注意修改 IP 端口 用户 密码: 

       [root@localhost ~]# vi mysql-detail-status.sh 

mysqladmin -uroot -proot  -r -i 1 ext |\
awk -F"|" \
"BEGIN{ count=0; }"\
'{ if($2 ~ /Variable_name/ && ++count == 1){\
    print "----------|---------|--- MySQL Command Status --|----- Innodb row operation ----|-- Buffer Pool Read --";\
    print "---Time---|---QPS---|select insert update delete|  read inserted updated deleted|   logical    physical";\
}\
else if ($2 ~ /Queries/){queries=$3;}\
else if ($2 ~ /Com_select /){com_select=$3;}\
else if ($2 ~ /Com_insert /){com_insert=$3;}\
else if ($2 ~ /Com_update /){com_update=$3;}\
else if ($2 ~ /Com_delete /){com_delete=$3;}\
else if ($2 ~ /Innodb_rows_read/){innodb_rows_read=$3;}\
else if ($2 ~ /Innodb_rows_deleted/){innodb_rows_deleted=$3;}\
else if ($2 ~ /Innodb_rows_inserted/){innodb_rows_inserted=$3;}\
else if ($2 ~ /Innodb_rows_updated/){innodb_rows_updated=$3;}\
else if ($2 ~ /Innodb_buffer_pool_read_requests/){innodb_lor=$3;}\
else if ($2 ~ /Innodb_buffer_pool_reads/){innodb_phr=$3;}\
else if ($2 ~ /Uptime / && count >= 2){\
  printf(" %s |%9d",strftime("%H:%M:%S"),queries);\
  printf("|%6d %6d %6d %6d",com_select,com_insert,com_update,com_delete);\
  printf("|%6d %8d %7d %7d",innodb_rows_read,innodb_rows_inserted,innodb_rows_updated,innodb_rows_deleted);\
  printf("|%10d %11d\n",innodb_lor,innodb_phr);\
}}

         保存后,授予可执行权限: 

        [root@localhost ~]# chomd 777 mysql-detail-status.sh 

运行

        [root@localhost ~]# ./mysql-detail-status.sh 

分析

       1.分析QPS是否过大,在用户很少的情况下QPS一般不会很高,出现超高情况先排查语句问题

        2.分析 innodb row operation 是否过大。这个是扫描的物理行数,根据需要返回

        3.可以根据接口日志进行定位慢接口何时出现。在通过以上脚本的日志 判断 改接口是否由于语句原因造成。

        4.找到可以重现的业务后,mysql中运行“ show processlist;” 找到当前运行慢的语句。这样针对业务和语句在进行优化,基本cpu占用问题即可解决。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

y打伞的鱼y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值