修订版清理
- 适用对象:
- Experience Manager 6.5 LTS
- 主题:
- 管理
创建对象:
- 管理员
简介
存储库的每次更新都会创建一个内容修订版本。 因此,每次更新后,存储库的大小都会增大。 必须清理旧修订版本以释放磁盘资源 — 这对于避免不受控制的存储库增长非常重要。 此维护功能称为修订版清理。 自Adobe Experience Manager (AEM) 6.0起,此功能已作为离线例程提供。
在AEM 6.3及更高版本中,引入了此功能的在线版本,称为“在线修订清理”。 与必须关闭AEM实例的脱机修订清理相比,在AEM实例处于联机状态时,可以运行联机修订清理。 默认情况下,“联机修订清理”处于打开状态,建议使用此方式执行修订清理。
注意: 观看视频,了解如何使用联机修订清理。
修订清理过程包括三个阶段:估计、压缩 和 清理。 估算根据可能收集到的垃圾量来确定是否运行下一阶段(压缩)。 在压缩阶段,区段和tar文件被重写,而没有任何未使用的内容。 然后,清理阶段将删除旧区段,包括这些区段可能包含的任何垃圾。 离线模式通常可以回收更多空间,因为在线模式必须考虑AEM的工作集,该工作集保留着不可收集的额外区段。
有关修订版清理的更多详细信息,请参阅以下链接:
此外,您还可以阅读Oak官方文档。
何时使用联机修订版清理,而不是脱机修订版清理?
建议使用“联机修订清理”来执行修订清理。 离线修订清理只能在例外情况下使用,例如,在迁移到新存储格式之前,或者Adobe客户关怀部门要求您这样做时。
如何运行联机修订清理
默认情况下,在线修订清理配置为在AEM Author和Publish实例上每天自动运行一次。 您只需在用户活动最少的时段内定义维护时段。 您可以按如下方式配置“联机修订版清理”任务:
-
在AEM主窗口中,转到 工具 — 操作 — 仪表板 — 维护 或指向以下浏览器:
https://serveraddress:serverport/libs/granite/operations/content/maintenance.html
-
将鼠标悬停在 每日维护时段 上,然后单击 设置 图标。
-
输入所需的值(周期、开始时间、结束时间),然后单击 保存。
或者,如果要手动运行修订清理任务,您可以:
-
转到 工具 — 操作 — 仪表板 — 维护 或直接浏览到
https://serveraddress:serverport/libs/granite/operations/content/maintenance.html
-
单击 每日维护时段。
-
将鼠标悬停在 修订清理 图标上。
-
单击 运行。
在脱机修订版清理后运行联机修订版清理
修订清理过程按层代回收旧修订。 这意味着每次运行修订清理时,都会在磁盘上创建并保留新一代。 但是,这两种类型的修订清理之间存在区别:脱机修订清理保留一代,而联机修订清理保留两代。 因此,在您运行在线修订清理 后 离线修订清理时,会发生以下情况:
- 在首次运行联机修订版清理后,存储库大小会翻倍。 之所以会出现这种情况,是因为现在磁盘上保留了两代数据。
- 在后续运行期间,存储库将在创建新一代时暂时增大,然后稳定到首次运行后的大小,因为在线修订清理过程将回收前一代版本。
此外,请记住,根据提交的类型和数量,每一代都可以与上一代相比大小不同,因此最终大小可以因运行而异。
因此,建议磁盘大小至少比最初估计的存储库大小大两到三倍。
全压实模式和尾压实模式
AEM 6.5 LTS 对于联机修订清理进程的 压缩 阶段具有 两种模式:
- 完全压缩 模式重写整个存储库中的所有区段和tar文件。 因此,后续清理阶段可以清除整个存储库中的最大垃圾量。 由于完全压缩会影响整个存储库,因此它需要大量系统资源和时间才能完成。
- 尾部压缩 模式仅重写存储库中最近的区段和tar文件。 最新的区段和tar文件是自上次运行完全或尾部压缩以来添加的区段。 因此,随后的清理阶段只能清除存储库最近部分中包含的垃圾。 由于尾部压缩仅影响存储库的一部分,因此它比完全压缩需要更少的系统资源和完成时间。
这些压实方式构成了效率与资源消耗之间的权衡:尾压实效果较差,对系统正常运行的影响也较小。 相比之下,完全压实更有效,但对系统正常运行的影响更大。
AEM 6.5 LTS在压缩期间具有高效的内容重复数据删除机制,从而进一步减少存储库在磁盘上的占用空间。
如何配置完全压缩和尾压缩
默认配置在工作日运行尾压缩,在星期日运行完全压缩。 可以使用RevisionCleanupTask
维护任务的新配置值full.gc.days
更改默认配置。
在配置full.gc.days
值时,在值中定义的天数内运行完全压缩,在值中未定义的天数内运行尾压缩。 例如,如果将完全压缩配置为在星期日运行,则尾压缩从星期一到星期六运行。 例如,如果将完全压缩配置为一周的每天运行,则尾部压缩根本不会运行。
此外,请考虑:
- 尾压缩 的效果较差,对正常系统操作的影响较小。 因此,它打算在工作日运行。
- 完全压缩 更有效,但对正常系统操作的影响也更大。 因此打算在工作日使用。
- 尾部压缩和完全压缩都应安排在非高峰时段运行。
疑难解答
使用新的压缩模式时,请牢记以下事项:
- 您可以监视输入/输出(I/O)活动,例如:I/O操作、CPU等待IO、提交队列大小。 这有助于确定系统是否正在进行I/O绑定并需要升级。
RevisionCleanupTaskHealthCheck
指示联机修订清理的整体运行状况状态。- 日志消息包含有关压缩模式的相关信息。 例如,当“联机修订清理”启动时,相应的日志消息将指示压缩模式。 此外,在某些角落情况下,当计划运行尾压缩时,系统恢复为完全压缩,并且日志消息指示此更改。 以下日志示例指示压缩模式以及从尾到完全压缩的更改:
TarMK GC: running tail compaction
TarMK GC: no base state available, running full compaction instead
已知限制
有时候,在尾部模式和完全压实模式之间切换会延迟清理过程。 更准确地说,存储库在完全压缩(其大小翻了一番)后将会增长。 当存储库低于完全压缩前的大小时,在后续的尾压缩中回收额外的空间。 还应避免执行并行维护任务。
建议磁盘大小至少比最初估计的存储库大小大两到三倍。
联机修订清理常见问题解答
正在运行联机修订版清理
脱机修订清理正在回收除最新一代以外的所有内容,而联机修订清理则使用最新两代。 如果存在新的存储库,则联机修订版清理在脱机修订版清理后首次执行时不会回收任何空间,因为没有足够旧的层代可以回收。
此外,请阅读本章的“脱机修订清理后运行联机修订清理”一节。
因素为:
- 存储库大小
- 在系统上加载(每分钟请求数,特别是写操作)
- 活动模式(读取与写入)
- 硬件规格(CPU性能、内存、IOPS)
在联机修订清理期间,会持续监视磁盘空间。 如果可用磁盘空间下降到临界值以下,则该过程将取消。 关键值是存储库当前磁盘占用空间的25%,无法对其进行配置。
Adobe建议磁盘大小至少比最初估计的存储库大小大两到三倍。
在清理过程中,会持续监控可用栈空间。 如果可用栈空间下降到临界值以下,则取消该进程。 临界值通过org.apache.jackrabbit.oak.segment.SegmentNodeStoreService#MEMORY_THRESHOLD配置。 默认值为15%。
最小压缩栈大小的建议与AEM内存大小调整建议没有区分。 通常: 如果AEM实例的大小足以处理用例及其预期的有效负载,则清理过程将获得足够的内存。
- 确保每天执行该操作。
- 通过相应地配置操作仪表板中的维护窗口,确保在最小的存储库活动期间执行该操作。
- 扩展系统资源(CPU、内存、I/O)。
修订清理依赖估计阶段来确定是否有足够的垃圾要清理。 估算器将当前大小与上次压缩后的存储库大小进行比较。 如果大小超过配置的增量,则运行清理。 大小增量设置为1 GB。 这实际上意味着,如果自上次清理运行以来,存储库大小没有增加1 GB,则会跳过新的修订版清理迭代。
以下为估计阶段的相关日志条目:
- 修订GC运行: 大小增量为N%或N/N (N/N字节),因此正在运行压缩
- 修订GC 未 运行: 大小增量为N%或N/N (N/N字节),因此现在将跳过压缩
如果系统中存在写并发,联机修订版清理可能需要独占写入权限,才能在压缩周期结束时提交更改。 系统进入 forceCompact模式,如Oak文档中详述。 在强制压缩期间,获得排他性写锁定以最终提交更改,而不受任何并行写干扰。 要限制对响应时间的影响,可以定义超时值。 默认情况下,此值设置为1分钟,这意味着如果强制压缩未在一分钟内完成,则压缩过程将中止,以支持并发提交。
力压缩的持续时间取决于以下因素:
- 硬件:特定于IOPS。 持续时间会随着IOPS的增加而缩短。
- 区段存储大小:持续时间会随着区段存储的大小而增加。
在冷备用设置中,只有主实例必须配置为运行在线修订清理。 在备用实例上,无需特别计划联机修订版清理。
备用实例上的相应操作是“自动清理” — 这与“在线修订清理”的清理阶段相对应。 在主实例上执行联机修订版清理后,在备用实例上运行自动清理。
估算和压缩阶段不会在备用实例上运行。
脱机修订版清理可以立即删除旧修订,而联机修订版清理必须考虑应用程序栈栈仍在引用的旧修订。 因此,前者可以比后者更积极地去除垃圾,其效果在几个垃圾收集循环过程中被摊销。
此外,请阅读本章的“脱机修订清理后运行联机修订清理”一节。
- 在Windows环境 上,始终强制定期文件访问,因此不使用内存映射访问。 作为一般建议,应将所有可用的RAM分配给栈,并增加segmentCache大小。 您可以通过将segmentCache.size选项添加到org.apache.jackrabbit.oak.segment.SegmentNodeStoreService.config来增加segmentCache(例如,segmentCache.size=20480)。 切记不要为操作系统和其他进程留出一些RAM。
- 在非Windows环境中,增加物理内存的大小以改进存储库的内存映射。
监视联机修订版清理
- 启用“联机修订清理”后,应监视磁盘空间。 清理不会运行,或者在磁盘空间不足时提前终止。
- 检查联机修订版清理的完成时间日志。 此过程不应超过2个小时。
- 检查点数。 如果在压缩运行时有3个以上的检查点,建议清理检查点。
您可以通过检查日志来检查联机修订清理是否成功完成。
例如,“TarMK GC #{}: compaction completed in {} ({} ms), after {} cycles
”表示压缩步骤成功完成,除非在之前显示消息“TarMK GC #{}: compaction gave up compacting concurrent commits after {} cycles
”,这意味着并发负载过多。
相应地,出现一条消息“TarMK GC #{}: cleanup completed in {} ({} ms
”,表示清理步骤成功完成。
通过JMX (SegmentRevisionGarbageCollection
MBean)公开状态、进度和统计信息。 有关SegmentRevisionGarbageCollection
MBean的更多详细信息,请阅读以下段落。
可以通过的EstimatedRevisionGCCompletion
属性跟踪进度 SegmentRevisionGarbageCollection MBean.
您可以使用ObjectName org.apache.jackrabbit.oak:name="Segment node store revision garbage collection",type="SegmentRevisionGarbageCollection"
获取MBean的引用。
统计信息仅在上次系统启动后可用。 外部监视工具可用于将数据保留在AEM正常运行时间之外。
- 联机修订清理已启动/停止
- 在线修订清理由三个阶段组成:估算、压缩和清理。 如果存储库未包含足够的垃圾,则估算可能会强制跳过压缩和清理。 在最新版本的AEM中,消息“
TarMK GC #{}: estimation started
”标记估算的开头,“TarMK GC #{}: compaction started, strategy={}
”标记压缩的开头,“TarMK GC #{}: cleanup started. Current repository size is {} ({} bytes
”标记清理的开头。
- 在线修订清理由三个阶段组成:估算、压缩和清理。 如果存储库未包含足够的垃圾,则估算可能会强制跳过压缩和清理。 在最新版本的AEM中,消息“
- 通过修订清理获得的磁盘空间
- 仅在清理阶段完成时才回收空间。 清理阶段的结束用日志消息“T
arMK GC #{}: cleanup completed in {} ({} ms
”标记。 后清理大小为{} ({}字节),已回收空间{} ({}字节)。 压缩映射权重/深度为{}/{} ({}字节/{})。
- 仅在清理阶段完成时才回收空间。 清理阶段的结束用日志消息“T
- 修订清理期间出现问题
- 有许多故障情况,它们都标有WARN或ERROR日志消息,以“TarMK GC”开头。
另请参阅下面的基于错误消息的故障排除部分。
TarMK GC #3: cleanup completed
”,其中包含存储库的大小和回收的垃圾量。修订清理运行状况检查是操作仪表板.
的一部分
如果联机修订清理维护任务的最后一次执行已成功完成,则状态为 绿色。
如果联机修订清理维护任务被取消一次,则为 黄色。
如果连续三次取消联机修订清理维护任务,则为 红色。 在这种情况下,需要手动交互,否则联机修订清理可能会再次失败。 有关详细信息,请阅读下面的疑难解答部分。
此外,系统重新启动后,运行状况检查状态也会重置。 因此,新重新启动的实例在修订清理运行状况检查中显示绿色状态。 外部监视工具可用于将数据保留在AEM正常运行时间之外。
使用SegmentRevisionGarbageCollection
MBean通过JMX公开状态、进度和统计信息。 另请参阅以下Oak文档。
您可以使用ObjectName org.apache.jackrabbit.oak:name="Segment node store revision garbage collection",type="SegmentRevisionGarbageCollection"
获取MBean的引用。
统计信息仅自上次系统启动后可用。 外部监视工具可用于将数据保留在AEM正常运行时间之外。
日志文件还可用于检查自动清理的状态、进度和统计信息。
- 运行自动清理时应监视磁盘空间。
- 完成时间(通过日志)以确保不超过2小时。
- 运行自动清理后的区段存储大小。 备用实例上的段存储大小应该与主实例上的段存储大小大致相同。
联机修订版清理疑难解答
您可以执行几个步骤来查找并修复问题:
-
首先,检查日志条目
-
根据日志中的信息,采取适当措施:
- 如果日志显示错过了五个压缩周期并在
forceCompact
周期超时,请将维护时段安排在存储库写入量较少时的安静时间。 您可以在 https://serveraddress:serverport/libs/granite/operations/content/monitoring/page.html 上的存储库量度监视工具中检查存储库写入 - 如果清理在维护时段结束时停止,请确保维护任务用户界面中维护时段的配置足够大
- 如果可用的栈内存不足,请确保实例有足够的内存。
- 如果反应较晚,则区段存储可能会增长太多,以致于线上修订清理无法在较长的维护时段内完成。 例如,如果上周未成功完成在线修订清理,则建议计划离线维护,并运行离线修订清理,以将区段存储恢复到可管理的大小。
- 如果日志显示错过了五个压缩周期并在
SegmentNotFoundException
实例在error.log
中登录的原因是什么?如何恢复?TarMK在尝试访问其无法找到的存储单元(区段)时记录SegmentNotFoundException
。 有三种情况可能会导致此问题:
- 一种应用程序,可绕过建议的访问机制(如Sling和JCR API),使用较低级别的API/SPI访问存储库,然后超过区段的保留时间。 也就是说,它保留对实体的引用,保留时间超过在线修订版清理所允许的保留时间(默认为24小时)。 此案例是暂时性的,不会导致数据损坏。 要恢复,应使用oak-run工具确认异常的瞬态性质(oak-run检查不应报告任何错误)。 为此,实例必须离线并在之后重新启动。
- 外部事件导致磁盘上的数据损坏。 这可以是磁盘故障、磁盘空间不足或意外修改所需的数据文件。 在这种情况下,实例必须离线并使用oak-run检查进行修复。 有关如何执行Oak-run检查的更多详细信息,请阅读以下Apache文档。
- 通过Adobe客户关怀解决所有其他问题。
基于错误消息的故障排除
如果在联机修订清理过程中发生事件,则error.log为详细。 以下列表旨在解释最常见的报文并提供可能的解决方案:
如何运行脱机修订版清理
Adobe提供了一个名为 Oak-run 的工具来执行修订清理。 可在以下位置下载它:
https://repo1.maven.org/maven2/org/apache/jackrabbit/oak-run/
该工具是一个可运行的jar,可以手动运行以压缩存储库。 此过程称为脱机修订版清理,因为必须关闭存储库才能正确运行该工具。 请确保根据您的维护时段计划清理。
有关如何提高清除过程性能的提示,请参阅提高脱机修订清除的性能。
-
始终确保您有AEM实例的最新备份。
关闭AEM。
-
(可选)使用该工具查找旧检查点:
java -jar oak-run.jar checkpoints install-folder/crx-quickstart/repository/segmentstore
-
(可选)然后,删除未引用的检查点:
java -jar oak-run.jar checkpoints install-folder/crx-quickstart/repository/segmentstore rm-unreferenced
-
运行压缩并等待其完成:
java -jar -Dsun.arch.data.model=32 oak-run.jar compact install-folder/crx-quickstart/repository/segmentstore
提高脱机修订清理的性能
oak-run工具引入了多种功能,旨在提高修订清理过程的性能,并尽可能减少维护窗口。
该列表包括几个命令行参数,如下所述:
-
-mmap 您可以将其设置为true或false。 如果设置为true,则使用内存映射访问。 如果设置为false,则使用文件访问权限。 如果未指定,则在64位系统上使用内存映射访问,在32位系统上使用文件访问。 在Windows上,始终强制定期访问文件,并且此选项被忽略。 此参数已替换 — Dtar.memoryMapped参数。
-
-Dupdate.limit。 定义将临时事务刷新到磁盘的阈值。 默认值为 10000。
-
— 压缩间隔。 在压缩当前映射之前要保留的压缩映射条目数。 默认值为1000000。 如果有足够的栈内存可用,则应该将此值增加到更高的数值,以便提高吞吐量。 此参数已在Oak版本1.6中删除,没有任何效果。
-
-Dcompaction-progress-log。 记录的压缩节点数。 默认值为150000,这意味着在操作期间记录前150000个压缩节点。 将此参数和下面记录的下一个参数一起使用。
-
-Dtar.PersistCompactionMap。 将此参数设置为true可使用磁盘空间而不是栈内存来保持压缩映射持久性。 需要Oak-run工具 版本1.4 及更高版本。 有关详细信息,请参阅脱机修订清理常见问题部分中的问题3。 此参数已在Oak版本1.6中删除,没有任何效果。
-
— 强制。 强制压缩并忽略不匹配的区段存储版本。
--force
参数可将区段存储升级到最新版本,此版本与旧版Oak不兼容。 此外,请考虑一下,降级是不可能的。 通常,您应该谨慎使用这些参数,并且仅在您了解如何使用它们时才使用。正在使用的参数示例:
java -Dupdate.limit=10000 -Dcompaction-progress-log=150000 -Dlogback.configurationFile=logback.xml -Xmx8g -jar oak-run-*.jar checkpoints <repository>
触发修订清理的其他方法
除了上述方法之外,您还可以使用JMX控制台触发修订清除机制,如下所示:
- 转到http://localhost:4502/system/console/jmx打开JMX控制台
- 单击 RevisionGarbageCollection MBean。
- 在下一个窗口中,单击 startRevisionGC(),然后单击 Invoke 以启动修订垃圾收集作业。
脱机修订版清理常见问题解答
InMemoryCompactionMap.findEntry
,请将oak-run工具 版本1.4 或更高版本使用以下参数: -Dtar.PersistCompactionMap=true
。 -Dtar.PersistCompactionMap
参数已在Oak版本1.6中删除。