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
在Cake层次结构外部创建一个简单的hello world文件
<?php
echo 'Hello World';
Run Code Online (Sandbox Code Playgroud)
并查看运行需要多长时间.有时很容易将应用程序归咎于服务器/网络级别的某些事情.
假设test.php在合理的时间内渲染,请继续执行第二步.
摆弄生产代码总是一个危险的游戏.在开始之前,请执行完整数据库备份,以防损坏无法修复的内容,并复制整个cake目录树.无论何时完成,都要生成生产目录和副本的内容(使用GUI工具或命令行)
diff -r production-cake copy-of-cake
Run Code Online (Sandbox Code Playgroud)
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)
这表明有人在循环中加载模型而不了解幕后发生的事情.
如果数据库不是yoru瓶颈并且PHP/Apache正常运行,那么接下来要查找的是系统调用.脱壳是一种快速而肮脏的方式来完成工作,但它是一项非常昂贵的操作.在循环中获得其中一个或两个,你就完成了.
运行top或ps在生产服务器上查找正在启动和停止的程序,然后在代码库中搜索这些命令.
你将拥有一些控制器
/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)
然后,您可以将任意数量的调试/打印语句丢入控制器文件中.如果你"幸运",原始开发人员可能会在控制器文件中堵塞很多逻辑.如果是这种情况,你现在可以玩"评论一半代码"游戏了.