我有一个用 PHP 编写的 Facebook 应用程序。它每分钟的页面浏览量为 150 次,到今年年底,每分钟的页面浏览量将高达 300 次。在获得更多 PV 的同时,我开始遇到可扩展性问题,因此我想请教您如何扩展以成功处理 300 PV / 分钟的建议。
我的应用程序是一个类似测验的应用程序,它托管在可以使用的 VPS 上:
- 100% 的单核 2,6 GHz 处理器
- 500 MB,最多 2 GB RAM(cat /proc/user_beancounters 说我真的有 privvmpages = 500 MB,free -m 显示 2 GB)
我的 VPS 配置如下:
- Centos 5
- 轻量级
- 内存缓存
- 装甲运兵车
- MySQL
- PHP 使用 FastCGI
上个月,我使用互联网上提供的一些教程完成了对 MySQL、Lighttpd 和 PHP 配置的优化。我已经设法广泛使用 Memcached,因此许多请求下降到 1 毫秒,而那些未被 memcache 处理的请求最多需要 300 毫秒。我已经为 MySQL 添加了良好的索引,因此它不在用户的范围内。
一段时间以来,上述优化足以处理新请求,但最近由于应用程序的日益普及,我注意到一些请求需要超过 3 秒的时间,并且在关键爆发时,我的 Lighttpd 只是说 f*** 你和用户得到内部服务器错误 500。
我已经设法找到(我今天肯定会知道)通过设置来修复错误 500 的解决方案:
"PHP_FCGI_MAX_REQUESTS" => "500"
但是可扩展性问题仍然没有解决。我需要能够处理比现在多 2 倍的请求。我认为如何做到这一点。以下是我今天提出的解决方案:
- 在 2 个内核上将 VPS 升级到 3,3 GHz
- 购买另一个 VPS 并将数据库移到那里
- 向某人寻求帮助(我现在这样做)
我可以在我的 VPS 分销商处购买一个更大的计划,它有 3,3 Ghz 代替我现在拥有的 2,6 Ghz,并且在 2 个内核上不是一个内核。这将需要更多的钱,但它可以帮助我吗?如何计算它是否可以处理 300 PV?
我的第二个想法是购买另一个 VPS 并将数据库移动到那里。它应该为 FastCGI 进程和数据库进程提供 CPU 和内存增益。但是如何知道是否最好生成另一台服务器或为此购买更大的计划?
所以我进入了 3 点——问某人。所以我在这里 - 一个程序员,而不是管理员,有一个非常大的可扩展性问题并寻求你的帮助。
我想知道如何计算我当前的 VPS 可以处理的每分钟多少 PV - 这将帮助我做出决定。因为如果 300 PV 超出了我目前的 VPS 能力 - 我可以立即考虑其他解决方案,而不是更多地搞乱配置。
其次 - 如果我的 VPS 有可能处理更多请求 - 这是配置问题 - 我需要在这个问题上有更多知识的人的帮助来帮助我正确设置配置。我可以在此处提供此配置或通过电子邮件发送某人,并希望您有时间和知识来帮助我。我没有时间在这件事上做更多的实验。
最后 - 如果它超出了我的 VPS 能力,我想知道你如何决定我应该升级我的 VPS 还是生成另一台服务器?对于 300 PV 目标,哪种解决方案会更好?
如果您提出我的问题,非常感谢您提前提出问题。您的帮助、建议或与可以在此问题上提供帮助的人的联系对我来说非常有帮助!
合理配置的 VPS 的致命瓶颈通常是磁盘 I/O,因为在给定主机上运行的所有 VM 将共享同一个磁盘(或磁盘阵列 - 好的 VPS 主机会将您的 VM 放在 RAID10 阵列或类似阵列上),在事实上,如果使用外部驱动器阵列进行设置,有时多个主机价值的 VM 将共享同一个阵列。当内存变短时这一点尤其明显,因为您的数据库查询将始终命中磁盘,因为没有 RAM 来缓存数据的核心工作集。
您可能会发现拥有自己的低规格专用服务器会改善问题,因为您的需求可以独占原始 I/O 带宽,并且您会看到更少的 I/O 延迟,因为驱动器磁头只会为您的 I/O 来回翻转/O 也不会请求其他几台机器的 I/O 请求。这甚至可能最终比“运行两个 VPS”解决方案的成本更低,特别是当您考虑到在许多情况下,VM 之间的数据传输将计入您的机器的 badwidth 配额(请与您的主机核实 - 并非总是如此,但除非您被明确告知这不是更安全的假设)因此您可能会增加与带宽相关的成本。您可能会感到惊讶,您可以租用一台基于 P4 的小型机器,
500Mb 的内存可能是一个限制,所以回到将两个 VPS 拆分为两个 VM 的想法,这样您的数据库就不会与您的 FastCGI 竞争,并且 memcached 进程可能会有所帮助。同样,分配更多的固定 RAM 可能是值得的——我从不相信“突发 RAM 分配”的想法,因为我认为每个操作系统都会尝试使用尽可能多的 RAM 来提高 I/O 效率(尽管我从未使用过使用可突发 RAM 分配的主机,因此没有直接证据支持缺乏信心!)。其余的做什么
free -m
节目?另外,您的数据库有多大?分配更多的固定 RAM 可能比转移到便宜的专用服务器更有帮助(因为大多数更便宜的选项只有 512Mb 物理 RAM,尽管大多数也可以升级为额外费用),具体取决于 512Mb 的狭窄程度实际上是如何满足您的需求。抱歉,这不是一个特别直接的答案...
要测试 RAM 如何依赖于您的性能,您可以在本地机器上设置一个类似规格的 VM,在其中复制您的设置,然后在其中投入一些基准测试软件(http://httpd.apache.org/docs/1.3/programs /ab.html是一个开始的地方)然后增加分配给 VM 的 RAM,以查看它对错误开始出现的位置有什么影响。您也可以通过分别运行几个其他简单的 VM 来模拟错误的 I/O 争用执行某种 I/O 基准测试,例如 bonie++。
抱歉,但你确定你是在谈论每分钟的页面浏览量,而不是每秒钟?每分钟 300 页只意味着每秒 5 页,任何手机都应该能够不费吹灰之力地传递,所以我真的无法想象 2.6 GHz 的 CPU 无法做到这一点!
如果你真的确定你在谈论分钟,那么监控你的磁盘 I/O、CPU 和内存。一个设计合理的应用程序不可能运行得那么慢,所以你必须在某个地方遇到一个巨大的调整问题。也许您正在对 MySQL 数据库或 memcache 进行数千次访问,并且您对 I/O 延迟非常敏感(在这种情况下,CPU 将几乎未使用)。如果你的 CPU 一直都是满的,那么你的代码有问题,尝试优化 I/O 和其他组件是没有价值的,唯一可行的解决方案是修复代码。
我倾向于同意 David Spillett 的回答。我要补充一点,将您的应用程序和数据库放在同一个节点上也是一个主要瓶颈,因为数据库通常需要大量内存。我托管了几个与您描述的一样繁忙的高流量站点,我们从未将数据库层放在虚拟机上,也从未与我们的 Web 和应用程序层放在同一层;我们的数据库始终在真实的专用硬件上运行。
根据架构,我们的前端使用 Cisco CSM 进行负载平衡,但您可以使用 apache 进行类似的负载平衡。
如果您是一家 Linux 商店,那么在没有昂贵的 Cisco 硬件的情况下,有很多方法可以解决这个问题。
看看这个: http ://haproxy.1wt.eu/
这是非常非常困难的。很难预测优化会产生什么影响。以及与系统其他部分的交互。
你需要进行实验。
如果你不能实验,任何人都可以做的就是盲目猜测。这可能会奏效。你可能会有一个特别幸运和准确的盲猜。
您应该分析和检查您正在运行的系统。有人在上面“猜测”你正在点击交换,这可能是一个很好的猜测。首先使用top, vmstat, sar 来了解盒子在做什么。你的 CPU 是固定的吗?你在做大规模的IO吗?你在换吗?这些将使您合理地了解问题所在。
您的问题可能存在于 lighthttpd、PHP、memcache、MySQL 之间。通常的嫌疑人会是:
您应该能够将问题定位到这三个之一。
每分钟 300 次页面浏览量并不多,即每秒 5 次页面浏览量,所以似乎发生了一些不正常的事情。