性能调优CakePHP应用程序

性能调优CakePHP应用程序,php,performance,scaling,Php,Performance,Scaling,我刚刚得到一个相当大的CakePHP应用程序(大约2万行代码),它不是很干净,也没有任何文档。该应用程序正在生产中运行,但在性能方面确实存在重大问题 服务器为四核,8GB内存,但该应用程序只能处理大约3-4个请求/秒,这是非常糟糕的。每个请求占用所有四个CPU的20-30% 当我尝试像ab-n100-c10…这样的小负载测试时,它的平均响应达到7000ms。然而,我从来没有使它超过800MB的内存,所以至少有6GB的空闲内存进行一些调整 问题是,我还不能创建工作开发实例,所以我必须在生产环境中对

我刚刚得到一个相当大的CakePHP应用程序(大约2万行代码),它不是很干净,也没有任何文档。该应用程序正在生产中运行,但在性能方面确实存在重大问题

服务器为四核,8GB内存,但该应用程序只能处理大约3-4个请求/秒,这是非常糟糕的。每个请求占用所有四个CPU的20-30%

当我尝试像
ab-n100-c10…
这样的小负载测试时,它的平均响应达到7000ms。然而,我从来没有使它超过800MB的内存,所以至少有6GB的空闲内存进行一些调整

问题是,我还不能创建工作开发实例,所以我必须在生产环境中对其进行调整


您推荐什么方法可以轻松提高性能,而不必过多地挖掘源代码?

我想您恐怕不会有太多的挖掘。您需要确定瓶颈,至少是导致负载的组件。例如,对索引较差的mySQL表的大量访问会让服务器非常疯狂。根据我的经验,这是经常出现性能问题的原因


最好的办法是设置一个调试/分析环境,但是服务器的进程列表应该已经能够让您大致了解是谁造成了这种压力。它真的是PHP进程,还是有任何数据库活动?

您可以在
app/config/core.PHP
中设置调试级别,然后查看发生了什么。缺点是你的所有用户都可以。启用调试后,您将很容易看到缓慢的查询。除此之外,打开SQL慢速查询日志并将截止值设置得相对较低(因为Cake喜欢做很多很多查询来回答看似简单的问题)。

步骤1:确保是应用程序,而不是web服务器 在蛋糕层次结构之外创建一个简单的hello world文件

<?php
echo 'Hello World';
步骤3:数据库几乎总是LAMP堆栈的第一个瓶颈 PHP应用程序生成大量SQL查询,尤其是当人们使用ActiveRecord样式的模型时,它隐藏了大量实际的SQL查询。您需要设置蛋糕,以便将查询记录到文件和/或数据库表中。虽然我建议注销到一个平面文件和/或系统日志,而不是数据库,但还是有一些关于这样做的说明。将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
然后,您可以在控制器文件中抛出任意数量的调试/打印语句。如果你“幸运”,最初的开发人员可能在控制器文件中塞满了很多逻辑。如果是这种情况,你现在可以玩“注释掉一半代码”的游戏了

问题是,我还不能创建工作开发实例


这是你需要解决的问题。使该应用程序不受环境影响地运行(例如,确保所有环境配置都位于一个文件中,并且该文件仅包含环境配置)。一旦您解决了这个问题,您就可以在开发过程中随意使用。

要检查您是否受文件系统、内存或cpu的约束,请尝试
vmstat
iostat

对于你的应用程序,如果你还没有这样做,请使用或加快速度。此外,请尝试安装并分析代码,以查看其速度较慢的地方。大量的函数调用总是可疑的,执行时间长也是如此。可能是你的数据库。也许您可以在一些查询中添加缓存。

所有cpu负载都来自Apache进程(高达30%)。MySQL根本不会导致任何负载(始终小于3%)。事实上,问题是到目前为止我还无法设置调试环境,该应用程序看起来像是为该服务器环境定制的:\30%在四核系统上?呼。dnagirl提到的特定于蛋糕的调试是否揭示了什么?
http://www.example.com/debugposts/methodName