21

我想知道在 LAMP 堆栈上构建典型站点时,如何优化它以获得最佳加载时间。我正在描绘一个典型的数据库驱动站点。

这是一个高级外观,可能会引起问题,让我将其分解为堆栈的每一层。

L - 在系统级别,(设置和文件系统)你可以做些什么来提高速度?我能想到的一件事是图像大小,这里的压缩可以帮助优化任何东西吗?

A - Web 服务器中必须有大量与站点速度相关的设置。不是我的强项。可能很大程度上取决于同时运行的站点数量。

M - MySQL 在数据库驱动的站点中,数据库性能是关键。是否有更好的规范化方法,即使用链接表?Web 开发人员通常只制作类似于 1NF 的简单单片表,这会影响性能。

P - 除了像缓存这样的性能提升设置,程序员可以做些什么来影响高水平的性能?我真的很想知道 MVC 设计方法是否比快速而肮脏的方法更能提高性能。其他简单的技巧,比如会话比 cookie 更快,会很有趣。

显然,你必须深入了解细节,找出让你慢下来的代码。我也意识到许多站点具有许多不同的性能特征,但是让我们假设一个典型的站点具有更多的读取然后写入。

我只是想知道我们是否可以汇编一堆最佳实践并完全期望人们将其他问题联系起来,以便我们可以有效地制定一份清单。

我的目标是看看除了性能方面的常见问题之外,我们是否还能看到一些你可能不会想到的奇怪事情,以及最佳实践总结。

所以我的问题是,如果您从头开始,您将如何确保您的 LAMP 站点快速运行?

4

8 回答 8

35

以下是我在 LAMP 应用程序中经常设置的一些个人必做事项。

  • 为 apache 安装 mod_deflate,不要使用 PHP 的 gzip 处理程序。mod_deflate 将允许您压缩静态内容,如 javascript/css/static html,以及通常的动态 PHP 输出,这是您在代码中不必担心的一件事。

  • 小心 .htaccess 文件!为应用程序中的目录启用 .htaccess 文件意味着 Apache 必须不断扫描文件系统,寻找 .htaccess 指令。将指令放在主配置或虚拟主机配置中要好得多,它们会在其中加载一次。任何时候您都可以通过将目录级访问文件移动到主配置文件中来摆脱它,从而节省磁盘访问时间。

  • 准备应用程序的数据库层以使用某种连接管理器(我对大多数应用程序使用单例)。这并不难做到,减少应用程序打开的数据库连接数可以节省资源。

  • 如果您认为您的应用程序会看到大量负载,那么 memcached 可以创造奇迹。在编写代码时请记住这一点……也许有一天,您将从 memcached 中获取它们,而不是动态创建对象。一点远见将使实施变得轻松。

  • 一旦您的应用程序启动并运行,请将 MySQL 的慢查询时间设置为一个较小的数字,并认真监控慢查询日志。这将向您显示问题查询的来源,并允许您在查询和索引成为问题之前对其进行优化。

  • 对于认真的性能调整者,您将需要从源代码编译 PHP。从包安装会安装许多您可能永远不会使用的库。由于 PHP 环境被加载到 Apache 线程的每个实例中,当存在 50 个 Apache 线程时,即使来自额外库的 5MB 内存开销也会很快变成 250MB 的内存丢失。我保留了我在此处构建 PHP 时使用的标准 ./configure 行的列表,我发现它适合我的大多数应用程序。缺点是如果你最终需要一个库,你必须重新编译 PHP 才能得到它。分析您的代码并在开发环境中对其进行测试,以确保您拥有所需的一切。

  • 缩小你的 Javascript。

  • 准备将静态内容(例如图像和视频)移动到非动态 Web 服务器。编写代码,以便将来轻松配置图像和视频的任何 URL 以指向另一台服务器。针对静态内容优化的 Web 服务器可以轻松地提供比动态内容服务器快数十甚至数百倍的服务。

这就是我能想到的。谷歌搜索 PHP 最佳实践会发现很多关于如何编写更快/更好的代码的技巧(例如:echo比 更快print)。

于 2009-03-30T17:37:39.963 回答
12

首先,要认识到绩效是一个迭代的过程。您不会一次构建 Web 应用程序,启动它,然后再也不使用它。相反,您从小处着手,并随着站点的增长解决性能问题。

现在,到细节:

  1. 轮廓。确定您的瓶颈。这是最重要的一步。您需要将精力集中在获得最佳结果的地方。您应该有某种监控解决方案(如 cacti 或 munin),让您了解服务器上发生的事情
  2. 缓存,缓存,缓存。您可能会发现数据库访问是您在后端的最大瓶颈——但您应该自己验证这一点。幸运的是,您可能会发现您的大量流量是针对一小部分资源的。您可以将这些资源缓存在 memcached 之类的东西中,从而为自己节省数据库命中,并提高后端性能。
  3. 正如其他人在上面提到的,请查看 YDN 性能规则。考虑拿起随附的书。这将帮助您提高前端性能
  4. 安装PHP APC,并确保它配置了足够的内存来保存所有编译的 PHP 字节码。我们最近发现我们的 APC 安装没有足够的内存;给它足够的工作将我们的 CPU 时间减少一半,磁盘活动减少 10%
  5. 确保您的数据库表已正确索引。这与监控慢查询日志密切相关。

以上将使您走得很远。也就是说,如果您已经完成了上述操作,即使是一个相当重的 db 站点也应该能够在单个规格适中的服务器上的首页 digg 中存活下来。

您最终会遇到默认 apache 配置无法始终跟上传入请求的情况。当你碰到这堵墙时,有两件事要做:

  1. 如上,简介。监控您的 apache 活动——您应该知道在任何给定时间有多少活动连接,以及当您突然流量激增时活动连接的最大数量
  2. 考虑到这一点来配置 apache。这是我见过的最好的 apache 配置指南:Practical mod_perl 第 11 章
  3. 尽可能多地减轻 apache 的负担。Apache 过于繁重,无法有效地提供静态内容。您应该使用更轻量级的反向代理(如 squid)或网络服务器(lighttpd 或 nginx)来提供静态内容,并接管将字节喂给慢速客户端的工作。这让 Apache 做它最擅长的事情:执行你的代码。同样,mod_perl 的书很好地解释了这一点

一旦你走到这一步,这主要是一个缓存更多的问题,并密切关注你的数据库。最终,您将超出单个服务器。首先,您可能会添加更多前端盒,所有这些都由单个数据库服务器提供支持。然后你将不得不开始分散你的数据库负载,可能是通过分片。有关此增长过程的出色概述,请参阅此实时日志演示

要更深入地了解上述大部分内容,请查看Flickr 成名的 Cal Henderson 的Building Scalable Web Sites 。谷歌有部分图书可供试阅

于 2009-03-30T19:07:03.523 回答
3

我已经使用MysqlTuner对我的 mysql 服务器进行性能分析,它对谷歌搜索的进一步问题提供了很好的洞察力,并提出了自己的建议

于 2009-03-30T16:40:17.353 回答
2

您可能会发现有用的资源是YDN 性能规则集

于 2009-03-30T16:50:04.070 回答
2

不要忘记您的用户将远离您的服务器数千英里,并下载数十个文件以呈现单个页面的事实。这种延迟以及在浏览器中呈现页面的开销可能大于您收集信息和生成页面所花费的时间。

请参阅 Yahoo Developer Network 上有关加快网站速度的最佳实践的页面,以及YSlow 工具以了解网站下载的哪些部分需要时间。

于 2009-03-30T16:55:40.017 回答
2

不要忘记为您的文件系统关闭 atime!

于 2009-03-30T19:05:19.940 回答
2

我建议使用Jet Profiler for MySQL来查找任何错误查询。我已经在我的几个网站上成功地使用了它。真的很有帮助,而且比慢查询日志更容易消化。

于 2011-12-09T13:37:25.923 回答
1

我建议从http://highscalability.com/开始

至于你的建议:

压缩图像,绝对没有。文件系统调整的类型,是的,这可能会产生一些影响,但影响很小。但实际上最好是使用内存反向代理,甚至更好的 CDN。

对于 Apache,基本上只加载您需要的模块。不要加载其他任何东西。与 PHP 一样,您只能使用分叉 MPM,重要的是要保持苗条。至于最佳设置,您必须针对特定应用程序、硬件等进行微调。如果您有足够的 CPU,建议您使用 mod_deflate。服务器可以更快地向客户端发送数据,它可以更快地开始处理下一个请求。

于 2009-03-30T16:06:52.067 回答