更具交互性的 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 并以读/写模式重新打开它
我通常通过top
、vmstat
/dstat
、watch ls -la var/filestorage
的组合来监控进程。
正如 Geir 提到的,您可以有单独的 ZEO 客户端专门用于打包。这是合理的,因为您从阻塞调用打包直到打包完成的线程。现在,如果您使用 ZEO,则无需这样做。 ZEO 服务器提供zeopack
实用程序,可直接连接到 ZEO(无需专用的 ZEO 客户端)并启动 FileStorage 打包。好处之一是不需要密码,只需适当的权限即可访问 ZEO 控制套接字。
打包进度
由于打包是由 ZEO 服务器(甚至不是服务器而是 FileStorage 本身)执行的,因此与 ZEO 客户端正确通信进度的可能性是有限的。 ZEO 协议并非旨在传达此类信息。
恕我直言,FileStorage 本身在通过日志文件交流它现在正在做什么时可能会更加冗长。可以内置某种进度。如果您觉得需要进度指示器,那么您可以设计某种反馈通道,通过日志模块返回到 ZEO-client/Zope-instance 以传达回浏览器。
包装性能
由于 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 打包的主要内容,如果未能解决你的问题,请参考以下文章