【问题标题】:Performance tuning CakePHP application性能调优 CakePHP 应用程序
【发布时间】:2010-12-20 18:58:45
【问题描述】:

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

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

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

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

对于easy 提高性能,无需过多挖掘源代码,您有什么建议?

【问题讨论】:

    标签: php performance scaling


    【解决方案1】:

    第 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 以记录对文件和/或数据库表的查询。有一些关于这样做的说明here,尽管我建议注销到平面文件和/或系统日志而不是数据库。将数据库请求记录到数据库将使每次页面加载的查询数量翻倍。

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

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

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

    这表明有人在不了解幕后情况的情况下循环加载模型。

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

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

    在您的生产服务器上运行 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
    

    然后,您可以将任意数量的调试/打印语句放入控制器文件中。如果你“幸运”的话,最初的开发者可能会在控制器文件中卡住很多逻辑。如果是这种情况,您现在可以玩“注释掉一半代码”的游戏了。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 所有 cpu 负载都来自 Apache 进程(最多 30%)。 MySQL 根本不会造成任何负载(始终小于 3%)。实际上问题是我到目前为止无法设置调试环境,该应用程序看起来像是针对该服务器环境定制的:\
        • 30% 在四核系统上?唷。 dnagirl 提到的 Cake 特定调试是否揭示了什么?
        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2016-10-16
            • 1970-01-01
            • 1970-01-01
            • 2017-01-12
            • 1970-01-01
            • 1970-01-01
            • 2011-05-20
            • 1970-01-01
            • 2023-04-08
            相关资源
            最近更新 更多