最近我的服务器CPU经常占用到100%,如图:
遇到这种情况,网站打不开不说,还搞的MySQL数据库崩溃好几次,幸亏之前有一篇教程《一次InnoDB引擎MySQL数据库的恢复过程》,数据还没有弄丢。服务器配置也不低了,出现这种情况,排查下来应该是MySQL数据库没优化好。网上参考了不少资料,按照如下方法予以解决:
首先,Shell登入数据库:
mysql -uroot -p
输入密码,进入mysql>
在网站最卡的时候,输入
show processlist;
查看进程,发现SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes' 一直提示Writing to net,一直卡在这里,这是不能忍受的。
很清晰的看到这条SQL查询没有使用到索引,进入到wp_options表结构查看索引情况,果然没有把autoload列加入到索引中,所以解决方法很简单,只要把autoload列添加索引就能解决了,语句如下:
ALTER TABLE wp_options ADD INDEX autoload USING BTREE (autoload);
PS:MySQL 索引相关命令:
ALTER TABLE wp_options ADD INDEX autoload USING BTREE (autoload); #增加索引 ALTER TABLE wp_options DROP INDEX autoload; #删除索引 SHOW INDEX FROM wp_options; #列出索引
我们再来看下这条SQL语句的执行计划:
EXPLAIN SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes';
至此,性能优化完成,虽然还不知道WordPress在什么情况下会执行此条语句,但可以确定的是在其最新版本上也是没有添加该索引的。
后续优化:
我们还需要到 /etc 目录下,找到my.conf 文件,将 max_allowed_packet = 1M 更改为 max_allowed_packet = 20M,然后重启服务器即可。
再看看服务器负载,整个世界清静了:)