在缩放和调整性能方面的真实经验


54

据称,我正在工作的网站在发布后不久将具有很高的点击率。客户正在谈论一天之内每秒大约2500次点击的可能性。

忽略这个命中率可能是疯狂的客户端乐观的事实,除了获得最大的服务器以外,应该配置Drupal支持最大命中率的最佳方法是什么。

我读过缩放drupal.org基础设施Drupal的性能博客最佳实践缩放的Drupal和其他许多网页,但我正在寻找的是这样做的真实经历,是什么在起作用,什么不和什么期望。

Answers:


47

Markdorison的答案基本上是解决此问题的公认方法。我将进一步介绍。

当D6的Pressflow或D7的Drupal,Memcached和Varnish都可以很好地协同工作时,您需要自定义代码VCL文件。有一些免费的入门技巧,但是您始终需要与他们一起玩。

为了使Varnish发挥最佳性能,请确保使用-s malloc xG而不是默认的-s文件/ path / to / file来启动它。另外,使用Varnish可以使Varnish尽可能长时间地缓存静态项目。

如果您有多个Web服务器,请从VCL中发送到Varnish的标头中删除ETag。我还删除了Expires,仅依靠标题中的Age和max-age来使浏览器返回该站点。

1.5版(截至2011年3月3日)仍然是Drupal.org最快的Memcached模块版本。我通常使用每台服务器单个容器来部署它,以降低tcp流量,以便大规模连接到多个容器)

将“性能”中的缓存配置为外部,并设置最长期限,该期限将正确的标头发送到诸如Varnish之类的缓存代理。

如果您无法在Varnish中正确缓存某些页面,请查看网络上的博客文章,其中详细介绍了如何检查请求。这是我前阵子写的一个示例帖子:是什么阻止了Varnish和Drupal Pressflow缓存匿名用户的页面视图

您应该为MySQL选择InnoDB(或其他提供商(例如XtraDB)的其他名称之一)并将所有表移入其中。然后查看此博客文章以获取基本的调优建议http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/

拥有很大的缓冲池从根本上来说很重要。在站点进行负载测试时,请打开慢速查询日志。您可能首先希望捕获耗时超过50毫秒的查询,然后对查询进行调优,并重复减少慢速日志捕获时间,直到大多数查询都使用索引运行并迅速执行为止。

其他基础知识包括在PHP中使用APC。如果您追求快速CGI而不是mod_php,请花一些时间通过配置一个好的包装器脚本来使APC缓存在php实例之间共享。还要确保APC缓存在内存映射文件中,以将PHP的最后每一位都压缩掉。


“如果要使用快速CGI而不是mod_php,请花一些时间通过配置一个好的包装器脚本来使APC缓存在php实例之间共享。还要确保APC缓存在内存映射文件中,以压缩所有最后一位淘汰PHP。” :好的,怎么做?谢谢
约翰

1
对于内存映射的apc,它取决于编译标志... php.net/manual/en/apc.configuration.php
Stewart Robinson

23

我建议从Pressflow(如果使用Drupal 6),MemcacheVarnish和某种形式的内容分发网络(CDN)(例如Akamai)开始。最终结果应该是实际访问原始服务器的用户尽可能少。

如果页面的某些部分无法为非匿名用户缓存(特定于该用户的内容,例如“ Welcome userX”等),则可以探索选项来填充页面的这些部分,例如异步回调或边缘包含。

如果您需要能够查看站点的未缓存版本的内部用户小组(例如,一组编辑者)较小,则建议您将站点的未缓存版本暴露在其他URL(受VPN保护)下或同等的费用(如果可能)。


理查德:我很高兴。如果您有任何后续问题,请告诉我。
markdorison 2011年

16

每天每秒2500次点击-如果您按“点击”表示“已投放页面”,则意味着每天有2.16亿页。让我告诉你:您每天没有2.16亿页。我爱这些客户...

就是说,原始流量数据什么也没说。如果您所拥有的全部都是匿名流量,但是如果已登录流量,那么此线程中的建议听起来很像Varnish / CDN,那么您将面临挑战。但是在花费大量的时间和精力来解决问题之前,请确保您问题。每秒2500次点击,必应得到的比这还少,您意识到吗?


2
2500 / sec是客户的数量,我认为我们都认为这是一个疯狂的猜测;这就是我所要做的。事实证明,发射并没有像他们计划的(希望的)那样成功,而且奇怪的是,实际速度达到每秒20页(页面)的时间约为10分钟-主要是匿名的,每天平均7.32页/秒.....
理查德·哈里森

7
  • 服务器端

    • 安装Varnish以缓存匿名用户的页面。
    • 安装持久性缓存系统(Memcached,APC,Memcache)。
    • 使用CDN(例如Akamai)提供静态文件(JavaScript,CSS,图像)。
  • 代码面

    • 使用Pressflow,它可以使Varnish为匿名用户提供缓存的页面。
    • 清洁Drupal的看门狗表。每次记录看门狗错误时,都会消耗Web服务器和数据库服务器上的CPU资源。这也大大增加了加载时间。
    • 实施静态和持久性缓存策略,直到慢查询日志变得干净为止。
    • 不惜一切代价避免在嵌套的foreach循环中发生PHP错误。
    • 卸载未使用的模块。
    • 打开Drupal核心块和视图的缓存。
  • 数据库

    • 确保正确索引了表,以加快搜索速度。
    • 不要存储不必要的记录,访问100个节点的数据库总是比访问300万个节点的数据库更快。


4

虽然很难预测模式,但是如果您对流量水平有一个合理的了解。负载测试您的解决方案。有很多不同的选项,只有在您获得实时流量后,才能进行很多预测,但是如果您尽可能多地进行测试,则至少可以确信您的设置可以处理流量。

如果不先进行测试,世界上所有的调音都将无济于事。

这是DC SF上有关经济学家如何做的演讲。 http://sf2010.drupal.org/conference/sessions/performance-testing-economist-online-using-grinder


演示文稿的链接确实非常有用。谢谢
理查德·哈里森

4

对于高流量的网站,您应该使用多个服务器和负载平衡器,或者仅使用CDN。同样重要的是,尽可能多地缓存以最小化Web服务器上的负载。

使用Content Delivery Network(CDN)有助于在多个域上分散资源(域分片),从而减少了Web服务器上的负载。

由于存在多个端点,因此使用CDN有助于分布式缓存和远程加速,还有助于减轻DDoS攻击。它有助于提高安全性,因为缓存的内容更难以利用。

提供程序示例:FastlyRackspaceAkamai,Azure,CloudFlare,Amazon,MaxCDN,Verizon。

以下是一些建议:

  • 使用CDN,将无cookie域用于要缓存的静态组件(例如sstatic.net)。由于某些代理可能拒绝缓存cookie所请求的组件。
  • 清除缓存后(使用wget,Cache WarmerDrush ECL),温暖缓存
  • 使用性能监控(例如,集成了Drupal的New RelicYottaa)。
  • 对您的网站使用监视工具(例如Nagios)。
  • 安装Varnish和Varnish HTTP Accelerator集成模块,然后对其进行配置
  • Varnish + Authcache:检查此示例VCL中的Authcache Varnish配置文件。
  • 在光油前面考虑NGINX。请参阅:为什么磅在Varnish之前很棒
  • NGINX可以用作反向代理和负载平衡器,因此可以代替Pound和Varnish。
  • 考虑使用Varnish或NGINX的商业版本,以利用“社区”开放源代码版本中不可用的功能。
  • 考虑使用硬件负载平衡器/缓存来替代清漆和磅(例如BIG-IP F5)。
  • 在Web应用程序上使用abTTFB的 JMeter之类的工具,负载和压力测试。

因此,从用户角度来看,您的Web体系结构可能类似于:

  1. 用户(本地浏览器缓存)。
  2. NGINX或Pound + Varnish(负载平衡器,反向代理为HTTP加速器)。
  3. Apache(Web服务器)。
  4. PHP-FPM(PHP FastCGI流程管理器)。
  5. MariaDB(数据库)。

对于Drupal优化建议,请检查:如何提高Drupal性能?


1

启用两个扩展:

  • Zend OPcache
  • WinCache的

您的表现会更好。

如果要在Microsoft Azure中使用Zend OPcache和Wincache,请首先在ini“下” 创建一个文件夹名称“ D:\home\site\”。另外,创建2个文件“ .user.ini”和“ settings.ini

在每个文件中添加以下配置:

.user.ini

[PHP]
post_max_size = 32M
memory_limit = 512M
zend.enable_gc = On
upload_max_filesize = 32M
opcache.enable=1

设置

wincache.ocenabled = 1
wincache.ocachesize = 255

另外,使用 PHP_INI_SCAN_DIR将应用程序设置添加到您的Web应用程序 d:\home\site\ini

更改PHP_INI_SYSTEM后,重新启动Web应用程序。如果想进一步了解分支配置,请查阅Microsoft文档

完成上述设置后,我的Drupal(Drupal 8.3)网站在3秒钟内加载完毕。


0

您还可以借助基于DNS或软件/硬件负载平衡解决方案的帮助,研究如何在多个服务器上重新分配负载。这也将提高容错能力。


这不是一个好答案,因为它没有解决如何实现这一目标。如OQ中所述,这是我所追求的现实世界中的扩展经验。
理查德·哈里森

如果有能力决定我们可以在工作中运行drupal,那么我将很乐意提供5页以上的博客文章,概述了我们的硬件和配置。
James Stallings

优秀的。它可能是有用的参考。无论如何
理查德·哈里森

您是否获得重新发布大纲的许可?
理查德·哈里森
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.