出现CPU飙高时操作
出现cpu飙高时使用先试用top命令查看进程,确定是java进程还是mysql 找到进程号
一、如果是mysql进程
1、那么使用mysql终端或者数据库链接工具执行如下sql语句查看正在执行的sql:show processlist
2、查询慢sql,截取慢sql文件前面10000行数据导出来分析
- 开启慢sql
##进入mysql终端 show global variables like '%query%'; #开启慢sql set global slow_query_log=1; #10s以上的sql才记录慢sql set global long_query_time=10;
- 使用mysqldumpslow分析
-s ORDER what to sort by (al, at, ar, c, l, r, t), 'at' is default al: average lock time ar: average rows sent at: average query time c: count l: lock time r: rows sent t: query time -r reverse the sort order (largest last instead of first) -t NUM just show the top n queries -a don't abstract all numbers to N and strings to 'S' -n NUM abstract numbers with at least n digits within names -g PATTERN grep: only consider stmts that include this string -h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard), default is '*', i.e. match all -i NAME name of server instance (if using mysql.server startup script) -l don't subtract lock time from total time
例如:
1、得到返回记录行数最多的1000条SQL语句(行数最多排序需要 -s r ;限制1000条需要 -t 1000)
mysqldumpslow -s r -t 1000 /home/lgx/mysql/mysql-slow.log > /tmp/mysql-slow-tmp.log
2、得到访问次数最多的1000个SQL(访问次数最多排序需要 -s c ;限制1000条需要 -t 1000)
mysqldumpslow -s c -t 1000 /home/lgx/mysql-slow.log > /tmp/mysql-slow-tmp.log
3、得到按照执行时间排序的前10条,且sql语句里面含有左连接的查询语句(执行时间排序需要 -s t;限制10条需要 -t 1000)
mysqldumpslow -s t -t 1000 -g “left join” /home/lgx/mysql-slow.log > /tmp/mysql-slow-tmp.log
3、查询进行中的事务,SELECT * FROM information_schema.INNODB_TRX
二、如果是java进程
1、执行命令查看占用最高的线程 :top -H -p
2、把线程占用最高的id转换为16进制 :printf “0x%x\n”
3、打印线程堆栈 :jstack > /home/finance/jstack.log
4、打开jstack.log 找到步骤3中的十六进制线程号 进行分析 搜索:nid= 找到线程名和代码位置
事后分析
一、mysql
1、分析show processlist 结果中的info查看sql问题,首先使用explain查看执行计划效率,如果效率无问题,查看是否调用频繁比如循环中不停调用
2、分析慢sql使用explain查看执行计划,效率有问题优化sql、优化索引
3、是否有事务死锁,如果有查看原因
二、JAVA
jsatck.log定位到代码后直接分析代码