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