复制代码
为懒人提供无限可能,生命不息,code不止
人类感性的情绪,让我们知难行难
首页
前端
后台
数据库
运维
资源下载
实用工具
登录
注册
mysql
【原创】http接口请求超时缓慢问题分析及优化
作者: whooyun
发表于:
2017-12-31 14:31
现象
http接口调用超时,数据返回缓慢,超过4秒的请求非常多,而且半夜12点进行商品大批量(下架数超过10万)下架时,系统直接瘫痪
分析思路
1、有可能是网络问题导致
2、有可能是应用服务问题
3、数据库sql语句问题
4、应用服务器问题
监控操作
1、2017年12月28开始增加spring的HandlerInterceptor拦截器,监控restful风格的http接口调用时长。
2、观察数据库CPU使用率陡增时,使用以下sql
show processlist 查看前100正在执行的线程
show full processlist 查看所有正在执行的线程
show status 查看数据库状态
扩展知识
Aborted_clients 由于客户没有正确关闭连接已经死掉,已经放弃的连接数量。
Aborted_connects 尝试已经失败的MySQL服务器的连接的次数。
Connections 试图连接MySQL服务器的次数。
Created tmptables 当执行语句时,已经被创造了的隐含临时表的数量。
Delayed insertthreads 正在使用的延迟插入处理器线程的数量。
Delayed_writes 用INSERT DELAYED写入的行数。
Delayed_errors 用INSERT DELAYED写入的发生某些错误(可能重复键值)的行数。
Flush_commands 执行FLUSH命令的次数。
Handler_delete 请求从一张表中删除行的次数。
Handler readfirst 请求读入表中第一行的次数。
Handler readkey 请求数字基于键读行。
Handler readnext 请求读入基于一个键的一行的次数。
Handler readrnd 请求读入基于一个固定位置的一行的次数。
Handler_update 请求更新表中一行的次数。
Handler_write 请求向表中插入一行的次数。
Key blocksused 用于关键字缓存的块的数量。
Key readrequests 请求从缓存读入一个键值的次数。
Key_reads 从磁盘物理读入一个键值的次数。
Key writerequests 请求将一个关键字块写入缓存次数。
Key_writes 将一个键值块物理写入磁盘的次数。
Max usedconnections 同时使用的连接的最大数目。
Not flushedkey_blocks 在键缓存中已经改变但是还没被清空到磁盘上的键块。
Not flusheddelayed_rows 在INSERT DELAY队列中等待写入的行的数量。
Open_tables 打开表的数量。
Open_files 打开文件的数量。
Open_streams 打开流的数量(主要用于日志记载)
Opened_tables 已经打开的表的数量。
Questions 发往服务器的查询的数量。
Slow queries 要花超过longquery_time时间的查询数量。
Threads_connected 当前打开的连接的数量。
Threads_running 不在睡眠的线程数量。
Uptime 服务器工作了多少秒。
个人觉得标红项比较有观察意义。
监控结果分析
http接口调用时间长,数据库CPU使用率最高时段项匹配,经show processlist查看有sql语句一直在做updating操作。
发现全表数据70万,需要update的数据超过10万(图只作参考,事情解决后的总结配图而已)
优化策略
1、当需要批量更新数据时,则1000条(具体以数据库性能为准)一批次提交更新;
2、当需要批量删除数据时,则1000条(具体以数据库性能为准)一批次提交删除;
3、查询数据必须使用分页查询;
归根结底,其实就是应用中sql的问题,当时没想到单表数据量几天就增加到了100多万,需要下架,更新的商品有几十万,而且自己又用了愚蠢的批量删除方法。试想100多万的数据,同时删除几十万条数据,然后一次性commit,这是什么效果。