更具交互性的 ZODB 打包

Posted

技术标签:

【中文标题】更具交互性的 ZODB 打包【英文标题】:More interactive ZODB packing 【发布时间】:2011-07-07 13:17:22 【问题描述】:

目前的 ZMI 管理“包数据库”功能有点粗糙。

1) 是否有可能为 Web UI 提供某种进度指示器?例如。一个告诉你还剩多少分钟/小时,至少给出某种估计

2) ZODB 打包如何影响站点的响应性?所有交易都被阻止了吗?

3) 是否有可用的带有进度指示器的命令行脚本,以便您可以从 ZEO 命令行客户端执行此操作?

4) 至少有某种日志标记来注销输出... [INFO] 30% 完成... 3:15 开始

【问题讨论】:

【参考方案1】:

包装解剖

ZODB FileStorage 打包是将数据从一个文件选择性地复制到另一个文件的过程(仅限于“年轻”然后指定年龄的事务)。在此复制开始之前,在内存中构建了一些软索引以帮助处理。因此整个 ZODB 打包包含以下步骤:

    构建包索引 将事务复制到临时文件 附加在打包开始后执行的事务 用打包的 FileStorage 替换原始 FileStorage 并以读/写模式重新打开它

我通常通过topvmstat/dstatwatch ls -la var/filestorage的组合来监控进程。

正如 Geir 提到的,您可以有单独的 ZEO 客户端专门用于打包。这是合理的,因为您从阻塞调用打包直到打包完成的线程。现在,如果您使用 ZEO,则无需这样做。 ZEO 服务器提供zeopack 实用程序,可直接连接到 ZEO(无需专用的 ZEO 客户端)并启动 FileStorage 打包。好处之一是不需要密码,只需适当的权限即可访问 ZEO 控制套接字。

打包进度

由于打包是由 ZEO 服务器(甚至不是服务器而是 FileStorage 本身)执行的,因此与 ZEO 客户端正确通信进度的可能性是有限的。 ZEO 协议并非旨在传达此类信息。

恕我直言,FileStorage 本身在通过日志文件交流它现在正在做什么时可能会更加冗长。可以内置某种进度。如果您觉得需要进度指示器,那么您可以设计某种反馈通道,通过日志模块返回到 ZEO-client/Zope-in​​stance 以传达回浏览器。

包装性能

由于 FileStorage 打包是相当密集的磁盘操作,它减少了磁盘子系统的输出。此外,它会清除磁盘缓存(在较大的 FileStorage 的情况下),即使在打包完成后也会影响磁盘性能,因为缓存应该再次预热。在 FileStorage 中导致打包时间更长但对系统影响更小的可能改进是:

恢复到O_DIRECT 操作(不触及文件缓存) 降低执行打包的线程的磁盘调度优先级(Linux 上为ionice) 节流打包速度

【讨论】:

【参考方案2】:

对大型网站进行打包的推荐方法是在专用于此类任务的单独 ZEO 实例上运行它——这根本不监听 http 请求。

这也将消除对任何请求的功能的需求。

【讨论】:

是否有说明如何将一个 ZEO 实例专用于打包?您可以通过这种方式获取状态报告吗?【参考方案3】:

这不是问题,而是功能请求。它应该在http://plone.uservoice.com/ 输入,或者更好的是在https://bugs.launchpad.net/zope2,因为ZMI 是Zope 2 特有的功能。

【讨论】:

这是一个问题,直到我得到答案“没有这样的功能”:) 这是非常基本的功能,所以用户可以假设它就在那里 :)【参考方案4】:

1) 没有这样的指标,可能很难实现(我希望通过 Zope 日志系统至少看到一些进度指标)

2) 未阻塞,但根据打包阶段,您可能会看到高 IO 和 CPU 使用率

3) 没有

4) 没有

【讨论】:

以上是关于更具交互性的 ZODB 打包的主要内容,如果未能解决你的问题,请参考以下文章

精彩绝伦的jQuery

Threejs:与热点交互的全景图

Web 应用程序中的交互式 Graphviz 图形

JS如何实现页面的动态效果和交互效果?(用语言描述)

Android与Unity的交互

Android与Unity的交互