今天早上正在看文档,手机就收到报警了,说是有一个服务器不能访问了,直接登录到服务器上(还好服务器还能登录),利用top看了下发现资源占用不是很多,但是在进程里面发现Tasks: 1560 total,这个服务器一般的进程只是在100~200之间,以前出现过mysql的一个表坏掉造成mysql挂死的情况,于是赶紧查看下mysql的日志,没发现错误,登录到mysql,利用show processlist命令查看,发现队列严重,有1000多个进程等待处理,于是执行:
/usr/local/apache/bin/apachectl stop
mysqladmin -uroot -p shutdown
/etc/rc.d/init.d/mysqld start
/usr/local/apache/bin/apachectl
start
开始正常,继续用top命令查看,发现进程又开始逐渐上升到1000以上,很明显mysql出问题了,另外还发现%wa这项特别高,也就是说io等待很严重,再次重启mysql,利用show full processlist查看mysql处理的进程,并打开另外一个窗口不停的用top查看%wa的大小,反复几次,终于发现有一个语句执行的时候导致%wa在60%以上,下面那个语句就是罪魁祸首:
select distinct tags from tags
where status =0 order by click_count_mo desc limit 50,
单独执行这条语句1分多钟还没执行完,于是断定应该是distinct的效率太低造成的,tags表有200多万的数据,发现问题就好解决了,联系开发,当开发把distinct去掉后,问题解决!原来这个语句是昨天才放到刚建的虚拟主机上的!
感谢下nginx,一台服务器出问题让我可以很从容的处理!呵呵!