问题
最近上线的服务,业主反应经常系统用着用着就特别卡顿,整个页面都出不来。
最开始以为是Java OOM,因为查看日志,各种方法执行的的确是慢。
但奇怪的是Java也上了-XX:+HeapDumpOnOutOfMemoryError 堆转储参数,也并没有打印dump日志。
因为正式环境临时提供的服务器,Java和MySQL部署在同一台机器上,打开任务管理器一看,好家伙,MySQL进程直接干满了!
排查
找出是哪些语句占用了大量CPU
show full processlist
果然,有几个Time列是 8000
多的,Command是Query
的,State是sending data
的语句(我这里是把8000多的那几条给kill掉了)
也就说明了这几个语句:正在处理select查询,并且一边处理数据一边在发送客户端的路上,用了8000多秒。
再看查询的表,大表视图,百万级别表级联,找到罪魁祸首了。
show processlist 的首列id就是线程id,找到原因记得先kill掉,别影响使用。
解决
一般这种视图就是废了,8000多秒都查不出来,基本没啥存在意义,没什么好的办法,就是维护一张单表,数据变动的时候异构进这张单表。
避免这种长时间查询,带来的CPU占用,配置了mysql参数
设置一个最大查询时间,超过了最大语句执行时间,查询执行就会被中断
max_execution_time