51dev.com IT技术开发者社区

51dev.com 技术开发者社区

http接口请求超时缓慢问题分析及优化

互联网报道阅读(176)2019-05-28 收藏0次评论

现象

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、当需要批量更新数据时,则进行逐条更新;

2、当需要批量删除数据时,则进行逐条删除;

3、查询数据必须使用分页查询;

归根结底,其实就是应用中sql的问题,当时没想到单表数据量几天就增加到了100多万,需要下架,更新的商品有几十万,而且自己又用了愚蠢的批量删除方法。试想100多万的数据,同时删除几十万条数据,然后一次性commit,这是什么效果。

以上就是http接口请求超时缓慢问题分析及优化的全部内容。

相关内容