一、背景
非标导入使用easyexcel组件进行导入处理,10几万的数据量引发CPU彪高。
二、排查思路
- 查看线程栈相关信息;
- pinpoint监控查看性能及代码调用情况;
- 是否存在大量阻塞慢SQL;
- 是否存在短时间内频繁日志输出;
三、问题再现
使用之前分表导入的30万数据进行导入操作,myops查看排名前十线程栈相关信息(如下图),发现lbs_non_standard_account_common单个线程消费占用CPU 8%左右,启动的线程数量很多。
四、改善措施
- AnalysisEventListener的子类CommonImportExcelListener的invoke方法已将近每秒1万的速率迅速完成业务逻辑校验发送MQ,该MQ内部消费进行业务处理逻辑处理;
- 30万的数据将近30秒内发送MQ完成,给消费内部逻辑带来压力导致CPU彪高,使用RateLimiter进行了MQ发送的限流;
- 调整消费者主题“lbs_top” 的maxConcurrent参数(该参数设置为单组启动线程数),单个应用实例启动线程的最大数=maxConcurrent参数* 分组数量;
- 针对lbs_top消费逻辑中的部分业务查询进行内存缓存改造;
五、RateLimiter
高并发之限流-RateLimiter
六、慢sql解决方案
- 增加索引;
- 读写分离;
Mysql读写分离(Mycat版)