如何从单服务器设置成长


8

我正在寻找有关如何增加服务器设置的资源。

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

HPDL385_G2_PrevGen
HP单双核心Opteron 2214(2.2Ghz)
4GB RAM
2个10,000个RAID 1中的SCSI驱动器

我们的流量每月高达550,000 UV。

该站点运行PHP和MySQL安装程序。数据库受到了绝对的打击,我们有很多复杂的查询连接到多表。

我们正在使用APC进行PHP缓存。

我已经进入了尽可能多地完成数据库和查询优化的阶段,并且想知道下一步应该做什么……

我看过内存缓存,但给人的印象是他需要大量的RAM,理想情况下需要专用的盒子...。

下一步是拥有两个框。一个用于数据库,一个用于Apache?还是有我忽略的步骤。

我们的负载通常在2个标记附近,但是现在它已达到20个标记!

来自穆宁的一些图表:

MySQL的 中央处理器 记忆


我会检查一下Erik,谢谢。有人认为增加RAM数量会产生很大影响吗?我认为,Rackspace的价格很高,每GB IIRC 50英镑/月。

您正在执行MySQL读写操作,还是一个比另一个重要?
wag2639

我不认为这应该从SO中删除。扩展到一个盒子之外既是编程问题,又是硬件问题。实际上,更多。购买硬件很容易。编写以水平可伸缩方式利用它的代码很难。
Frank Farmer

wag2639绝大多数查询都是选择的。根据我的munin图表,缓存命中次数约为总数的50%。峰值为2,160 QPS,平均522 QPS。
乔恩M

Answers:


3

购买一些硬件,但将其放在测试实验室中而不是数据中心中。然后在各种硬件/软件组合上强调您的应用程序,直到找到可以满足您需求的合理应用程序为止。

当然,您需要进行一些设计,以针对运行应用程序测试副本的类似生产的数据库创建虚假流量。但是谁说这很容易。

如果您不这样做,而只是在生产中做一些事情,那么您就不知道它是否会工作,并且您可能已经花费了大量的工程工作来实现诸如缓存之类的东西(这些东西将与他们的合理份额一同出现)。的错误!)在没有帮助的地方。

测试,测试和测试更多。在获得良好的性能数据表明它可能会大大改善问题之前,请勿将硬件/软件更改投入生产。工程上的工作是昂贵的,而测试硬件不是(特别是)。


Memcached只是一种选择,您可能不需要考虑它,直到数据库的缓存达到最佳工作状态为止。这意味着将其放在具有合理数量的RAM(不是4G-如今的笔记本电脑已经具备; 32G绝对可以承受)的专用(当然是64位)盒子上,并对其进行适当的调整。

您没有提到数据库有多大,但是如果它完全可行,您将希望尝试完全将其存储在ram中(或至少在热点中)。将您的数据库完全放在ram中将使读取IO操作完全消失,因此不再成为瓶颈。

分析您的数据库查询。有很多工具可以做到这一点-您应该能够在测试环境中模拟生产负载。诀窍是避免缓慢的查询,并确保频繁执行的查询快速。

如果您的性能问题与IO同步有关,因为您正在为数据库执行过多事务,请确保您使用的电池备份RAID控制器运行正常(与您的供应商联系以了解它们)。与没有电池支持的操作相比,它们提供了更多的IO写入操作(因为数据仅需要在OS得到确认之前到达缓存)。另外,如果您的数据无关紧要,请考虑放宽数据库的持久性参数(提交时进行innodb同步)。


当您租用硬件时,32G的价格并不便宜。当您只有一个或两个盒子时,租用硬件通常会更经济。
Frank Farmer

MarkR / Frank,您能否根据我上面发布的图表提供更多见解?我对额外RAM的最后报价是〜£50 / GB /月!
乔恩·M

1

正如许多其他建议所指出的那样,通过研究缓存解决方案,您可以期望最终获得当前负载的大约10%,甚至更少。

但是,这取决于您在计算机上运行哪种服务。您可以在没有太多RAM的情况下使用memcached进行很多操作。

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

缓存一些选定的MySQL查询的结果(即使是很短的时间)也可以真正提高您的性能。


感谢Vegard。是的,我会定期查询慢查询日志并在查询中解释命令。该服务器几乎只运行apache实例和MySQL,但是我们也做一些事情,例如视频转换,这是我正在迁移到云服务器的过程。

如果您的问题确实是用完了Apache线程,则可以通过在Apache前面安装nginx(或另一个轻量级反向代理)来减轻一些负担。然后,Nginx可以提供静态内容,并承担用勺子喂入慢客户端字节的任务,从而释放Apache来完成其真正需要做的事情:充当PHP应用程序容器。对于这一概念的更完整的概述,请参阅:modperlbook.org/html/...
弗兰克农民

谢谢弗兰克,这显然是明智的,我已经尽我所能地迁移到Amazon S3,最初只是UGC,但现在我也尝试将所有图形和CSS元素都放在上面。我确定需要对Apache和MySQL进行一些调整。
乔恩·M

1

我做了很多工作并进行了扩展工作,发现的是:

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

诸如添加更多内存,获取另一台服务器,执行y,尝试x之类的通用响应通常使人感到沮丧,而不得不进行复杂的设置。

衡量正确的事情

最大的挑战之一是确定哪些基准很重要。这通常需要退后一步,您必须将自己放在客户的鞋子上。有时,简单的网站设计更改会给Web访问者带来巨大的好处。这就是为什么我喜欢YSlow之类的工具的原因!这更多地侧重于最终用户的体验,而不是服务器级别。一旦确定了适合您站点的基准,就可以开始进行调整。基准可能是页面总加载时间,页面总大小,缓存有效性,站点延迟等。您必须选择对您的应用程序有意义的参数。

螺母和螺栓

您正在跟踪正确的基准,但是从一个很低的水平开始。我喜欢使用sysstat。您可以从sysstat获取大量信息,并帮助您弄清楚哪个系统可能会限制整体应用程序性能。通常,我将性能问题归结为:

  • 网络堆栈
  • 内存堆栈
  • 磁盘io
  • 应用层
  • 操作系统层

使用sysstat和其他工具,您可以开始理清头绪,找到限制性能的系统。

例如,我发现高负载服务器由于其应用程序的配置方式而失败。缓存不佳,静态内容缺少到期标头,使用HTTP vs.file include等都导致应用程序性能下降。解决这些应用程序问题无需更改硬件。在其他情况下,尽管有大量缓存,但我仍然看到磁盘已满。移至更快的磁盘可解决此问题。

冲洗并重复

通常,在应用程序调整期间,您会拉开一个瓶颈,仅找到另一个瓶颈。这就是为什么我建议尝试监视正在调整的内容的原因。

例如,假设您解决了磁盘IO问题,但是您的应用仍然运行缓慢。您可能认为您浪费了您的精力,但是发生的事情是您简单地遇到了另一个瓶颈。通过仔细监视磁盘IO,即使您的重要应用程序性能监视器没有发生变化,您也可以确保改善磁盘IO。

获取正确的工具

确保您使用正确的工具完成工作。监视,测试,基准测试,性能分析和其他优化技术都具有多种工具。找到最适合您情况的工具。

经验法则

虽然每个应用程序都是唯一的,但我确实找到了一些标准的起点:

  • 内存数据库爱记忆
  • 磁盘raid 10以外的任何东西都可以破坏数据库性能
  • 错误的优化-大价值不会转化为大绩效
  • 应用程序-将服务器设计不合理归咎于服务器

下一步

如果找不到瓶颈,则添加服务器可能无济于事。要解决磁盘IO,您可能需要其他服务器或SAN。如果您遇到内存瓶颈,则另一台服务器只能通过添加更多RAM来解决问题。与仅向现有服务器添加更多RAM相比,此举的成本相当高。

快速解决

过度部署。当应用程序堆栈出现问题时,我不得不这样做。基本上加载CPU,RAM和磁盘IO(RAID 10、15K SCSI或SSD)。充分利用硬件,然后开始调整。在解决问题之前,这可以使您保持生计。


0

我要说的下一步应该是缓存(数据缓存和/或页面缓存取决于您的功能)。如果memcached看起来过于复杂,则可以从简单的数据缓存解决方案开始,例如PEAR Cache Lite,该解决方案仅需要几行代码,但可能会带来很大的不同。例如,Smarty模板引擎支持页面(或页面部件)缓存。

一旦缓存不再削减,那么您就可以增加服务器数量,因为没有其他东西了。


感谢您的建议Serg,我已经在各个地方缓存到HTML,并使用了一些通宵的数据库查询来填充一些“快速查找”表。

0

如果您有足够的可用RAM,则即使在同一盒子上,memcached也会为您提供帮助。尝试缓存几个最繁重的查询,看看会发生什么。另外,Apache太重了,请改用nginx或lighttpd(PHP应用程序通过FastCGI运行,请参阅php-fpm)。


如果您有足够的可用RAM,并且mysql回答读取查询的速度很慢,则您的mysql调整不正确。使用ram代替数据库。MySQL的缓存对应用程序是完全透明的,不会引入错误,并且永远不会返回过时的数据。
MarkR 2010年

对于许多工作负载,mysql查询缓存无效化的程度太大,以至于不值得。更新表上的一行将使对该表的每个查询均无效。
Frank Farmer

0

开始缓存,但是暂时忽略MySQL。认真地

规则应为-尽早停止请求。因此,反向代理或适当的Apache级别缓存将为您带来最佳结果,然后在应用程序内部进行sql级别结果缓存,然后是sql级别缓存;)

停止请求的时间越早,开销就越少。输出缓存级别-可以说甚至不需要运行PHP。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.