我正在运营一个实时更新量很大的网站。每个用户所需的资源量相当高,我给你举个例子。
设置
每次访问
该应用程序是 php/mysql,因此每次访问都会加载静态和动态内容。
资源:apache、php、mysql
每一秒 (一秒钟就太长了)
网站需要实时更新,因此每秒都会有一个 ajax 调用来更新网站。
资源:jQuery、apache、php、mysql
单个用户平均消费 (花费一分钟,访问了3个页面)
- Apache:+/- 63 个请求/响应,提供静态和动态内容(img、css、js、html)
- php: +/- 63 个请求/响应
- mysql: +/- 63 个请求/响应
- jquery:+/- 60 个请求/响应
优化
我想优化这个过程,但是我想最后可能还是会是一样的。
实施和测试之前(这将需要数周时间)我想听听你们的第二意见。
每次访问
我想首先在前端使用 nginx,并将其作为代理来传递静态内容。
资源:
- 动态:apache、php、mysql
- 静态:nginx
这将会大大分散 Apache 的负载。
每一秒
对于每秒加载一次的脚本,我想在前端设置 Node.js 服务器端 javascript 和 nginx。
我想设置 jquery 每分钟发出一次请求,node.js 每秒将数据传输到客户端。资源:jQuery、nginx、node.js、mysql
单个用户平均消费 (花费一分钟,访问了3个页面)
- Nginx:4 个请求/响应,主要提供静态内容(img、css、js)
- Apache:3 仅请求页面
- php: 3 仅请求页面
- node.js:1 个请求/60 个响应
- jquery:1 个请求/60 个响应
- mysql:63 个请求/响应
问题
正如您在优化中看到的,Apache 和 PHP 的负载被提升并转移到 nginx 和 node.js 上。它们以占用空间小和性能好而闻名。
但我有疑问,因为内存中仍然额外加载了 2 个程序,它们消耗了 CPU。
因此,最好是少用一些程序来完成这项工作,或者多用一些程序。在我花大量时间进行设置之前,我想知道这样做是否值得。
答案1
这里有一些可以帮助你的技巧。
- 使用 tools.pingdom.com 检查您的 URL,这将让您了解加载时间以及哪些内容耗时最长。
- 再看看http://www.webpagetest.org/这将为您提供与 PingDom 大致相同的信息,但还允许您判断哪些地方可以进一步提高性能。
- 将所有静态内容(图像、css、javascript 等)移至 CDN。这将对您大有帮助。
- 如果你使用 jQuery、Scriptaculous 等 ajax 库,我建议将它们卸载到 Google 上http://code.google.com/apis/ajaxlibs/这也给了我很大的帮助。
- 如果您还没有这样做,我建议将 MySQL 与您的 Web 端隔离,以便在不同的单元上执行。
- 最后,根据我的经验,对于 apache2,我使用工作模块,因此它更多地基于内存而不是处理器的使用,所以这对我有一些帮助。
答案2
请注意,同一可执行文件或共享库的多个副本共享其代码段。这意味着,即使您执行了 50 次 php,php 可执行文件也只会从磁盘读取一次,并且只会在内存中出现一次。每次执行都有自己的数据段,但无论您如何将数据分布在多个程序中,这都必须发生。
因此,与许多优化问题一样,答案是“视情况而定”。找出具体情况的最简单方法是使用您正在考虑的配置在中等到重负载下运行几个基准测试,并比较总的 CPU/内存/磁盘/网络负载。