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