如何从单一服务器设置发展

我正在寻找如何发展我们的服务器设置的资源。

我们目前在英国有一个Rackspace专用服务器,规格如下:

HPDL385_G2_PrevGen
惠普单核双核皓龙2214(2.2Ghz)
4GB内存
RAID 1中有两个10,000个SCSI驱动器

我们的stream量每月高达550,000 UVs。

该网站运行一个PHP和MySQL的设置。 数据库得到一个绝对的锤击,我们有许多复杂的查询joinmultilpe表。

我们正在使用APC进行PHPcaching。

我已经到了我已经完成尽可能多的DB和查询优化的阶段,并且想知道下一步应该是什么……

我已经看了memcache,但我有一个印象,他需要大量的内存,理想情况下专用的盒子….

下一步有两个盒子。 一个用于数据库,一个用于Apache? 还是有一个我忽略了一步。

我们的负荷通常在2分左右,但现在是20点!

来自Munin的一些图表:

MySQL的中央处理器记忆

购买一些硬件,但将其放入您的testing实验室而不是在数据中心。 然后在各种硬件/软件组合上强调你的应用程序,直到你find一个合理的应用程序,它将做你想要的。

当然,你需要devise一些能够对运行应用程序testing副本的类似产品的数据库产生假stream量的东西。 但是谁说这很容易。

如果你不这样做,只是做一些生产中的东西,你不知道它是否会工作,你可能已经花了很多工程努力实现像caching(这将与他们的公平份额的错误!)的东西,这并没有帮助。

testing,testing和testing更多。 除非有良好的性能数据表明可能会显着改善问题,否则不要将硬件/软件更改投入生产。 工程努力是昂贵的,testing硬件不(特别是)。


Memcached只是一个select,你可能不需要考虑它,直到数据库的caching工作达到最佳状态。 这意味着把它放在一个专用的(64位,当然)与合理的内存(不是4G – 现在的笔记本电脑,32G肯定是负担得起的)盒子,并适当调整。

你没有提到你的数据库有多大,但是如果可行的话,你会想要完全用ram(或者至less是热点)来获取它。 完全以ram方式获取数据库将使读取IO操作完全消失,因此不会成为瓶颈。

分析您的数据库查询。 有这样做的工具 – 你应该能够在你的testing环境中模拟生产负载。 诀窍是避免查询缓慢,并确保经常执行的查询速度很快。

如果性能问题与IO同步相关,因为您只是为数据库做了太多事务,请确保您使用的是正确运行的电池供电的RAID控制器(与供应商讨论)。 他们提供了比非电池支持更多的IO写操作(因为数据只需要在操作系统得到确认之前进入caching)。 或者,如果你的数据不重要,考虑放宽数据库的耐久性参数(innodb同步提交)。

通过研究caching解决scheme,正如许多其他人在这里所build议的那样,预计最终可能会有10%的负载,也许更less。

但是,这取决于您在机器上运行的服务types。 使用memcached可以做很多没有很多RAM的东西。

您应该尝试通过使用MySQL的慢速查询日志 (或您的数据库的等价物)或使用诸如mytop之类的工具来分析哪些数据库查询花费的时间最长。 另外,MySQL的EXPLAIN SELECT语法可能会有所帮助。

caching几个选定的MySQL查询的结果(即使只是很短的时间)可以真正提高你的性能很多。

我做了很多的工作和扩大工作,我发现的是:

每个应用程序负载是唯一的

通用的反应,如添加更多内存,获得另一台服务器,做Y,尝试X往往是挫折经验教训,并留下错综复杂的设置。

衡量正确的事情

其中最大的挑战之一是确定哪些基准很重要。 这往往需要退一步,你必须把自己放在你的客户的鞋子。 有时候,简单的网站devise变化对网页访问者意味着巨大的好处。 这就是为什么我喜欢YSlow这样的工具! 它更多地关注最终用户的体验而不是服务器级别。 一旦你决定了什么是你的网站的正确的基准,那么你可以开始调整。 基准可能是整个页面加载时间,总页面大小,caching有效性,站点延迟等。您必须select一个适合您的应用程序的。

螺母和螺栓

你正在跟踪正确的基准,开始在一个非常低的水平。 我喜欢使用sysstat。 您可以从sysstat获得丰富的信息,并帮助您区分哪个系统可能会限制整体应用程序的性能。 一般来说,我把性能问题归结为:

  • networking堆栈
  • 内存堆栈
  • 磁盘io
  • 应用程序层
  • os层

使用sysstat和其他工具,你可以开始分割头发,并find限制性能的系统。

例如,我看到高负载的服务器由于其应用程序的configuration而失败。 caching不足,缺less静态内容的过期头文件,使用HTTP与文件包含等等都会导致较差的应用程序性能。 解决这些应用程序问题不需要更改硬件。 在其他情况下,尽pipe存在大量的caching,但我看到磁盘已经超出了容量。 转移到更快的磁盘解决了这个问题。

冲洗并重复

通常在应用程序调优期间,您将解开一个瓶颈,find另一个瓶颈。 这就是为什么我build议试图监视你正在调整的任何东西。

例如,假设您修复了磁盘IO问题,但是您的应用程序仍然很慢。 你可能会认为你已经浪费了自己的努力,但是发生了什么事情就是简单地遇到了另一个瓶颈。 通过仔细监视磁盘IO,即使重要的应用程序性能监视器没有改变,也可以确定您正在改进磁盘IO。

获得正确的工具

确保你使用正确的工具来完成这项工作。 监视,testing,基准testing,分析和其他优化技术都有各种各样的工具。 find最适合您的情况的工具。

经验法则

虽然每个应用程序都是独特的,但我确实find了一些标准的起点

  • 内存数据库爱内存
  • 磁盘io什么,但突袭10可以杀死数据库的性能
  • 错误的优化 – 大的价值不会转化为大的performance
  • 应用程序 – 指责糟糕的应用程序devise的服务器

你的下一步

如果你没有find你的瓶颈,添加服务器可能没有多大帮助。 要解决磁盘IO,您可能需要另一台服务器或SAN。 如果你有一个内存瓶颈,另一台服务器只能解决这个问题,因为它增加了更多的内存。 相比于向现有的服务器添加更多的RAM,这相当昂贵。

快速解决

过度部署。 当出现应用程序堆栈问题时,我必须这样做。 基本上加载CPU,RAM和磁盘IO(RAID 10,15K SCSI或SSD)。 在硬件上做大,然后开始调整。 这使你保持漂浮,直到你解决问题。

我会说下一步应该caching(数据caching和/或页面caching取决于你的function)。 如果memcached看起来太复杂了,那么可以从简单的数据caching解决scheme开始,比如PEAR Cache Lite , 它只需要几行代码就可以产生巨大的效果。 例如,页面(或页面部分)caching是由Smarty模板引擎支持的。

一旦caching不再削减它,那么你可以增加服务器的数量,因为没有别的东西了。

如果你有足够的可用RAM,memcached甚至可以在同一个盒子上帮你。 尝试caching几个最重的查询,看看会发生什么。 此外,Apache太重,使用nginx或lighttpd(而PHP应用程序通过FastCGI工作,请参阅php-fpm )。

开始caching,但暂时忽略MySQL。 Seriouosly。

规则应该是 – 尽可能地停止一个请求。 所以,一个反向代理或适当的Apache级别的caching将会得到最好的结果,然后在应用程序中执行sql level结果caching,然后执行sql级别caching;)

你越早停止请求,你的开销就越less。 输出caching级别 – 即使PHP需要运行,可以这么说。