0、背景
首先定位到mysql 的cpu使用率较高
原因是任务域的作业实例补偿定时任务相关sql查询问题,该sql 2min执行一次,一次查询两次,导致cpu飙升,可考虑优化sql,添加以下索引
ALTER TABLE
`scheduler`.`tbl_simba_os_scheduler_job_instance`
ADD
INDEX idx_modify_time (`modify_time`) USING BTREE,
ALGORITHM = INPLACE,
LOCK = NONE;
ALTER TABLE
`scheduler`.`tbl_simba_os_scheduler_job_instance`
ADD
INDEX idx_timing_time (`timing_time`) USING BTREE,
ALGORITHM = INPLACE,
LOCK = NONE;
1、top
这里数据是波动的,可持续观察一段时间,检查cpu飙升情况
查询某个进程cpu使用情况:top -Hp pid
2、pidstat -u 查看一下CPU使用率
每秒cpu的使用率
pidstat -t -p 2977 查看mysql 线程使用的cpu,4个cpu,总共占用了28%的cpu
3、 用root账号登录mysql,查看这个线程使用的语句
SELECT * FROM performance_schema.threads WHERE THREAD_OS_ID = 24352 OR THREAD_OS_ID = 24353\G
查询mysql运行的当前的进程:
select * from information_schema.PROCESSLIST where info is not null \G;
4、若无法定位sql,可结合服务内部cpu情况,定位占用cpu较高的sql
这里使用arthas定位服务占用cpu百分数
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
选择进程后,执行dashboard,即可查看整个服务的资源占用和gc等信息。
观察到有两个线程占用cpu较高,且持续增加,进入代码查询执行的sql,结合第3步,定位异常sql