当前位置: 首页>>技术解读>>正文


大型网站的Memory-saving cache-clearing策略?

webfans 技术解读 , , , , 去评论

问题描述

我的一个Drupal 7站点有数千个字段,一堆内容类型,超过25个视图,以及数百种(很快将成千上万)的配置文件类型。因此,我正在使用一个更好地缓存实体字段信息的核心补丁(http://drupal.org/node/1040790),以及通过显示更好地缓存视图的-dev版本的视图(而不是一个巨大的查看缓存行,其中包含所有视图数据)。

这已经帮助网站上的大多数页面加载了20-30MB的RAM,而不是160MB +(而不是为10MB +的字段和视图提取cache_ *表行,这些补丁有助于保持cache_ *数据更加高效)。

然而,这引入了一个问题,即缓存重建需要很长时间。通常超过一两分钟。在此期间,Drupal根本不会加载任何页面(因为它尝试读取的缓存尚未构建,其他请求必须等待)。

在low-traffic周期中,这不是什么大问题;一百个左右的用户只需要在页面加载前等待一分钟。但是在high-traffic循环期间,Apache服务器开始变得疯狂,CPU负载超过40,并且内存很快就会填满,因为所有工作线程都在等待,并最大限度地释放内存,从而导致交换。这是一种死亡螺旋。重启httpd会让事情变得清晰,但事情要恢复正常需要5-10分钟。

我的目标是使其缓存清除不会使网站瘫痪。首先,如果我使用admin_menu的单独缓存清除功能(如“CSS和JS”,然后是”Menu”,然后是”Theme registry”等),情况会顺利进行,直到我点击“Page and else”选项。那就是视图的缓存被重置(一个非常CPU和database-intense操作,需要缓存的视图数),以及重置字段信息缓存时(在此站点上也是CPU和database-intense)。

那么……我的问题/想法:

  • 使用drush和/或其他shell脚本,我是否可以以比“一次爆破所有缓存,希望进行干净重建”更智能的方式清除缓存?

  • 我可以在缓存清除过程中阻止http请求,这样apache就不会被一堆cache-stampeding请求阻塞吗?

  • 如果我可以清除Drupal /普通httpd请求之外的缓存,我可以设置更高的PHP memory_limit用于缓存清除操作,并退出我的通用memory_limit(现在设置为256MB,以防任何单独的httpd线程需要清除缓存…)。

基本上:除了单击UI中的按钮或使用drush cc all之外,是否有任何智能和优雅的方法可以清除Drupal的所有缓存?

[编辑说明:我遇到的主要问题是缓存重建,(a)需要一段时间,(b)阻止所有其他请求,直到重建完成。我想找到一种方法来使它在high-traffic时间内重建并不那么致命。]

最佳解决方法

Is there any intelligent and graceful way to clear all caches with Drupal besides simply clicking the button in the UI, or using drush cc all?

cache actions模块可以做到这一点。这取决于规则。例如,您可以设置规则以在添加或更新”x”类型的节点时清除特定视图。查看docs以获取更多详细信息。

另外看看cache graceful模块 – 尚未尝试过,但看起来很有趣。

次佳解决方法

主要问题是你使用MySQL来存储缓存数据 – 对于high-load站点来说这是一个非常无效的解决方案。

我建议改用Memcache。这将大大提高缓存系统的性能,并为您带来两大好处:

  1. 对于读取和写入操作,Memcache要快得多,MySQL – 所有缓存操作(以及完全缓存重建)都可以更快地运行。

  2. 因为缓存数据不再存储在DB中 – 清除缓存不会阻止任何其他MySQL查询。

以下是Drupal 7的Memcache configuration示例。

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/3022.html,转载请务必附带本地址声明。