如何缩放超过每分钟150页面浏览量?

我有一个用PHP编写的Facebook应用程序。 它每分钟有150页面浏览量,到今年年底将达到每分钟300页面浏览量。 在获得更多PV时,我开始遇到可扩展性方面的问题,因此我想请教您如何扩展以成功处理300 PV /分钟的build议。

我的应用程序是一个类似quizz的应用程序,它托pipe在VPS上,可以使用:

  • 一个核心2,6 GHz处理器的100%
  • 500 MB,高达2 GB的RAM(cat / proc / user_beancounters表示,我真的privvmpages = 500 MB,免费-m显示2 GB)

我的VPS的configuration是这样的:

  • Centos 5
  • Lighttpd的
  • Memcached的
  • APC
  • MySQL的
  • PHP使用FastCGI

尽pipe上个月我已经使用互联网上提供的一些教程来优化MySQL,Lighttpd和PHPconfiguration。 我设法广泛使用Memcached将这么多请求降低到1ms,而那些未经memcache处理的请求则需要300 ms。 我已经给MySQL添加了很好的索引,所以它不在用户的范围之内。

一段时间以上的优化足以处理新的请求,但最近由于应用程序的日益普及,我注意到一些请求需要超过3秒,并在爆炸中我的Lighttpd只是说你和用户得到内部服务器错误500。

我已经设法find(我今天肯定知道这个)解决scheme来修复错误500设置:

"PHP_FCGI_MAX_REQUESTS" => "500" 

但是可扩展性问题还没有解决。 我需要能够处理比现在多2倍的请求。 我想如何做到这一点。 以下是我今天提出的解决scheme:

  1. 将2个核心上的VPS升级到3.3 GHz
  2. 购买另一个VPS并在那里移动数据库
  3. 询问某人的帮助(我现在所做的)

我可以在我的VPS经销商那里购买一个更大的计划,那就是我现在拥有3.3Ghz的2.6Ghz,而不是两个核心。 这将需要更多的钱,但它可以帮助我吗? 如何计算它是否会处理300 PV?

我的第二个想法是购买另一个VPS并在那里移动数据库。 它应该为FastCGI进程和数据库进程提供CPU和内存。 但是,如何知道是否更好地产生另一台服务器,或为我现在购买更大的计划呢?

所以我进入3点 – 问问别人。 所以我在这里 – 程序员,而不是pipe理员,具有非常大的可伸缩性问题,并寻求你的帮助。

我想知道如何计算我现有的VPS可以处理的每分钟多lessPV – 这将帮助我做出决定。 因为如果300 PV超出了我目前的VPS能力 – 我可以立即想出其他的解决scheme,而不是更多的configuration。

其次 – 如果我的VPS可以处理更多的请求 – 这是configuration问题 – 比我需要一些在这个问题上有更多知识的人的帮助,以帮助我设置configuration的权利。 我可以在这里提供这个configuration或通过电子邮件发送人,希望知道谁有时间和知识来帮助我。 我没有时间在这个问题上进行更多的实验。

最后 – 如果超出了我的VPS能力,我想知道如何决定升级我的VPS还是重生另一台服务器? 300 PV目标有什么解决scheme会更好?

如果您提到我的问题,请提前非常感谢您。 你的帮助,build议或联系人可以帮助在这个问题将是非常helfull对我来说!

合理devise的VPS的杀手瓶颈通常是磁盘I / O,因为在给定主机上运行的所有VM将共享相同的磁盘(或磁盘arrays – 良好的VPS主机将使您的VM位于RAID10arrays或类似arrays上),事实上,如果有几台主机的虚拟机使用extrernal驱动器arrays进行安装,它们将共享相同的arrays。 当内存变得很短时,这是特别明显的,因为即使是数据的核心工作集,由于没有RAM来caching数据库查询,所以它们总是会碰到磁盘。

您可能会发现,获得自己的低规格专用服务器会改善问题,因为您的需求可能会垄断原始I / O带宽,并且您将看到更less的I / O延迟,因为驱动器头只是为了您的I而来回移动/ O也不要求其他几台机器的I / O请求。 这甚至可能比“运行两个VPS”解决scheme的花费更less,特别是当你考虑的时候,比在许多情况下,在虚拟机之间的数据传输将计入你机器的带宽限额(与你的主机检查 – 这并不总是这样,除非你明确告诉它不是假设它是安全的),所以你可能会增加带宽相关的成本。 你可能会感到惊讶,你可以租一台小型P4机器,从你的描述来看,我怀疑CPU功耗是你的瓶颈(内存和I / O争用是更可能的罪魁祸首)。

500Mb的内存可能是一个限制,所以回到两个VPS的想法分裂到两个虚拟机,所以你的数据库不与你的FastCGI和memcached processessess竞争可能会有所帮助。 同样,也许值得获得更多的固定RAM分配 – 我从来没有对“可分配内存分配”的想法有任何信心,因为我假设每个操作系统将尝试使用尽可能多的RAM,因为它可以为I / O效率(尽pipe我从来没有使用过使用可分配内存分配的主机,所以没有直接的证据来支持穆迪缺乏信心!)。 剩下的free -m显示什么? 另外,你的数据库是什么样的大小? 获得更多的固定RAM可能比移动到便宜的专用服务器更有帮助(因为大多数便宜的选项只有512Mb的物理RAM,但大多数也可以升级以获得额外的成本),具体取决于512Mb实际上是多么的符合你的需求。

对不起,这不是一个特别直接的答案…

为了testing内存依赖于你的性能,你可以在你的本地机器上安装一个类似规格的虚拟机,重复你的设置,然后在其上添加一些基准testing软件( http://httpd.apache.org/docs/1.3/programs /ab.html是一个开始的地方),然后增加分配给虚拟机的内存,以查看错误何时开始发生。你可以通过运行其他一些简单的虚拟机来模拟错误的I / O争用执行某种types的I / O基准,比如bonie ++。

对不起,你确定你正在讨论每分钟的页面浏览量,而不是每秒钟? 每分钟300页只意味着每秒5页,任何手机都应该能够在不出汗的情况下交付,所以我真的无法想象一个2.6 GHz的CPU无法做到这一点!

如果你真的确定你正在谈论几分钟,那么监视你的磁盘I / O,CPU和内存。 这是不可能的,一个devise得当的应用程序运行缓慢,所以你必须有一个巨大的调整问题的地方。 也许你正在对MySQL数据库或memcache进行数以千计的访问,并且对I / O延迟非常敏感(在这种情况下,CPU几乎不会被使用)。 如果你的CPU一直是满的,那么你的代码有问题,试图优化I / O和其他组件是不值得的,唯一可行的解​​决scheme就是修复代码。

我倾向于同意斯派列特的回应。 我会补充说,把你的应用程序和数据库放在同一个节点上也是一个主要的瓶颈,因为数据库一般都是内存饿的。 我主持了几个高stream量的网站,就像你描述的一样繁忙,我们从来没有把我们的数据库层放在虚拟机上,也不在我们的networking和应用层上。 我们的数据库总是在真实的专用硬件上运行。

我们的前端(取决于体系结构)与思科CSM负载平衡,但您可以使用apache进行类似的负载平衡。

如果你是一个Linux商店,没有昂贵的思科硬件,有很多方法可以解决这个问题。

看看这个: http : //haproxy.1wt.eu/

我想知道如何计算我现有的VPS可以处理的每分钟多lessPV – 这将帮助我做出决定。 因为如果300 PV超出了我目前的VPS能力 – 我可以立即想出其他的解决scheme,而不是更多的configuration。

这非常非常困难 预测优化会产生什么影响是非常困难的。 并与系统的其他部分进行交互。

你需要试验。

其次 – 如果我的VPS可以处理更多的请求 – 这是configuration问题 – 比我需要一些在这个问题上有更多知识的人的帮助,以帮助我设置configuration的权利。 我可以在这里提供这个configuration或通过电子邮件发送人,希望知道谁有时间和知识来帮助我。 我没有时间在这个问题上进行更多的实验。

如果你不能做实验,任何人都可以做的是盲目猜测。 哪个可能工作。 而且你可能有一个特别幸运和准确的猜测。

你应该分析和检查你的运行系统。 有人“猜到”你正​​在交换,这可能是一个很好的猜测。 首先使用top,vmstat,sar来得到一个盒子在做什么的图片。 你有你的CPU挂钩? 你在做大量的IO吗? 你换了吗? 这些会给你一个合理的想法是什么问题。

你的问题可能存在于lighthttpd,PHP,memcache,MySQL之间的任何地方。 通常的嫌疑人会有:

  • PHP钉住你的CPU
  • memcache有一个caching命中(没有足够的空间来caching你需要的一切)
  • MySQL很慢。 例如,如果您正在进行大量写入操作,写入争用可能会导致您无法访问。

你应该能够指出这三个问题之一。

每分钟300页面浏览量不多,这是每秒5页面浏览量,所以似乎有不可思议的事情发生。