缩放和调整性能的真实世界经验 -- caching 领域 和 performance 领域 drupal 相关 的问题

Real world experience in scaling and tuning performance


52
vote

问题

中文

我正在工作的网站据称,在发布后,我很快就会有一个大规模的命中率。客户谈论每天大约2500次点击左右的可能性。

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

我读过缩放 drupal.org基础设施, Drupal的性能博客,最佳实践缩放的Drupal 和许多其他的网页,但什么我正在寻找做这件事的真正经验,有什么作用,什么都没有,以及什么期待。

英文原文

The website I'm working is allegedly going to have a massive hit rate soon after launch. The client is talking about the possibility of around 2500 hits per second over a day or so.

Ignoring the fact that this hit rate is probably wild client optimism and apart from getting the largest servers possible, what is the best way that Drupal should be configured to support a large hit rate.

I've read Scaling the drupal.org Infrastructure, Drupal performance blog, Best Practices for Scaling Drupal and many other pages, but what I'm looking for is real experience of doing this, what works, what doesn't, and what to expect.

     

回答列表

45
 
vote
vote
最佳答案
 

Markdorison的答案基本上是攻击这个问题的接受方法。我会稍微接受这一点。

当你有按d6或drupal for d6,memcached和都在一起工作,您需要自定义代码您的 vcl 文件。有免费的可用性,但您总是需要与他们一起玩。

要获得清漆以最佳地,请确保使用-s malloc xg启动它而不是默认的文件/路径/文件。 还有清漆的游戏缓存静态物品只要可以。

如果您有多个Web服务器,请从发送到VCL中的标题中删除ETAG。我还删除了到期并只依靠年龄和最大年龄,所以让浏览器回到网站。

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

将"性能" 中的缓存配置为外部并设置最大年龄,将正确的标头发送到缓存代理,例如清漆。

如果您无法在RANISH中正确查看的某些页面进行高速缓存,请在Web上浏览博客文章,详细介绍如何检查请求。这是一个我写回来的一个例子帖子:什么通过缓存匿名用户页面浏览量

,停止清漆和垂耳净流量

您应该为MySQL选择InnoDB(或来自其他提供商的其他名称),并将所有表移动到其中。然后查看此博客文章以进行基本调谐建议 http://www.mysqlperformanceblog.com / 2007/11/01 / InnoDB-Performance-Optimization-Basics /

具有大型缓冲池基本上是重要的。加载测试站点打开慢查询日志。您可能希望在第一次捕获查询中花费超过50毫秒,然后调整查询并重复地减少慢记录捕获时间,直到您使用索引运行的大多数查询,并相当快速地执行。

其他基础涉及拥有 apc 的php。如果您选择Fast CGI而不是Mod_Php会花费一些时间尝试通过配置一个好的包装器脚本来在PHP实例中共享APC缓存。还要确保APC缓存处于内存映射文件中以挤出PHP中的每一个最后一点。

 

Markdorison's answer is basically the accepted method of attacking this problem. I'll take that a little further.

When you have Pressflow for D6 or Drupal for D7, Memcached and Varnish all working nicely together you'll need to custom code your VCL file. There are free ones available that make starting points but you always need to play with them.

To get Varnish to work optimally make sure you start it with -s malloc xG rather than the default of -s file /path/to/file. Also with Varnish have Varnish cache static items for as long as you can.

If you have more than one web server remove the ETag from the header sent to Varnish in VCL. I also remove Expires and simply rely on Age and max-age in the headers so get browsers back to the site.

Version 1.5 (as of 3rd March 2011) is still the fastest version of Memcached module from Drupal.org. I typically deploy it using a single bin per server to lower tcp traffic for connections to multiple bins at large scale)

Configure the caching in "Performance" to external and set a max age which will send the correct headers to a caching proxy such as Varnish.

If you can't get certain pages to cache properly in Varnish check out blog posts on the web that detail how to inspect the requests. Here is an example post I wrote a while back: What is stopping Varnish and Drupal Pressflow from caching anonymous users page views

You should pick InnoDB (or one of it's other names from other providers like XtraDB) for MySQL and move all tables into it. Then check out this blog post for basic tuning advice http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/

Having a large buffer pool is fundamentally important. When load testing the site turn on the slow query log. You probably want to at first capture queries taking longer than 50msec then tune the queries and repetitively reduce the slow log capture time down until you have most queries running using indexes, and executing fairly quickly.

Other basics involve having APC in for PHP. If you go for fast CGI rather than mod_php do spend some time trying to make the APC cache shared across the php instances by configuring a good wrapper script. Also make sure that the APC cache is in a memory mapped file to squeeze every last bit out of PHP.

 
 
   
   
22
 
vote

我会推荐从按(如果使用drupal 6), memcache , rennish

如果您有一个页面的部分,则无法为非匿名用户缓存(特定于该用户的东西,"欢迎Userx" 等),您可以探索填充这些页面的这些部分的选项如异步回调或边缘侧包括。

如果您有一组较小的内部用户(例如一组编辑器),需要能够查看该站点的未生命的版本,我建议在不同的URL下揭露一个未生命的网站版本(受保护如果可能的话,在VPN或等同物后面)。

 

I would recommend starting with Pressflow (if using Drupal 6), Memcache, Varnish, and some form of Content Distribution Network (CDN) such as Akamai. The end result should be as few of those users as possible actually hitting your origin server.

If you have parts of the page that you are not able to cache for non-anonymous users (things that are specific to that user, "Welcome userX" etc.), you can explore options to populate these pieces of the page such as asynchronous callbacks or edge side includes.

If you have a smaller group of internal users (such as a group of editors) that need to be able to view an uncached version of the site, I would recommend exposing an uncached version of your site at a different URL (protected behind a VPN or equivalent if possible).

 
 
 
 
15
 
vote
每秒每秒2500次点击 - 如果通过"点击" 你的意思是"页面交付" ,那么每天都有21600万页。让我告诉你:每天没有21600万页。我喜欢这些客户... 所说,RAW交通数据没有说什么。虽然在此线程中的建议是关于varnish / cdn的声音,但如果您拥有的只是匿名流量,但如果您已登录流量,则面临挑战。但在花费不敬虔的时间和精力来解决问题之前,请确保有一个问题。每秒2500次点击,Bing比那个少,你意识到,吧?
 

2500 hits per second over a day -- if by "hit" you mean "page delivered" then that's 216 million page a day. Let me tell you this: you do not have 216 million pages a day. I love these clients...

That said, a raw traffic data does not say anything. While the advice in this thread is sound about Varnish / CDN if all you have is anonymous traffic but if you have logged in traffic, you are facing a challenge. But before spending an ungodly amount of time and effort to solve a problem, make sure you have a problem. 2500 hits per second, bing gets less than that, you realize that, right?

 
 
 
 
6
 
vote
  • 服务器端

    • 为匿名用户的缓存页面安装amish。
    • 安装持久缓存系统(Memcached,APC,Memcache)。
    • 使用诸如Akamai的CDN来服务静态文件(JavaScript,CSS,图像)。
  • 代码侧

    • 使用按钮,它允许清漆为匿名用户提供缓存的页面。
    • 清洁Drupal的看门狗表。每次记录看门狗错误时,它会在Web服务器和数据库服务器上消耗CPU资源。它也显着提高了负荷时间。
    • 实现静态和持久缓存策略直到慢查询日志清洁。
    • 避免在所有成本中禁止嵌套的Foreach循环中发生的PHP错误。
    • 卸载未使用的模块。
    • 打开悄悄核心块和视图的缓存。
  • 数据库

    • 确保表格正确索引,以便更快地搜索。
    • 不存储不必要的记录,将始终超过300万节点数据库的速度访问100节点数据库。
 
  • Server side

    • Install Varnish for caching pages for anonymous users.
    • Install a persistent cache system (Memcached, APC, Memcache).
    • Use a CDN such as Akamai to serve static files (JavaScript, CSS, images).
  • Code Side

    • Use Pressflow, it allows Varnish to serve cached page for anonymous users.
    • Clean Drupal's watchdog table. Every time a watchdog error gets logged, it consumes CPU resources on the web server and database server. It also increases load time significantly.
    • Implement static and persistent cache strategies until the slow query log comes up clean.
    • Avoid PHP errors that occur within nested foreach loops at all costs.
    • Uninstall unused modules.
    • Turn on caching for Drupal core blocks and Views.
  • Database

    • Make sure the tables are properly indexed for faster searching.
    • Do not store unnecessary records, a 100 node database will be always accessed faster than a 3 million node database.
 
 
5
 
vote

我还会听到这个lullabot vodcast,了解他们在一周的过程中设置了grammys.com网站的交通爆炸。这是一个漂亮的教育解释。

http://www.lullabot.com/podcasts/podcast-92-grammycom < / a>

 

I would also listen to this Lullabot podcast about the way they set up the Grammys.com website for a traffic explosion over the course of a week. It was a pretty educational explanation.

http://www.lullabot.com/podcasts/podcast-92-grammycom

 
 
 
 
3
 
vote

虽然预测模式非常困难,但如果您对流量水平进行了相当的想法。负载测试您的解决方案。有许多不同的选项,直到您拥有实时流量,但如果您尽可能多地加载测试,则至少在您的设置可以处理流量的情况下加载测试。

如果您第一次测试,世界上的所有调整都不会有帮助。

这是DC SF的演示文稿关于经济学家如何做到这一点。 http://sf2010.drupal.org/conference/sessions /性能测试 - 经济学家在线使用-磨床

 

While it is very difficult to predict patterns, if you have a fair idea of the traffic levels. Load test your solution. There are a host of different options and a lot will not be possible to predict until you have live traffic, but if you load test as much as possible at least you will have a fair degree of confidence that your setup can handle traffic.

All the tuning in the world won't help if you don't test it first.

This is was a presentation at DC SF about how the economist did it. http://sf2010.drupal.org/conference/sessions/performance-testing-economist-online-using-grinder

 
 
 
 
3
 
vote

对于高流量网站,您应该使用多个服务器和负载均衡器或使用简单的CDN。也可以尽可能地缓存,以最小化Web服务器上的负载非常重要。

使用内容传递网络( cdn )有助于将资源分布在几个域上(域分片)减少了Web服务器上的负载。

使用CDN有助于分布式缓存和远程加速度,也有助于缓解 ddos​​攻击< / a>,因为多个端点。它有助于安全,因为缓存内容更难以利用。

示例提供程序:速溶于, Rackspace , akamai ,azure, CloudFlare,亚马逊,Maxcdn,Verizon。

以下是更多的建议:

  • 使用cdn,使用无法可分域用于缓存的静态组件(像 sstatic.net )。由于某些代理可以拒绝缓存用cookie请求的组件。
  • 清除缓存后,温暖您的高速缓存(使用WGET,缓存温暖, drush ecl )。
  • 使用性能监视(例如新遗物或 yottaa ,它具有碎屑的整合)。
  • 使用您的网站的监控工具(例如Nagios)。
  • install rannish和 varnish http加速器集成模块,然后配置它。
  • varnish + authcache:检查这个 authcache的示例vcl varnish配置文件。
  • 考虑 pound 或 nginx 在清漆前面。请参阅:为什么磅在amrnish前面很棒。
  • nginx可以作为反向代理和负载平衡器的工作,因此它可以取代磅和清漆。
  • 考虑arnish或nginx的商业版本,以利用"社区" 开源版本中不可用的功能。
  • 考虑硬件loadbalancer / caching以替换清漆和磅(例如 big-ip f5 < / a>)。
  • 使用 ab ,jmeter for ttfb ,加载并在您的Web应用程序上进行压力测试。
所以你的网络架构从用户的角度看起来像:
  1. 用户(本地浏览器缓存)。
  2. nginx或磅+清漆(负载平衡器,反向代理作为HTTP加速器)。
  3. apache(web服务器)。
  4. PHP-FPM(PHP FastCGI过程管理器)。
  5. mariadb(数据库)。

用于Drupal优化建议,检查:如何提高滴水性能?

 

For high-traffic websites you should use multiple servers and load balancer or use simply CDN. Also it's very important to cache as much as possible to minimise load on the web servers.

Using Content Delivery Network (CDN) helps to spread out the resources over several domains (domain sharding) which reduces load on the web server.

Using CDN helps with distributed caching and remote acceleration, also helps to mitigate DDoS attacks, because of multiple end-points. It helps with security, because cached content is more more difficult to exploit.

Example providers: Fastly, Rackspace, Akamai, Azure, CloudFlare, Amazon, MaxCDN, Verizon.

Here are some more suggestions:

  • With CDN, use cookieless domains for static components to be cached (like sstatic.net). Since some proxies might refuse to cache the components that are requested with cookies.
  • Warm your caches after clearing caches (using wget, Cache Warmer, Drush ECL).
  • Use performance monitoring (e.g. New Relic or Yottaa which have integration for Drupal).
  • Use monitoring tool for your website (e.g. Nagios).
  • Install Varnish and Varnish HTTP Accelerator Integration module, then configure it.
  • Varnish + Authcache: Check this Example VCL for Authcache Varnish config file.
  • Consider Pound or NGINX in front of Varnish. See: Why Pound is awesome in front of Varnish.
  • NGINX can work as reverse proxy and load balancer, so it can replace Pound and Varnish.
  • Consider a commercial version of Varnish or NGINX to utilise features not available in the "community" open source version.
  • Consider hardware loadbalancer/caching to replace Varnish and Pound (e.g. BIG-IP F5).
  • Use tools like ab, JMeter for TTFB, load and stress testing on your web application.

So your web architecture from the user point of view can look like:

  1. User (local browser caching).
  2. NGINX or Pound + Varnish (load balancer, reverse proxy as HTTP accelerator).
  3. Apache (web server).
  4. PHP-FPM (PHP FastCGI Process Manager).
  5. MariaDB (database).

For Drupal optimization suggestion, check: How do you improve Drupal performance?

 
 
0
 
vote

您还可以使用基于DNS或软件/硬件负载平衡解决方案的AIDE来检查将负载重新分配到多个服务器上。这也将以容错烘烤。

 

You could also examine redistributing the load over multiple servers with the aide of a DNS based or software/hardware load balancing solution. This would also bake in fault tolerance.

 
 
       
       
0
 
vote

启用两个扩展:

  • zend opcache
  • wincache

您的性能将更好地工作。

如果您在Microsoft Azure中查看Zend Opcache和Winciach,首先在' 99887661 '下创建文件夹名称' ini '。此外,创建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   

setting.ini

  wincache.ocenabled = 1 wincache.ocachesize = 255   

也,使用 PHP_INI_SCAN_DIR d:homesiteini

更改 php_ini_system 重新启动Web应用程序。如果想了解更多有关闪发配置的信息,请检查 Microsoft文档。

在上面设置后,我的Drupal(Drupal 8.3)在3秒内载重。

 

Enable two extensions :

  • Zend OPcache
  • wincache

Your performance will work better.

If you are looking to twig the Zend OPcache and Wincache in Microsoft Azure, at first create a folder name xe2x80x98inixe2x80x99 underxe2x80x98D:\home\site\xe2x80x99. Also, create 2 files, xe2x80x98.user.inixe2x80x99 and xe2x80x98settings.inixe2x80x99

Add following configuration in each file :

.user.ini

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

setting.ini

wincache.ocenabled = 1 wincache.ocachesize = 255 

Also, add an App Setting to your Web App with the key PHP_INI_SCAN_DIR and value d:\home\site\ini

After changing PHP_INI_SYSTEM restart your web app. If want to know more about twigging configuration, please check Microsoft documentation.

After above setting, my Drupal (Drupal 8.3) site load within 3 seconds.

 
 

相关问题

2  在哪里插入额外的注销功能的最佳位置?  ( Where is the best place to insert additional logout functionality ) 
在用户注销的情况下插入附加逻辑可能会在user.pages.inc中查看 function user_logout() .inc。此代码在核心模块中,您不应该编辑它,但工作得很好...例如,通过将以下代码添加到'user_logout()'函数的顶部... $last_run = variable_get('...

6  将在文件中缓存是替代方案吗?  ( Would cache in files be an alternative ) 
一旦我在一个拥有自己的cms的公司工作,我们习惯于在文件中缓存数据,所以基本上系统将检查缓存文件是否存在,如果不是它会转到数据库,请获取数据,保存一个文件,然后向用户展示它(基本缓存事物)。这导致与数据库的连接较少。 我想知道这是否是司布的好选择,或者如果这种缓存的东西有任何问题。 ...

2  Drupal缓存可防止饼干阅读  ( Drupal caching prevents cookie read ) 
在我的一个生产网站上,我写了一个jQuery样式表切换器。当制作选择并使用PHP时,它会丢弃Cookie,以在覆盖样式的Pageload上选择相应的样式表。一切都很棒,直到我启用性能缓存模式,在每个Pageload上都会忽略cookie。显然,这不是所需的效果,我可以看到为什么这是出现的:是页面被缓存,并且不再真正动...

5  如何处理具有不同文件结构的开发和生产服务器  ( How to handle dev and production servers having different file structure ) 
我知道你不应该这样做,但由于我的控制超出了我的控制,我的Web root的位置在我的Dev和我的生产服务器上不同。由于每次将数据库从生产服务器复制到我的Dev服务器时,我的所有模块都会混淆并指向错误的文件位置。处理此操作的推荐方法是什么? ...

2  用毛发清除升压缓存  ( Clearing boost cache with drush ) 
我正在测试升压模块,这是我正在努力的网站的良好性能增强。 但是,我希望能够通过润滑可以获得提升以清除它的缓存。 Drush cc all 似乎没有这样做。并查看升压模块代码,似乎没有Cron命令。我错过了什么,或者是目前没有实施的东西吗? ...

1  节点访问表变为空  ( Node access table goes empty ) 
我目前有一个项目,我正在使用node_save将mulitple记录插入drupal。它通常是一百一的几百。出于某种原因,有时node_access表最终为空,导致数据"出现" 删除给用户。 有谁知道可以发生什么? 我已审核node_save代码,通知是通过 node_access_acquire_grants($n...

2  Drupal过滤器不可缓存  ( Drupal filters are not cacheable ) 
我有一个具有许多自定义滤波器的Drupal 7站点。一切都适合正确,但不是很快。 它看起来好像过滤缓存系统无法正常工作,因为Cache_Filter表始终为空。 有问题在d.o.但它没有回复。 ...

16  什么都有助于Drupal页面执行时间?  ( What all contributes to drupal page execution time ) 
我有一个网站,我正在调查具有重大性能问题,使用memcache我能够在数量和全部射口时间(从3秒到230毫秒)来带来查询的数量,但页面执行时间均阐明我(我正在查看由devel输出的值)我的理解是页面执行时间= PHP执行的时间,因此我安装了APC,我可以看到正在缓存的PHP操作码和统计数据在APC控制面板中显示HIT...

5  缓存字段/实体/节点  ( Cache field entity node ) 
我有一个自定义字段/小部件,具有格式视图功能,这是高度资源密集的。我目前正在使用 cache_set()/cache_get() 中的 hook_field_formatter_view中的函数的函数为我的字段缓存。 有没有更好的方法,我可以这样做?我试图使用 drupal_render() 's #cache 属...

4  如何根据自定义条件使视图缓存无效?  ( How to invalidate a views cache based on custom criteria ) 
我有一个自定义内容类型( story3 ),datetime字段确定故事是否在列出该内容类型的节点的视图中显示;如果为节点定义的DateTime比当前日期时间更新,则它将不会显示。 我的问题是我必须去和空 admin/config/development/performance ,然后单击 Clear all cac...

22  优化认证用户性能的最佳方法?  ( Best way to optimize for authenticated user performance ) 
关键字在这里认证! 目前(据我所知)通过静态页面缓存(清漆/鱿鱼/升压)来优化匿名访问的De-Facto方法。 但是,据我所知,在大多数用户都经过身份验证的情况下,这似乎似乎似乎不太好。 除了明显的apc,memcache和硬件上的钱,性能如何调整高流量站点的最佳方式,主要是经过身份验证的用户? 例如:Drupal....

2  数据库大小,开发的建议>暂存>生产[关闭]  ( Database size suggestions on dev staging production ) 
关闭。这个问题需要更多聚焦。它目前不接受答案。 想要改进这个问题?更新问题,因此它仅拍摄了一个问题,只有编辑此帖。 关闭上个月。 ...

2  使用F5服务器作为反向代理缓存(而不是清漆)  ( Using an f5 server as reverse proxy cache instead of varnish ) 
是否有任何经验,阳性或负,在 F5 ? 你是否成功或失败了? 在任何一种情况下,您实现了哪种功能?你得到了多远? ...

3  PressFlow缓存指令  ( Pressflow caching directives ) 
我有一个与清漆的设置。 arnish根据 php标题。我想强制清漆每次由用户更新时都会针对每个节点重新生成缓存。我正在寻找最好的地方。理想情况下,它将在一个笨拙/ pressflow hook(如果有任何可用)在自定义模块中实现。 什么HTTP缓存指令按流量集? 在什么功能,文件和行号? 不解决这两个项目分子的...

1  在同一VPS上运行的许多不同网站上使用升压模块是否有任何含义/考虑?  ( Is there any implication consideration for using the boost module on many differ ) 
在同一VPS上运行的许多不同网站上使用升压模块有任何含义/考虑因素? ...

4  清除/文件/样式目录是否安全?  ( Is it safe to purge the files styles directory ) 
我使用图像样式自动生成缩略图(用于预告片和视图)。我有很多图像,所以我最终在 /files/styles中有很多缓存的缩略图目录。 删除 /files/styles 的内容是安全的,而不会做任何像在drupal中清除缓存?我的希望是,缩略图将根据需要再生。 ...

4  启用受访问受限模块时块缓存  ( Block caching when access restricted modules are enabled ) 
我们有一个创建自定义导航块的模块。它运行了一吨查询,它真的影响性能。 (请注意,我继承了这个网站;我没有写这个代码!) 我们希望缓存块,但内置块缓存(admin / setment / performany)灰色输出,下面的消息称,当启用了定义内容访问限制的模块时,块缓存处于非活动状态。我们确实有几个具有访问限制的模...

3  cache_clear_all()似乎没有工作  ( Cache clear all doesnt seem to work ) 
我有一个带有一些cck字段的块。在此栏中,我有一个与改变该块中的字段值的操作的链接。 代码如下: $specialPages3 重装后,旧值仍然出现。我必须手动清除缓存以查看当前值。 ...

1  不要缓存自定义块  ( Do not cache custom block ) 
我有一个在代码中创建的自定义块。我不想缓存块。我知道我需要使用block_no_cache,但我不确定在哪里使用它。 function mymod_block($op = 'list', $delta = 0) { // set up an empty array which will contain t...

7  MySQL二进制日志使磁盘满  ( Mysql binary log makes disk full ) 
突然,我把我的网站下来了(drupal 6.19),无法启动mysql(太多表崩溃了)。 通过检查 df-h ,我发现由于非常大的二进制日志文件,MySQL分区已满(仅限二进制日志仅为一天, expire_logs_days = 1 );通过检查MySQlbinlog for the bin日志,我发现的大多数条目用...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.