性能调优CakePHP应用程序

Jak*_*old 5 php performance scaling

我刚刚得到这个相当大的CakePHP应用程序(约20K行代码),这是不是很干净,没有任何文件在所有.该应用程序正在生产中运行,但它在性能方面确实存在严重问题.

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

当我尝试即使是很小的负载测试时ab -n 100 -c 10 ...,它的平均响应也达到了7000毫秒.但是,我从来没有超过800MB RAM,因此有一些调整至少有6GB的可用内存.

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

如果不深入挖掘源代码,您建议什么才能轻松提升性能?

Ala*_*orm 14

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

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

<?php
echo 'Hello World';
Run Code Online (Sandbox Code Playgroud)

并查看运行需要多长时间.有时很容易将应用程序归咎于服务器/网络级别的某些事情.

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

第2步:退回一切

摆弄生产代码总是一个危险的游戏.在开始之前,请执行完整数据库备份,以防损坏无法修复的内容,并复制整个cake目录树.无论何时完成,都要生成生产目录和副本的内容(使用GUI工具或命令行)

diff -r production-cake copy-of-cake
Run Code Online (Sandbox Code Playgroud)

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

PHP应用程序生成大量SQL查询,尤其是当人们使用隐藏了大量实际SQL查询的ActiveRecord样式模型时.您需要将Cake设置为将查询记录到文件和/或数据库表.虽然我建议注销平面文件和/或syslog而不是数据库,但这里有一些说明.将数据库请求记录到数据库将使每页加载的查询数量翻倍.

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

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

select * from foo where id = 5
select * from foo where id = 6
etc...
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

第4步:复制每个控制器

你将拥有一些控制器

/app/controllers/posts_controller.php
/app/controllers/other_controller.php
etc...
Run Code Online (Sandbox Code Playgroud)

这将对应于URL

http://www.example.com/posts/methodName
http://www.example.com/other/methodName
etc...
Run Code Online (Sandbox Code Playgroud)

每当您需要调试特定请求以找出它为何如此慢时,请复制控制器.

/app/controllers/debugposts_controller.php
Run Code Online (Sandbox Code Playgroud)

并手动发出请求

http://www.example.com/debugposts/methodName
Run Code Online (Sandbox Code Playgroud)

然后,您可以将任意数量的调试/打印语句丢入控制器文件中.如果你"幸运",原始开发人员可能会在控制器文件中堵塞很多逻辑.如果是这种情况,你现在可以玩"评论一半代码"游戏了.