5

我刚刚得到了这个相当大的 CakePHP 应用程序(大约 20k 行代码),它不是很干净而且根本没有文档。该应用程序正在生产中运行,但它的性能确实存在重大问题。

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

当我尝试像这样的小负载测试ab -n 100 -c 10 ...时,它会达到 7000 毫秒的平均响应。但是,我从来没有超过 800MB 的 RAM,所以至少有 6GB 的可用 RAM 用于一些调整。

问题是,我还没有能够创建工作开发实例,所以我必须在生产中调整它......

您有什么建议可以轻松提高性能,而无需过多地挖掘源代码?

4

5 回答 5

14

第 1 步:确保它是应用程序,而不是 Web 服务器

在 Cake 层次结构之外创建一个简单的 hello world 文件

<?php
echo 'Hello World';

看看运行需要多长时间。有时很容易将服务器/网络级别上发生的事情归咎于应用程序。

假设test.php在合理的时间内渲染,继续第二步。

第 2 步:备份所有内容

摆弄生产代码总是一个危险的游戏。在开始之前做一个完整的数据库备份,以防你损坏了无法修复的东西,并复制整个蛋糕目录树。每当您完成一天的工作时,比较生产目录和副本的内容(使用 GUI 工具或命令行)

diff -r production-cake copy-of-cake

第 3 步:数据库几乎总是您使用 LAMP 堆栈的第一个瓶颈

PHP 应用程序会生成大量 SQL 查询,特别是当人们使用隐藏大量实际 SQL 查询的 ActiveRecord 样式模型时。您需要设置 Cake 以记录对文件和/或数据库表的查询。这里有一些关于执行此操作的说明,尽管我建议注销到平面文件和/或系统日志而不是数据库。将 DB 请求记录到数据库将使每页加载的查询数量翻倍。

我还建议添加一个 IP 检查,以便它只记录来自您的 IP 地址的请求。这样,您的日志记录就不会显着干扰应用程序的正常运行。

完成后,发出一个请求,然后查看正在生成的 SQL。寻找一遍又一遍重复的相同查询,作为可以放入一些缓存以提高性能的地方。还要寻找顺序查询

select * from foo where id = 5
select * from foo where id = 6
etc...

这表明有人在循环加载模型而不了解幕后发生的事情。

第 4 步:如果不是数据库,就是系统调用

如果数据库不是瓶颈并且 PHP/Apache 运行正常,那么接下来要寻找的是系统调用。脱壳是完成工作的一种快速而肮脏的方式,但它的操作成本非常高。在一个循环中获取其中的一两个,你就完成了。

在您的生产服务器上运行topps查找正在启动和停止的程序,然后在代码库中搜索这些命令。

第 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-26T20:24:43.737 回答
1

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

于 2009-11-26T19:42:29.623 回答
0

我想你不会绕开一点挖掘,我害怕。您将需要识别瓶颈,至少是导致负载的组件。例如,对索引不佳的 mySQL 表的大量访问可能会使服务器发疯。根据我的经验,这是导致性能问题的常见原因。

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

于 2009-11-26T19:33:45.120 回答
0

问题是,我还没有能够创建工作开发实例

这是您需要解决的问题。让该应用程序与其环境无关地运行(例如,确保所有环境配置都位于一个文件中,并且该文件仅包含环境配置)。一旦你解决了这个问题,你就可以在开发中破解你喜欢的一切。

于 2009-11-26T20:47:27.110 回答
0

要检查您是否受文件系统、内存或 cpu 的约束,请尝试vmstat使用iostat. 对于您的应用程序,如果您还没有这样做,请使用memcachedAPC来加快速度。另外,尝试安装xdebug并分析代码以查看它在哪里运行缓慢。大量的函数调用总是有问题的,执行时间也很长。可能会证明它是您的数据库。也许您可以为一些查询添加缓存。

于 2009-11-26T21:03:02.180 回答