王骏的博客
编程、网络技术点滴...

公告

逐渐将VC知识库的博客迁移到这里!

随笔分类

随笔档案

相册

最新评论

阅读排行榜

评论排行榜

程序员博客   首页  新随笔  订阅  管理  登录 
 
JO2000 阅读(1241) 评论(0)

系统是在ecshop基础上做的定制,siege进行压力测试访问category.php时,50用户100次就使CPU占用率达到100%,系统停止响应。

按照《解决一个 MySQL 服务器进程 CPU 占用 100%的技术笔记 https://www.xiaohui.com/weekly/20070307.htm》一文提供的方法优化了mysql的配置,情况依旧。
因没有SUPER权限,用show processlist;没啥效果,所以只能手工检查代码。

 

includes目录下的cls_mysql.php中的query函数是所有SQL执行时最终调用的函数。当DEBUG_MODE=8时会记录所有sql语句到log文件中。

 

一、发现重复执行的数据库操作函数
执行一次category.php后,得到所有SQL命令,发现里面有大量重复执行的SQL。到底是谁调用了这些SQL命令,在query函数里加上:
if(strpos($sql, '这里填SQL语句的关键词') > 0) {
$array = debug_backtrace();
print_r($array);
}

打印出调用堆栈,比较容易地找到调用源头。发现在一个循环中调用了重复的数据库操作函数,将之移出。

 

二、发现未索引的表
在SQL命令前加上EXPLAIN,例如 EXPLAIN SELECT * FROM ecs_products WHERE product_id=1000; 这样很容易找到索引没有起作用的SQL命令。

 

经过这两项修改,成功地解决了MySQL高并发时CPU占用率达到100%的问题。


打赏作者

如果本文对您有帮助,请打赏支持一下作者,谢谢您!


微信打赏

支付宝打赏

发表评论
切换编辑模式