优化基于Kohana的网站以提高速度和可扩展性 [英] Optimizing Kohana-based Websites for Speed and Scalability
问题描述
我用Kohana建的一个网站昨天遭到了巨大的访问量,这使我退后一步并评估了一些设计.我很好奇什么是优化基于Kohana的应用程序的一些标准技术?
我也对基准测试感兴趣.我是否需要为每个控制器方法设置Benchmark::start()
和Benchmark::stop()
以便查看所有页面的执行时间,还是可以在全球范围内快速应用基准测试?
我将在以后更多时候使用Cache库,但是我愿意接受更多建议,因为我敢肯定,目前我还不知道有很多事情可以做.
我将在此答案中说的并不是Kohana特有的,并且可能适用于许多PHP项目.
在谈论性能,可伸缩性,PHP等时,我想到了以下几点:
在进行多个项目时,我已经使用了许多这样的想法-他们提供了帮助;这样他们也可以在这里提供帮助.
首先,在表演方面,有许多方面/要考虑的问题:
- 服务器(Apache,PHP,MySQL,其他可能的守护程序和系统)的配置;您可能会在 ServerFault 上获得更多帮助,我想,
- PHP代码,
- 数据库查询,
- 是否使用您的网络服务器?
- 可以使用任何类型的缓存机制吗?还是您总是需要网站上更多的最新数据?
使用反向代理
真正有用的第一件事是使用反向代理,例如 ?
关于使用反向代理作为缓存,对于PHP应用程序,例如,您可以查看 我如何才能发现并生存"Slashdotted"? 可能是一个有趣的读物. 首先:您是否正在使用最新版本的PHP ?定期改进速度,使用新版本;-)
请注意,性能是使用PHP 5.3的充分理由.(手册),这是我的解决方案我见过使用最多的服务器,并且在我使用过的所有服务器上都使用过.
尽可能避免一遍又一遍地做同一件事. 我主要要考虑的是SQL查询:您的许多页面可能执行相同的查询,而其中某些结果几乎总是相同的……这意味着很多<对数据库进行的em>无用" 查询,这需要花费时间来一次又一次地为相同的数据提供服务.
您可能会很感兴趣地识别: 并将这些数据/结果存储在某种类型的缓存中,因此更容易获得它们-更快 –而且,您不必为了任何事情而去SQL服务器. 例如,出色的缓存机制: 我很确定您的框架中包含一些与缓存相关的内容;您可能已经知道,正如您所说,我将在OP中更多地使用Cache-library" ;-) 现在,要做的一件好事是使用 Xdebug 扩展名配置您的应用程序:通常,它可以很容易地找到几个弱点-至少在某些功能需要花费大量时间的情况下. 配置正确 ,它将生成可分析的配置文件使用一些图形工具,例如: 例如,这是KCacheGrind的几个屏幕截图: (顺便说一句,如果我没有记错的话,第二张屏幕截图中显示的调用图通常是WinCacheGrind或Webgrind都无法执行的操作) 您应该可以在 XHGui 中使用它,它将帮助可视化数据. 现在我们已经讨论了一些关于PHP的信息,请注意,您的瓶颈并非是PHP方面的东西,而是数据库的一个... >
至少有两三件事,在这里: 不过,最重要的两件事是: 如果您仍在阅读,还有什么可以优化的? 嗯,还有改进的余地...一些面向体系结构的想法可能是: 好吧,在您的情况下,其中一些想法可能有些过分了^^
您最初的问题是关于优化使用Kohana的应用程序...嗯,我发布了一些适用于任何PHP应用程序的想法 ...这意味着它们也适用于Kohana. ;-)
我说:使用缓存; Kohana似乎支持某些缓存内容 (您自己说过,所以没有新内容这里...)
我还说过,您不应该做任何不必要的事情;默认情况下,Kohana中是否有不需要的功能?
仍然,这里有一些可能有用的链接: 最后,得出一个简单的想法: 我并不是说您不应该优化:您绝对应该!
哦,顺便说一句:在做任何事情之前:放置一些监视内容,这样您就知道已进行了哪些改进,以及如何进行了改进!
例如,您可以使用 RRDtool + 仙人掌 .
A site I built with Kohana was slammed with an enormous amount of traffic yesterday, causing me to take a step back and evaluate some of the design. I'm curious what are some standard techniques for optimizing Kohana-based applications? I'm interested in benchmarking as well. Do I need to setup I will be using the Cache-library more in time to come, but I am open to more suggestions as I'm sure there's a lot I can do that I'm simply not aware of at the moment. What I will say in this answer is not specific to Kohana, and can probably apply to lots of PHP projects. Here are some points that come to my mind when talking about performance, scalability, PHP, ...
The first thing that could be really useful is using a reverse proxy, like varnish, in front of your webserver: let it cache as many things as possible, so only requests that really need PHP/MySQL calculations (and, of course, some other requests, when they are not in the cache of the proxy) make it to Apache/PHP/MySQL. About using a reverse-proxy as cache, for a PHP application, you can, for instance, take a look at Benchmark Results Show 400%-700% Increase In Server Capabilities with APC and Squid Cache.
If you do that well enough, and manage to stop re-generating too many pages again and again, maybe you won't even have to optimize any of your code ;-)
A site I built with Kohana was slammed with
an enormous amount of traffic yesterday, This is the kind of sudden situation where a reverse-proxy can literally save the day, if your website can deal with not being up to date by the second: About that, How can I detect and survive being "Slashdotted"? might be an interesting read. First of all: are you using a recent version of PHP? There are regularly improvements in speed, with new versions ;-)
Note that performances is quite a good reason to use PHP 5.3 (I've made some benchmarks (in French), and results are great)...
As much as possible, it is better to avoid doing the same thing over and over again. The main thing I'm thinking about is, of course, SQL Queries: many of your pages probably do the same queries, and the results of some of those is probably almost always the same... Which means lots of "useless" queries made to the database, which has to spend time serving the same data over and over again.
It might be very interesting for you to identify: And store these data/results in some kind of cache, so they are easier to get -- faster -- and you don't have to go to your SQL server for "nothing". Great caching mechanisms are, for instance: I'm pretty sure your framework comes with some cache-related stuff; you probably already know that, as you said "I will be using the Cache-library more in time to come" in the OP ;-) Now, a nice thing to do would be to use the Xdebug extension to profile your application: it often allows to find a couple of weak-spots quite easily -- at least, if there is any function that takes lots of time. Configured properly, it will generate profiling files that can be analysed with some graphic tools, such as: For instance, here are a couple screenshots of KCacheGrind: (BTW, the callgraph presented on the second screenshot is typically something neither WinCacheGrind nor Webgrind can do, if I remember correctly ^^ ) You should be able to use it alonside XHGui, which will help for the visualisation of data. Now that we've spoken a bit about PHP, note that it is more than possible that your bottleneck isn't the PHP-side of things, but the database one... At least two or three things, here: Still, the two most important things are: If you are still reading, what else could be optimized? Well, there is still room for improvements... A couple of architecture-oriented ideas might be: Well, maybe some of those ideas are a bit overkill in your situation ^^
Your initial question was about optimizing an application that uses Kohana... Well, I've posted some ideas that are true for any PHP application... Which means they are true for Kohana too ;-)
I said: use cache; Kohana seems to support some caching stuff (You talked about it yourself, so nothing new here...)
I also said you shouldn't do anything that's not necessary; is there anything enabled by default in Kohana that you don't need?
Still, here's a couple of links that might be useful: And, to conclude, a simple thought: I'm not saying you shouldn't optimize: you definitely should!
Oh, and, btw: before doing anything: put some monitoring stuff in place, so you know what improvements have been made, and how!
For instance, you could use something like RRDtool + cacti.
这篇关于优化基于Kohana的网站以提高速度和可扩展性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
在PHP方面:
例如,看看 PHP Branches 3.0到5.3-CVS的基准 .
[apc.stat](https://php.net/manual/en/apc.configuration.php#ini.apc.stat)
对系统负载很有利;但这意味着除非刷新整个操作码缓存,否则不会考虑对PHP文件所做的修改;关于此信息,有关更多详细信息,请参见例如 To stat()或不去stat()吗?
使用数据缓存
当然,其他内容也是如此,例如Web服务调用,从其他网站获取信息,繁重的计算工作……
分析
(来源: pascal-martin.fr )
(来源: pascal-martin.fr )
(感谢@Mikushi的评论)我未使用太多的另一种可能性是 xhprof 扩展:它也有助于进行性能分析,可以生成调用图-但比Xdebug轻,这意味着您应该可以在生产服务器上安装它.>
在SQL方面:
那又如何?
但是,还是……为什么不研究一下,以防万一? ;-)
那Kohana呢?
(即使不是特定于^^)
如果有什么可以快速完成的操作,请尝试;-)
浏览网络时,似乎至少有一些关于XSS过滤的知识;你需要那个吗?
结论?
但是首先进行快速"优化,这将为您带来丰厚的回报:使用某些操作码缓存可能会帮助您减少服务器CPU负载的10%到50%.只需几分钟; ;-)另一方面,花3天的时间得到2%...
如果没有监视,您将不会知道所做工作的效果...即使是真正的优化也不会!
向老板展示一些不错的图形,CPU负载下降40%总是很棒的;-)
无论如何,要真正得出结论:玩得开心!
(是的,优化很有趣!)
(嗯,我想我不会写那么多...希望至少其中的某些部分有用...而且我应该记住这个答案:在其他时候可能有用... ) Benchmark::start()
and Benchmark::stop()
for each controller-method in order to see execution times for all pages, or am I able to apply benchmarking globally and quickly?
I've used many of those ideas while working on several projects -- and they helped; so they could probably help here too.
First of all, when it comes to performances, there are many aspects/questions that are to consider:
Using a reverse proxy
(Yep, they are using Squid, and I was talking about varnish -- that's just another possibility ^^ Varnish being more recent, but more dedicated to caching)
At least, maybe not in any kind of rush... And it's always better to perform optimizations when you are not under too much presure...
As a sidenote: you are saying in the OP:
On the PHP side of things:
For instance, take a look at Benchmark of PHP Branches 3.0 through 5.3-CVS.
Another pretty good reason being, of course, that PHP 5.2 has reached its end of life, and is not maintained anymore!Are you using any opcode cache?
[apc.stat](https://php.net/manual/en/apc.configuration.php#ini.apc.stat)
can be good for system-load; but it means modifications made to PHP files won't be take into account unless you flush the whole opcode-cache; about that, for more details, see for instance To stat() Or Not To stat()?Using cache for data
Of course, this is true for other stuff, like Web Services calls, fetching information from other websites, heavy calculations, ...
Profiling
(source: pascal-martin.fr)
(source: pascal-martin.fr)
(Thanks @Mikushi for the comment) Another possibility that I haven't used much is the the xhprof extension : it also helps with profiling, can generate callgraphs -- but is lighter than Xdebug, which mean you should be able to install it on a production server.On the SQL side of things:
EXPLAIN
instruction, if you are using MySQL
log_slow_queries
to get a list of the requests that take "too much" time, and start your optimization by those.
And what now?
But, still... Why not study them a bit, just in case ? ;-)And what about Kohana?
(Even if not specific to it ^^)
If there is anything that can be done quickly, try it ;-)
Browsing the net, it seems there is at least something about XSS filtering; do you need that?
Conclusion?
But go for "quick" optimizations that will get you big rewards first: using some opcode cache might help you get between 10 and 50 percent off your server's CPU-load... And it takes only a couple of minutes to set up ;-) On the other side, spending 3 days for 2 percent...
Without monitoring, you will have no idea of the effect of what you did... Not even if it's a real optimization or not!
And showing your boss some nice graphics with a 40% CPU-load drop is always great ;-)
Anyway, and to really conclude: have fun!
(Yes, optimizing is fun!)
(Ergh, I didn't think I would write that much... Hope at least some parts of this are useful... And I should remember this answer: might be useful some other times...)