我刚刚得到了这个非常大的CakePHP应用程序(约20k行代码),这不是很干净,根本就没有文档。该应用程序正在生产中运行,但它在性能方面确实存在严重问题。
服务器是四核,内存为8GB,但该应用程序只能提供约3-4个请求/秒,这非常非常糟糕。每个请求大约占所有四个CPU的20-30%。
当我尝试像ab -n 100 -c 10 ...
这样的小负载测试时,平均响应达到7000毫秒。但是,我从来没有超过800MB的RAM,所以至少有6GB的可用内存用于一些调整。
问题是,我还没有能够创建工作开发实例,所以我必须在生产中调整它...
你建议 easy 提高性能,而不需要过多地挖掘源代码?
答案 0 :(得分:14)
在Cake层次结构
之外创建一个简单的hello world文件<?php
echo 'Hello World';
看看运行需要多长时间。有时很容易将应用程序归咎于在服务器/网络级别上发生的事情。
假设test.php
在合理的时间内呈现,请继续执行第二步。
摆弄生产代码总是一个危险的游戏。在开始之前,请执行完整数据库备份,以防损坏无法修复的内容,并复制整个cake目录树。无论何时完成,都要生成生产目录和副本的内容(使用GUI工具或命令行)
diff -r production-cake copy-of-cake
PHP应用程序生成大量SQL查询,尤其是当人们使用隐藏了大量实际SQL查询的ActiveRecord样式模型时。您需要将Cake设置为将查询记录到文件和/或数据库表。虽然我建议注销平面文件和/或syslog而不是数据库,但是有一些指令here。将数据库请求记录到数据库将使每页加载的查询数量翻倍。
我还建议添加IP检查,以便它只记录来自您IP地址的请求。这样,您的日志记录不会显着干扰应用程序的常规运行。
一旦到位,请发出一个请求,然后查看正在生成的SQL。寻找一遍又一遍地重复的相同查询,作为一个可以放入一些缓存以获得性能提升的地方。还要查找顺序查询
select * from foo where id = 5
select * from foo where id = 6
etc...
这表明某人在循环中加载模型而不了解幕后发生的事情。
如果数据库不是yoru瓶颈且PHP / Apache运行正常,那么接下来要查找的是system calls。脱壳是一种快速而肮脏的方式来完成工作,但它是一项非常昂贵的操作。在循环中获得其中一个或两个,你已经完成了。
在生产服务器上运行top
或ps
,查找正在启动和停止的程序,然后在代码库中搜索这些命令。
你将拥有许多控制器
/app/controllers/posts_controller.php
/app/controllers/other_controller.php
etc...
将对应于网址
http://www.example.com/posts/methodName
http://www.example.com/other/methodName
etc...
每当您需要调试某个特定请求以找出为什么时它是如此之慢,请制作控制器的副本。
/app/controllers/debugposts_controller.php
并手动发出请求
http://www.example.com/debugposts/methodName
然后,您可以将任意数量的调试/打印语句丢入控制器文件中。如果你“幸运”,原始开发人员可能会在控制器文件中堵塞很多逻辑。如果是这种情况,你现在可以玩“注释掉一半代码”游戏了。
答案 1 :(得分:1)
您可以在app/config/core.php
中设置DEBUG等级,看看发生了什么。缺点是所有用户都可以。通过调试,您可以轻松地查看慢速查询。除此之外,打开SQL慢查询日志并将截止值设置得相对较低(因为Cake喜欢做很多很多查询来回答看似简单的问题)。
答案 2 :(得分:0)
我认为你不会在一点点挖掘,我害怕。您需要确定瓶颈,至少是导致负载的组件。例如,对索引不佳的mySQL表的大量访问可能会让服务器变得非常疯狂。根据我的经验,这是导致性能问题的常见原因。
最好的办法是设置一个调试/分析环境,但是服务器的进程列表应该已经能够让你粗略了解造成这种压力的原因。它真的是PHP进程,还是有任何数据库活动?
答案 3 :(得分:0)
问题是,我还没有能够创建工作开发实例
这是您需要解决的问题。使该应用程序以非常的方式运行到其环境中(例如,确保所有环境配置都位于一个文件中,并且该文件仅包含环境配置)。一旦你解决了这个问题,你就可以在开发过程中摒弃你喜欢的一切。
答案 4 :(得分:0)