我很好奇是否有人试图在Drupal中“缓存”引导过程。
通常,Drupal将在每个请求上运行7个引导阶段,但是也许在已部署的生产系统上,可以“销毁”其中的一些或全部?
我想到的可能的建议可能是
- 序列化引导状态并将其粘贴到内存缓存中
- 脚本可以为bootstrap.inc生成补丁,该补丁会将某些信息硬编码到文件中。
- 我相信David Strauss试图使引导过的Drupal在libevent上运行。
- 其他疯狂吗?
那里进行了哪些尝试,哪些已知((某种程度上)可靠)?
我很好奇是否有人试图在Drupal中“缓存”引导过程。
通常,Drupal将在每个请求上运行7个引导阶段,但是也许在已部署的生产系统上,可以“销毁”其中的一些或全部?
我想到的可能的建议可能是
那里进行了哪些尝试,哪些已知((某种程度上)可靠)?
Answers:
PHP是一种无共享的体系结构。那有其优点和缺点。
一个缺点是做这样的事情并不容易。没有什么状态可以存储在某个地方。
我进行了一些快速测试,并且登录后,boostrap似乎占用了大约17%的总时间,而其中50%以上的时间实际上是在加载所有.module和.inc文件。那不是您可以存储在内存缓存中的东西。另外,如果我使用内存缓存或数据库缓存,似乎也没有多大关系。
启用页面缓存时,我试图获得一些结果,但是Xhprof似乎并没有返回可靠的结果。整个事情似乎太快了。但是即使如此,最大的部分仍然涉及执行init / exit挂钩并加载看起来似乎的文件。我在那里发现了一个有趣的问题:用户模块似乎严重降低了缓存的页面响应的速度,因为由于.module文件中的实体控制器,它触发了注册表。
也就是说,David Strauss在哥本哈根展示了一些实验性工作,他在引导后创建了一个内存快照,然后在页面被提供后又返回该快照。他确实为此使用了Drupal 6。看完上面的数字后,我认为在Drupal 7中这样做的性能提升会小很多。这样做的一个原因是数据库连接是延迟加载的(并且在需要执行第一个查询之前使用例如Memcache时,您会在引导程序中走得很远),并且缓存了很多内容。
什么是真正的坏在Drupal 7与这些巨大的阵列和无穷的递归和循环渲染层。那几乎消除了进入Drupal 7的所有性能工作。如果Twig成为核心,让我们看看它在Drupal 8中的外观。
最后,关于上述优点。一个很大的优点是,内存韭葱无关紧要,因为在每个请求之后所有内容都被释放。我见过许多Java应用程序,它们的内存使用量不断增加,需要定期重新启动。
不,是大卫·斯特劳斯(David Strauss)在https://code.launchpad.net/~fourkitchens/pressflow/6-evented上进行kargo-event(现在称为Kellner)的实验,但我怀疑会发生什么严重的问题。
Drupal 7 确实已经缓存了很多引导程序,cache_bootstrap
为此有一个垃圾箱。您可以将其粘贴到memcached中。
您可以通过将一些/很多Drupal代码移到C中来大刀阔斧地减少代码负载。Damien和dhthwy在http://drupal.org/project/drupal_php_ext创建了PHP扩展,但并没有完成太多工作。或做嘻哈。我不知道hiphop和Drupal 7的当前状态。
但是,到最后,您需要认真考虑一下工程成本,例如,使hiphop与Drupal 7(以及所有贡献者)一起工作,并将其与租用更多服务器进行比较。如果您可以保存,例如说节省了5%的服务器,并且您有10万台服务器,那就去做,但是您是Facebook吗?优化时要小心且经济。
在高性能Drupal聚会上看到了有关doh(动态对象处理程序)的有趣演示。简而言之,他谈到了如何使用它来快速启动Drupal。在15:30左右变得有趣。简而言之,通过runkit在功能上也可以自动加载类固醇。在33:00进行质量检查。