社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

一次业务逻辑优化,竟然解决了MySQL CPU消耗800%的性能问题!

石杉的架构笔记 • 5 年前 • 753 次点击  


公众号后台回复“学习”,获取作者独家秘制精品资料


扫描下方海报二维码,试听课程:

(课程详细大纲,请参见文末)



文章来自头条号:波波说运维


概述

最近接到IDC监控告警说某台服务器cpu过高,下面记录下故障排查的过程,仅供参考,这里主要看思路,细节不重要。


1、观察服务器资源消耗

可以看到服务器表现为cpu问题,内存消耗正常。



1.1、查看具体cpu

ps -mp 2289 -o THREAD,tid,time



1.2、找到耗时最高的线程TID,并将其线程ID转换为16进制格式:

printf "%x\n" tid


1.3、打印线程的堆栈信息,thread dump

jstack pid |grep tid -A 30

进一步分析堆栈信息


2、检查数据库线程

这里发现大概有8个线程,而且都是同一条sql



3、查看sql执行计划

这个单条sql只需要2s就可以跑完,不过看执行计划是走了全表扫描,并没有走索引




4、慢查询分析

set global slow_query_log=on;
set global long_query_time=30;
set global log_output='TABLE';
show variables like '%slow%';
select * from mysql.slow_log order by 1;


以下是因为先开了没有走索引就记录下来,所以可以看到这条sql,但是开了慢查询后并没有超过30s的慢sql.



5、定时任务?

跟开发确认后是有个定时任务,每次都需要去查每个用户的考勤时间,最后再汇总统计,这个定时任务需要跑一天的时间。

这里问题主要是嵌套循环,外层循环遍历工号(8000),内层循环遍历天数(30天),然后内层循环每次查数据都需要去跟数据库做一次交互,在插入数据到缓存,最后汇总计算到汇总表。


6、优化方案

1、汇总表拆分

常用字段划为一张表,不常用字段划分为另一张表,然后常用字段这些只做汇总计算,不走循环,不常用字段(如婚假、病假等)这些走循环。


2、优化单条查询

这个建索引,控制在1s内

--大表建索引,驱动表不建索引
create index idx_hwb1 on t_att_dd_attendance_info(user_id,class_id,check_type,plan_check_time)


3、逻辑优化

这里跟开发提了把逻辑改了,不过开发还没实现,所以就不贴实现代码了。逻辑大致如下:

--目前逻辑
{
 /*外层循环遍历工号*/
 {
 /*内层循环遍历天数*/
 }
}
--优化后的逻辑
{
 /*外层循环遍历天数*/
 {
 /*内层循环遍历工号*/
 }
}


END

如有收获,请划至底部,点击“在看”,谢谢!



《21天互联网Java进阶面试训练营(分布式篇)》详细目录,扫描图片末尾的二维码,试听课程


欢迎长按下图关注公众号石杉的架构笔记

BAT架构经验倾囊相授


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/37784
 
753 次点击