今天运维突然来找我,说有一台机器上有个mysql进行占用cpu特别厉害,让我看看怎么回事。
我连上这台机器看了下,发现确实如他所说的,有个mysql进程占用cpu达到300%,而且长期居高不下。
很奇怪,这台机器上主要是承担主站的cms访问,一般说来负载都是很低的。
出现这种现象我觉得最有可能是三方面的问题:
1.访问量暴涨,这个是最让人开心的
2.应用故障,比如前端缓存失效,应用频繁重启
3.服务器上发生了io操作,比如拷贝或者传送文件等
当然,除了这些,还有个问题,数据库故障,这个我最不愿意看到,弄不好要停站的。
ok,锁定故障范围,那就一一排查。
1.先看了运维系统的流量图,发现访问量没有明显增长
2.连上前端的机器查看日志,没有发现重启和异常
3.在mysql服务器上top,没有发现其他明显的io操作,wa很低,另外,vmstat 里来看,io读写并不高,反倒是us和sy要高一些。
这样看起来,应该前端应该没事,服务器上也能排除有人违规操作。
那么估计只能是数据库有问题了。
这里有个疑点:
如果数据库上进行了繁重的操作,那么wa通常会比较高,而不是us。
从iostat上来看,机器的读写都很低,那么us的升高可能是mysql在sql解析、索引或者排序等行为引起的,这有可能是有大型sql在执行,像join,select all这些东西。
打开mysql客户端,先看了下processlist,结果发现偶尔才有一两条sql执行,很反常。
退出来看看tcpflow,发现确实没什么请求过来。
这么闲的服务居然会占这么高的cpu?看起来好像是sql有问题。
如果sql有问题的话,那么这种sql一定是很慢的,slow query log里应该有显示吧?
打开log看了一下,发现里面什么都没有。。。
感觉不对劲,又连上mysql,show variables like ‘%quer%’
log_queries_not_using_indexes=OFF
log_slow_queries=OFF
发现这两项都被人关了。。。
set global log_queries_not_using_indexes=on;
set global log_slow_queries=on;
log出来了。
对log分析了一下,结果发现很多sql都是这种状态
# Query_time: 0.002530 Lock_time: 0.000077 Rows_sent: 1 Rows_examined: 54
这说明不是慢查询,应该是没有索引的问题。
进了一个数据库,检查了一下表,问题找到了,所有表居然都没加索引!
我想吐血阿。。。
看了看表不怎么大,于是就把索引补上了,服务器负载立即就下来了。。。
晕到死,总是有这种问题,真不知道以前的开发人员在搞什么,责任心,责任心阿,亲。。。。。