今天运维突然来找我,说有一台机器上有个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

这说明不是慢查询,应该是没有索引的问题。

进了一个数据库,检查了一下表,问题找到了,所有表居然都没加索引!

我想吐血阿。。。

看了看表不怎么大,于是就把索引补上了,服务器负载立即就下来了。。。

晕到死,总是有这种问题,真不知道以前的开发人员在搞什么,责任心,责任心阿,亲。。。。。