Discuz 防水墙插件 占用CPU过高问题
这两天帮人解决一个网站运维的问题,问题是CPU的占用率时不时的到达100%。
环境是CentOS 5.2 + MySQL +Apache + PHP ,含有Discuz站(X2.5)和Dede站。
刚开始以为是MySQL或者Apache配置的问题。于是执行了一揽子的优化计划。但是后来就知道,出现这种问题,而且负载量也不高的情况下,肯定是程序出了问题。
应该第一时间记录Apache、MySQL的日志,从中找问题。但是走了弯路,跑到性能优化上去了。
设置MySQL日志,5.5版本的需要设置general-log
log-output=FILE 设置日志用文件存储。
general-log_file = file_path_of_log 设置日志文件保存在那个文件里,(/mnt/mysql/data/mylog.log)
general-log=1 开启general-log 功能。
slow-query-log=1 开启slow-query-log 功能(是对日志的一种筛选,只记录查询时间超过指定值的查询)
log-bin = 0 开启log-bin 功能(不做主从的话一般不需要开启)
最后在MySQL的日志中发现了问题,就是CPU上升到100% 的时候,有一条查询会疯长!!
SELECT authorid FROM pre_forum_thread where tid=69817 ORDER BY tid DESC
而且这条语句之前会有
SELECT tid FROM pre_forum_threadmod where reason='防水墙自动处理' and dateline>360 ORDER BY tid DESC
这说明,Disduz会自动将防水墙过滤的主题搜索出来,然后再找到他们发布者的authorid。这是“防水墙扩展插件1.0“版本的BUG!!
系统中垃圾信息有将近三万多条,所以每次系统触发查询,就一下子三万多条查询涌向MySQL,负载自然就起来了。如果同时触发了多次,
系统基本就死掉了。
解决方法:
1. 清空回收站中的垃圾信息
2. 升级 防水墙 插件到1.5.1版本,升级 防水墙扩展 插件到1.5.1版本
重新运行服务,四个小时,CPU占用率在20%左右,从没超过50%。问题解决!
PS:
1. MySQL 配置文件优化,由于是MyISAM的引擎,因此设置key_buffer_size 378M (内存1G) 等等。
http://www.sudu.us/linux-mysql-optimize/
http://www.fwvv.net/info/2007/12/06/20071206-54032.shtml
2. Apache优化,主要是MPM优化,设置了prefork方式的各种参数。