我有许多带有PHP
and的站点MySQL
,尤其是运行 MediaWiki,我需要提高性能。但是,我只能使用有限百分比的 CPU。
我能想到的提高性能的最好方法是启用缓存。但是,我很困惑:这真的会提高整体性能还是只是提高速度?
我能想到的是,如果缓存将使用文件,那么将需要更多的处理来获取这些文件的内容。如果会使用SQL表,那么查询这些表也需要更多的处理,也许时间会更短,但CPU使用率会更高。
这是正确的还是不正确的?缓存会消耗更多的 CPU 以提供更快的结果还是提高整体性能?
我有许多带有PHP
and的站点MySQL
,尤其是运行 MediaWiki,我需要提高性能。但是,我只能使用有限百分比的 CPU。
我能想到的提高性能的最好方法是启用缓存。但是,我很困惑:这真的会提高整体性能还是只是提高速度?
我能想到的是,如果缓存将使用文件,那么将需要更多的处理来获取这些文件的内容。如果会使用SQL表,那么查询这些表也需要更多的处理,也许时间会更短,但CPU使用率会更高。
这是正确的还是不正确的?缓存会消耗更多的 CPU 以提供更快的结果还是提高整体性能?
最基本的缓存应该用于存储 CPU 密集型进程的结果。例如,如果您有一个即时创建图像的服务器端图像处理程序(例如缩略图和更大的预览),那么您不希望在每个请求上都发生此操作 - 您希望运行此过程一次并存储结果;然后,每个其他请求都会获得保存的结果。
这显然是对基本缓存的过度简化的描述,在这种情况下使用图像很好,因为您不必担心过时的数据,即实际图像多久更改一次?在您的情况下,数据库有很大不同。如果您缓存数据,那么如何保证您的真实数据和缓存数据之间不会立即出现不匹配?查询数据库并不总是一项 CPU 密集型任务(当然,您必须考虑数据库在索引、表大小等方面的设计方式),但在大多数情况下,查询设计良好的数据库在磁盘 I/O 上的消耗量远大于磁盘 I/O它在 CPU 周期上。
首先,您需要查看您的数据库设计,其次是您的查询。例如,您是否正确规范了您的数据库,您的查询是否在您可以归档时搜索大量数据,您是否在非索引字段上加入表,您的 where 子句是否查询可以被索引的字段(IN
在这些方面特别糟糕例)。
我建议您使用查询分析器并花一些时间优化您的表结构和查询以找到瓶颈,然后再进行更剧烈的更改。
参考:http: //msdn.microsoft.com/en-us/library/ee817646.aspx
性能:缓存技术通常用于通过将相关数据存储在尽可能靠近数据消费者的位置来提高应用程序性能,从而避免重复的数据创建、处理和传输。例如,将不会更改的数据(例如国家/地区列表)存储在缓存中可以通过最小化数据访问操作并消除为每个请求重新创建相同数据的需要来提高性能。
可扩展性:应用程序中的许多用户和流程通常需要相同的数据、业务功能和用户界面片段。如果针对每个请求都处理此信息,那么宝贵的资源将被浪费在重新创建相同的输出中。相反,您可以将结果存储在缓存中,并为每个请求重用它们。这提高了应用程序的可伸缩性,因为随着用户群的增加,这些任务对服务器资源的需求保持不变。例如,在 Web 应用程序中,Web 服务器需要为每个用户请求呈现用户界面。您可以在 ASP.NET 输出缓存中缓存呈现的页面以供将来的请求使用,从而释放资源以用于其他目的。
缓存数据还可以帮助扩展数据库服务器的资源。通过将经常使用的数据存储在缓存中,发出的数据库请求更少,这意味着可以为更多的用户提供服务。
可用性:有时,为您的应用程序提供信息的服务可能不可用。通过将这些数据存储在另一个地方,您的应用程序可能能够在网络延迟、Web 服务问题或硬件故障等系统故障中幸存下来。例如,每次用户从您的数据存储中请求信息时,您都可以返回信息并缓存结果,在每次请求时更新缓存。如果数据存储随后变得不可用,您仍然可以使用缓存的数据为请求提供服务,直到数据存储重新联机。
你需要分析你的外表并找出瓶颈发生在哪里。缓存是最好的页面加载类型,它根本不会影响服务器。您可以构建一个非常简单的缓存系统,该系统仅每 15 分钟重新加载一次信息。因此,如果页面在最后 15 分钟内被缓存,它会给他们一个预渲染页面。页面加载一次,它会创建一个临时文件。每 15 分钟创建一个新页面(如果有人加载该页面)。
缓存只存储服务器已经完成工作的文件。创建文件的工作已经完成,您只需存储它。
您使用术语“性能”和“速度”。我假设“性能”与您的 Web 服务器上的 CPU 周期有关,而“速度”与向用户提供页面所需的时间有关。您希望最大化 Web 服务器的“性能”(通过降低提供页面所需的 CPU 周期总数)同时最大化“速度”(降低提供网页所需的时间)。
对您来说好消息是缓存可以同时改善这两个指标。通过缓存内容,您可以创建一个存储在缓存中的输出页面,并且可以直接重复地提供给用户,而无需重新执行最初创建此输出页面的 PHP 代码(从而降低 CPU 周期)。从缓存中获取缓存页面比重新执行 PHP 代码消耗更少的 CPU 周期。
缓存对于请求页面的所有用户通常都相同的网页特别有用 - 例如在 wiki 中,对于通常不会经常更改的页面 - 同样是 wiki。
“增强性能”听起来像是我收到的一些电子邮件......
这里发生了两件相互关联的事情。一个是“处理一个给定的请求需要多长时间?”,另一个是“在我有限的资源下,我可以同时处理多少个请求?”。人们在谈论性能时倾向于使用这些概念中的一个或两个。
缓存可以帮助解决这两个问题。
最有效的缓存策略使用您机器之外的资源来缓存您的东西——最明显的例子是用户的浏览器或 CDN。我假设您不能使用 CDN,但是通过花一些精力设置 HTTP 缓存标头,您可以显着减少对服务器的静态或缓慢资源的请求数量。
对于动态内容(通常是您通过查询数据库生成的网页),下一个最有效的缓存策略是缓存您的页面(部分)生成的 HTML。例如,如果您的主页上有一个“最受欢迎的项目”框,这通常会运行几个中等复杂的数据库查询,然后是一些“将数据转换为 HTML”的后端代码。如果可以缓存 HTML,就可以节省数据库查询和将数据转换为 HTML 的 CPU 工作量。
如果这不可能,您可以缓存一些数据库查询的结果。这有助于减少数据库负载,通常还可以减少 Web 服务器上的负载——运行数据库查询和处理结果所需的代码通常比从缓存中检索项目更繁重;因为它更快,它允许更快地处理您的请求,从而更快地释放资源。这减少了服务器上单个请求的负载,从而允许您处理更多并发请求。