我与Kohana一起建立的网站昨天遭到了大流量的抨击,这使我退后一步并评估了一些设计。我很好奇什么是优化基于Kohana的应用程序的一些标准技术?
我也对基准测试感兴趣。我是否需要为每个控制器方法设置Benchmark::start()
和Benchmark::stop()
以便查看所有页面的执行时间,还是可以在全球范围内快速应用基准测试?
我将在未来更多时间使用Cache库,但是我愿意接受更多建议,因为我敢肯定,目前我还不知道有很多事情可以做。
最佳答案
我将在此答案中说的并不是Kohana特有的,并且可能适用于许多PHP项目。
在谈论性能,可伸缩性,PHP等时,我想到了以下几点:
在进行多个项目时,我已经使用了许多这样的想法-他们提供了帮助;这样他们也可以在这里提供帮助。
首先,在表演方面,要考虑许多方面/问题:
服务器的配置(Apache,PHP,MySQL,其他可能的守护程序和系统);我想,您可能会在ServerFault上获得更多帮助。
PHP代码,
数据库查询
是否使用您的网络服务器?
您可以使用任何一种缓存机制吗?还是您总是需要网站上更多的最新数据?
使用反向代理
可能真正有用的第一件事是在Web服务器前使用反向代理,例如varnish:让它缓存尽可能多的东西,因此只有真正需要PHP / MySQL计算的请求(当然,其他一些请求(当它们不在代理的缓存中时)将其发送到Apache / PHP / MySQL。
首先,您的CSS / Javascript / Images(当然,所有静态的东西)可能不一定总是由Apache服务
因此,您可以让反向代理缓存所有这些。
对Apache来说,提供这些静态文件并不重要,但是对于这些文件而言,工作量越少,它将能够使用PHP进行的处理就越多。
请记住:Apache一次只能处理有限的有限数量的请求。
然后,让反向代理从缓存中尽可能多地服务于PHP页面:可能有些页面的更改不那么频繁,并且可以从缓存中得到服务。为什么不使用其他基于PHP的缓存,而不是让另一个更轻便的服务器为它们服务(并不时从PHP服务器获取它们,因此它们始终是最新的)?
例如,如果您有一些经常需要的RSS提要(在尝试优化性能时,我们通常会忘记这些提要),那么将它们在缓存中保留几分钟,可以将成百上千的请求保存到Apache + PHP + MySQL!
如果您的网站上访问量最大的页面在至少几分钟内没有变化(例如:首页?),则无需更改,因此,无需浪费CPU每次用户请求时重新生成它们的时间。
匿名用户服务的页面(所有匿名用户的页面都相同)和识别用户的页面(例如“ X先生您好,您有新消息”)之间是否可能有所不同?
如果是这样,您可能可以配置反向代理以缓存为匿名用户提供的页面(通常基于cookie,例如会话cookie)
这意味着Apache + PHP的工作量更少:只有确定的用户-这可能只是您用户的一小部分。
关于使用反向代理作为缓存,对于PHP应用程序,您可以例如查看Benchmark Results Show 400%-700% Increase In Server Capabilities with APC and Squid Cache。
(是的,他们正在使用Squid,而我在谈论的是清漆-这只是另一种可能性^^清漆是较新的,但更致力于缓存)
如果您做得足够好,并且设法一次又一次地停止重新生成太多页面,也许您甚至不必优化任何代码;-)
至少,也许不急于...当您没有太多压力时,执行优化总是更好的选择...
旁注:您在OP中说:
我与Kohana建立的网站遭到了猛烈抨击
昨天流量很大,
如果您的网站无法及时更新,这是一种突然的情况,反向代理实际上可以节省一天的时间:
安装,配置,让它始终(每天正常运行):
配置它以不将PHP页面保留在缓存中;或仅持续很短的时间;这样,您总是可以显示最新数据
而且,在您进行斜线或digg效果的那一天:
配置反向代理以将PHP页面保留在缓存中;或更长的时间;也许您的页面不会在第二秒之前更新,但是它将使您的网站能够幸免于难!
关于这一点,How can I detect and survive being “Slashdotted”?可能是一个有趣的读物。
在PHP方面:
首先:您是否正在使用最新版本的PHP?定期改进速度,使用新版本;-)
例如,查看Benchmark of PHP Branches 3.0 through 5.3-CVS。
请注意,性能是使用PHP 5.3(I've made some benchmarks (in French),效果很好)的一个很好的理由...
当然,另一个很好的理由是PHP 5.2已经到了使用寿命,并且不再维护!
您是否正在使用任何操作码缓存?
我在考虑APC-替代PHP缓存,例如(pecl,manual),这是我见过的使用最多的解决方案-并且在我使用过的所有服务器上都使用过。
另请参阅:Slides APC Facebook,
或Benchmark Results Show 400%-700% Increase In Server Capabilities with APC and Squid Cache。
在某些情况下,它确实可以大大降低服务器的CPU负载(我已经看到有些服务器上的CPU负载从80%降至40%,只需安装APC并激活其操作码缓存功能!)
基本上,PHP脚本的执行分两个步骤:
将PHP源代码编译为操作码(相当于JAVA的字节码)
这些操作码的执行
APC将这些代码保存在内存中,因此每次执行PHP脚本/文件时都不需要做很多工作:仅从RAM中提取操作码,然后执行它们。
您可能需要看一下APC的configuration options
其中有很多,对您的速度/ CPU负载/易用性都有很大影响
例如,禁用[apc.stat](https://php.net/manual/en/apc.configuration.php#ini.apc.stat)
可能有助于系统负载。但这意味着除非刷新整个操作码缓存,否则不会考虑对PHP文件所做的修改;关于此,有关更多详细信息,请参见例如To stat() Or Not To stat()?
使用数据缓存
尽可能避免重复做同一件事。
我要考虑的主要内容当然是SQL查询:您的许多页面可能执行相同的查询,而其中某些结果几乎总是相同的……这意味着很多“无用的”查询对数据库的访问,必须花时间一次又一次地为相同的数据提供服务。
当然,这对于其他内容也是如此,例如Web服务调用,从其他网站获取信息,大量计算,...
您可能会很感兴趣地找出:
哪些查询运行了很多次,总是返回相同的数据
哪些其他(繁重的)计算需要花费很多时间,并且总是返回相同的结果
并将这些数据/结果存储在某种类型的缓存中,因此它们更容易获得-更快-并且您不必为了任何事情而去SQL服务器。
出色的缓存机制例如:
APC:除了我之前提到的操作码缓存外,它还允许您将数据存储在内存中,
和/或memcached(see also),如果您确实有大量数据和/或正在使用多个服务器(因为它们是分布式的),则这很有用。
当然,您可以考虑文件;还有很多其他想法。
我很确定您的框架中包含一些与缓存有关的内容;您可能已经知道这一点,正如您在OP中所说的:“我将在更多时间使用Cache-library” ;-)
剖析
现在,要做的一件好事是使用Xdebug扩展名来分析您的应用程序:它通常可以很容易地找到几个弱点-至少在某些功能需要花费很多时间的情况下。
Configured properly,它将生成可通过某些图形工具进行分析的配置文件,例如:
KCachegrind:我的最爱,但仅适用于Linux / KDE
Wincachegrind用于Windows;不幸的是,它比KCacheGrind少了一些东西-通常它不显示调用图。
Webgrind在PHP网络服务器上运行,因此可以在任何地方使用-但可能功能较少。
例如,这是KCacheGrind的几个屏幕截图:
(来源:pascal-martin.fr)
(来源:pascal-martin.fr)
(顺便说一句,如果我没记错的话,第二个屏幕截图中显示的调用图通常是WinCacheGrind或Webgrind都不能做的事情)
(感谢@Mikushi的评论)我没有使用太多的另一种可能性是xhprof扩展名:它也有助于分析,可以生成调用图-但比Xdebug轻,这意味着您应该能够安装它在生产服务器上。
您应该能够在alonside XHGui上使用它,这将有助于数据的可视化。
在SQL方面:
现在我们已经讨论了一些关于PHP的知识,请注意,您的瓶颈很有可能不是PHP方面的东西,而是数据库方面的东西。
至少有两三件事:
您应该确定:
您的应用程序正在执行的最常见查询是什么
如果使用MySQL,是否使用EXPLAIN
指令对它们进行了优化(主要是使用正确的索引?)
另请参阅:Optimizing SELECT and Other Statements
例如,您可以激活log_slow_queries
以获得需要“太多”时间的请求列表,然后根据这些请求开始优化。
是否可以缓存其中一些查询(请参阅我之前所说的内容)
您的MySQL是否配置正确?我对此了解不多,但是有些配置选项可能会产生一些影响。
Optimizing the MySQL Server可能会给您一些有趣的信息。
尽管如此,两个最重要的事情是:
如果不需要,请不要进入数据库:尽可能多地缓存!
当您必须去数据库时,使用高效的查询:使用索引;使用索引。和个人资料!
现在怎么办?
如果您仍在阅读,还有什么可以优化的?
嗯,还有改进的余地...一些面向架构的想法可能是:
切换到n层架构:
将MySQL放在另一台服务器上(2层:一个用于PHP;另一个用于MySQL)
使用多个PHP服务器(并在这些服务器之间平衡用户负载)
将另一台机器用于静态文件,并使用较轻的网络服务器,例如:
lighttpd
或nginx-这个越来越流行了,顺便说一句。
为MySQL使用多个服务器,为PHP使用多个服务器,并在它们前面使用多个反向代理
当然:在任何具有任何可用RAM的服务器上安装memcached守护程序,并使用它们尽可能多地缓存/有意义。
使用Apache的“更有效”的工具?
我越来越经常听到有关nginx的信息,当涉及到PHP和高流量网站时,它应该很棒。我自己从未使用过它,但是您可能会在网上找到一些有趣的文章。
例如PHP performance III -- Running nginx。
另请参阅:PHP-FPM - FastCGI Process Manager,它与PHP> = 5.3.3捆绑在一起,并与nginx结合在一起。
好吧,在您的情况下,其中一些想法可能有些过分了^^
但是,还是...为什么不研究一下,以防万一? ;-)
那Kohana呢?
您最初的问题是关于优化使用Kohana的应用程序...好吧,我已经发布了一些适用于任何PHP应用程序的想法...这意味着它们也适用于Kohana ;-)
(即使不是特定的^^)
我说:使用缓存; Kohana似乎支持某些caching stuff(您自己说过,所以这里没有新内容……)
如果有什么可以快速完成的操作,请尝试;-)
我还说过,您不应做任何不必要的事情;默认情况下,Kohana是否有不需要的功能?
浏览网络,似乎至少与XSS过滤有关;你需要那个吗?
不过,这里有一些可能有用的链接:
Kohana General Discussion: Caching?
Community Support: Web Site Optimization: Maximum Website Performance using Kohana
结论?
最后,有一个简单的想法:
您的公司向您支付5天的费用是多少? -考虑到进行一些重大优化是合理的时间
您的公司购买(购买?)第二台服务器及其维护需要花费多少钱?
如果必须扩大规模怎么办?
花10天会花多少钱?更多?优化您的应用程序的每一个可能?
还有几台服务器要多少钱?
我并不是说您不应该优化:您绝对应该!
但是请进行“快速”的优化,这将首先为您带来丰厚的回报:使用某些操作码缓存可能会帮助您节省服务器CPU负载的10%到50%...而且设置仅需要几分钟;- )另一方面,花3天的时间赚2%...
哦,顺便说一句:在做任何事情之前:先放置一些监视内容,以便您知道已进行了哪些改进以及如何进行改进!
如果没有监控,您将不会知道所做工作的效果……即使这不是真正的优化,也不会!
例如,您可以使用RRDtool + cacti之类的东西。
向您的老板展示一些不错的图形,CPU负载下降40%总是很棒的;-)
无论如何,要真正得出结论:玩得开心!
(是的,优化很有趣!)
(Ergh,我认为我不会写那么多...希望其中至少有一部分是有用的...而且我应该记住这个答案:在其他时候可能有用...)