我刚刚得到了一个相当大的CakePHP应用程序(大约20k行代码),它不太干净,根本就没有文档。该应用程序正在生产中运行,但它在性能方面确实存在很大的问题。
服务器是具有8GB内存的Quad内核,但是这个应用程序只能处理3-4个请求/s,这是非常糟糕的。每个请求占所有四个CPU的20-30% .
当我尝试像ab -n 100 -c 10 ...这样的小负载测试时,平均响应会上升到7000 to。然而,我从来没有超过800 6GB的RAM,所以有至少6GB的空闲RAM进行一些调整。
问题是,我还不能创建工作开发实例,所以我必须在生产中调整它.
您建议怎样才能轻松地提高性能,而不需要过多地钻研源代码呢?
发布于 2009-11-26 20:24:43
步骤1:确保它是应用程序,而不是web服务器
在Cake层次结构之外创建一个简单的hello world文件
<?php
echo 'Hello World';看看要多长时间才能跑。有时,很容易将服务器/网络级别上发生的事情归咎于应用程序。
假设test.php在合理的时间内呈现,则继续进行第二步。
第二步:把所有的东西都放回去
篡改生产代码总是一种危险的游戏。在开始执行完整的数据库备份之前,如果您损坏了一些无法修复的内容,并复制整个蛋糕目录树。无论何时完成,都要区分生产目录和副本的内容(使用GUI工具或命令行)
diff -r production-cake copy-of-cake步骤3:数据库几乎总是您使用LAMP堆栈的第一个瓶颈
PHP应用程序生成大量的SQL查询,特别是当人们使用ActiveRecord样式模型时,该模型隐藏了大量实际的SQL查询。您需要将Cake设置为将查询记录到文件和/或数据库表。尽管我建议登录到一个平面文件和/或syslog,而不是数据库,但还是有一些关于这里的说明。将DB请求记录到数据库将使每页加载的查询数增加一倍。
我还建议添加一个IP检查,以便它只记录来自IP地址的请求。这样,日志记录不会严重影响应用程序的正常运行。
设置好之后,发出一个请求,然后查看正在生成的SQL。寻找相同的查询被重复一遍又一遍,作为一个地方,您可以插入一些缓存,以获得一个性能提升。还可以查找顺序查询。
select * from foo where id = 5
select * from foo where id = 6
etc...这表明有人在循环中加载模型,而不了解幕后发生了什么。
步骤4:如果不是数据库,则是系统调用
如果数据库不是yoru瓶颈,而且PHP/Apache运行正常,那么接下来要查找的是系统调用。炮击是一种快速而肮脏的方式来完成任务,但这是一个非常昂贵的操作。把其中的一两个循环起来,你就完蛋了。
在生产服务器上运行top或ps,查找正在启动和停止的程序,然后在代码库中搜索这些命令。
步骤4:复制每个控制器
你会有很多控制器
/app/controllers/posts_controller.php
/app/controllers/other_controller.php
etc...它将对应于URL
http://www.example.com/posts/methodName
http://www.example.com/other/methodName
etc...每当您需要调试一个特定的请求以找出为什么如此慢时,请创建控制器的副本。
/app/controllers/debugposts_controller.php并手动发出请求。
http://www.example.com/debugposts/methodName然后,您可以向控制器文件中抛出任意数量的调试/打印语句。如果您是“幸运的”,最初的开发人员可能在控制器文件中阻塞了很多逻辑。如果是这种情况,你现在就可以玩“注释掉一半代码”的游戏了。
发布于 2009-11-26 19:42:29
您可以在app/config/core.php中设置调试级别,并查看正在发生的事情。缺点是,你的所有用户也是如此。随着调试的进行,您将很容易看到缓慢的查询。否则,打开SQL慢速查询日志并设置相对较低的截止值(因为Cake喜欢做很多很多查询来回答看似简单的问题)。
发布于 2009-11-26 19:33:45
恐怕你不会随便挖点东西了。您将需要识别瓶颈,至少是导致负载的组件。例如,大量访问索引不佳的mySQL表可能会使服务器非常疯狂。在我的经验中,这是经常出现性能问题的原因。
真正最好的做法是设置调试/分析环境,但是服务器的进程列表应该已经能够给出造成这种压力的大致情况。它真的是PHP进程吗,还是有任何数据库活动?
https://stackoverflow.com/questions/1805317
复制相似问题