客户购买的服务器配置为CentOS  6.5 64位 军哥lnmp1.2 CPU: 1核    内存: 1024 MB,服务器上只运行了一个WordPress网站,安装了水煮鱼的微信机器人高级版插件,最近出现的问题是,通过微信查看积分排行时提示“该公众号暂时无法提供服务,请稍后再试”,此时再访问网站,发现网站打开速度明显变慢。通过top命令查看服务器端,mysql竟然占用了CPU高达90%度,对于VPS接触不是很久,百度各种方法尝试,最终发现使用下面方法设置后CPU使用率明显降低。

通过终端登录mysql
mysql -u root -p
输入密码后查看查找负荷最重的 SQL 语句

mysql> show processlist;
+-----+-----------+-----------------+---------+---------+------+--------------+-                                                                                        --------------------------------------------------------------------------------                                                                                        ---------------------+
| Id  | User      | Host            | db      | Command | Time | State        |                                                                                         Info                                                                                                                                                                                         |
+-----+-----------+-----------------+---------+---------+------+--------------+-                                                                                        --------------------------------------------------------------------------------                                                                                        ---------------------+
| 197 | gateway00 | localhost:34773 | gateway | Query   |  415 | Sending data |                                                                                         SELECT SQL_CALC_FOUND_ROWS wut.*, wct.credit FROM  wp_weixin_users wut LEFT JOIN                                                                                         wp_weixin_credits w |
| 201 | gateway00 | localhost:34786 | gateway | Query   |  409 | Sending data |                                                                                         SELECT SQL_CALC_FOUND_ROWS wut.*, wct.credit FROM  wp_weixin_users wut LEFT JOIN                                                                                         wp_weixin_credits w |
| 202 | gateway00 | localhost:34793 | gateway | Query   |  404 | Sending data |                                                                                         SELECT SQL_CALC_FOUND_ROWS wut.*, wct.credit FROM  wp_weixin_users wut LEFT JOIN                                                                                         wp_weixin_credits w |
| 213 | root      | localhost       | NULL    | Query   |    0 | NULL         |                                                                                         show processlist                                                                                                                                                                             |
+-----+-----------+-----------------+---------+---------+------+--------------+-                                                                                        --------------------------------------------------------------------------------                                                                                        ---------------------+
4 rows in set (0.00 sec)

先简单分析一下各列的含义和用途,第一列,id,一个标识,你要kill一个语句的时候很有用。user列,显示单前用户,如果不是root,这个命令就只显示你权限范围内的sql语句。host列,显示这个语句是从哪个ip的哪个端口上发出的。呵呵,可以用来追踪出问题语句的用户。db列,显示这个进程目前连接的是哪个数据库 。command列,显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接(connect)。time列,此这个状态持续的时间,单位是秒。state列,显示使用当前连接的sql语句的状态,很重要的列,后续会有所有的状态的描述,请注意,state只是语句执行中的某一个状态,一个sql语句,已查询为例,可能需要经过copying to tmp table,Sorting result,Sending data等状态才可以完成,info列,显示这个sql语句,因为长度有限,所以长的sql语句就显示不全,但是一个判断问题语句的重要依据。

从分析结果看出,前三个状态的持续时间太高了,严重消耗mysql服务器资源(主要是cpu, 内存),并可能导致mysql崩溃。那么试着修改一下等待的时间是不是就可以解决问题了。

查看等待时间

mysql> show global variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+
1 row in set (0.00 sec)

重新定义这个值
mysql> set global wait_timeout=200;
退出mysql并重新启动此服务,运行一段时间了,暂时没有发现前面的问题再次出现
mysql> exit
[root@root]# service mysql restart