如何在不重启 Artifactory 的情况下重启 SHA256MigrationJob?
How to restart the SHA256MigrationJob without restarting Artifactory?
我在 sha256_migration.log 中不断遇到以下错误消息。它在失败后不会重新启动,但是如果我重新启动人工制品服务,它会从它停止的地方开始 SHA256 迁移,直到它再次失败。
2018-11-13 10:24:35,060 [art-exec-3] [ERROR] (o.a.s.j.m.s.Sha256MigrationJob:78) - Caught unexpected exception during SHA256 Migration job, operation will break.
org.springframework.core.task.TaskRejectedException: Executor [org.artifactory.schedule.ArtifactoryConcurrentExecutor@70a2137a] did not accept task: org.artifactory.schedule.aop.AsyncAdvice$$Lambda4/1640835804@7dbf55d3
at org.springframework.core.task.support.TaskExecutorAdapter.submit(TaskExecutorAdapter.java:93)
at org.springframework.scheduling.concurrent.ConcurrentTaskExecutor.submit(ConcurrentTaskExecutor.java:143)
at org.artifactory.schedule.aop.AsyncAdvice.submitWorkQueueTask(AsyncAdvice.java:235)
at org.artifactory.schedule.aop.AsyncAdvice.submit(AsyncAdvice.java:217)
at org.artifactory.schedule.aop.AsyncAdvice.executeInvocation(AsyncAdvice.java:146)
at org.artifactory.schedule.aop.AsyncAdvice.invoke(AsyncAdvice.java:124)
at org.artifactory.schedule.aop.AsyncAdvice.invoke(AsyncAdvice.java:62)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy144.updateSha2(Unknown Source)
at org.artifactory.storage.jobs.migration.sha256.Sha256MigrationJob.migrationLogic(Sha256MigrationJob.java:134)
at org.artifactory.storage.jobs.migration.MigrationJobBase.migrationLoop(MigrationJobBase.java:106)
at org.artifactory.storage.jobs.migration.MigrationJobBase.runMigration(MigrationJobBase.java:83)
at org.artifactory.storage.jobs.migration.MigrationJobBase.onExecute(MigrationJobBase.java:73)
at org.artifactory.schedule.quartz.QuartzCommand.execute(QuartzCommand.java:48)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.artifactory.concurrent.ArtifactoryRunnable.run(ArtifactoryRunnable.java:30)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.util.concurrent.RejectedExecutionException: Task org.artifactory.concurrent.ArtifactoryRunnable@4afb003 rejected from java.util.concurrent.ThreadPoolExecutor@33daf5aa[Running, pool size = 64, active threads = 64, queued tasks = 10000, completed tasks = 120723]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
at org.artifactory.schedule.ArtifactoryConcurrentExecutor.execute(ArtifactoryConcurrentExecutor.java:69)
at org.springframework.core.task.support.TaskExecutorAdapter.submit(TaskExecutorAdapter.java:88)
... 19 common frames omitted
我的 artifactory.system.properties 关于 sha256migration
##SHA2 Migration block
artifactory.sha2.migration.job.enabled=true
artifactory.sha2.migration.job.queue.workers=100
我的设置:
- 将 Artifactory 基础设施的生产实例克隆到测试实例中(保存 IP 地址和 DNS 记录)。
- 确保克隆实例上的数据库和文件存储配置(db.properties 和 binarystore.xml)已相应更新。
我尝试过但没有成功的事情:
- 我运行 Artifactory GC 几次。
- 将 CPU 增加到 16
- 增加内存到16G
- 确保我是 运行ning 最新的 Oracle Java 8u192
我知道的:
- 运行它会保持正常一段时间直到崩溃。
- 当我重新启动工件服务时,迁移恢复并且要迁移的工件总数较低。
- 我无法在生产环境中不断重启 Artifactory 来完成 sha256migration 作业,我有超过 500k 个工件。
我的问题:
- 有什么方法可以在不重启 Artifactory 的情况下重启 SHA256MigrationJob?
- 有没有办法找到它在迁移到 SHA256 时遇到问题的工件?
- 在上面的堆栈跟踪中,我觉得问题出在 com.sun.proxy.$Proxy144.updateSha2(Unknown Source).
-- 解决方法--
我最终创建了一个新的 VM 并安装了一个干净的副本 Artifactory 6.5.3(带有最新的 Oracle Java 8 Server-JRE)。在上面的问题中,我正在就地升级,只是在一个新文件夹中。
我将etc中的必要文件移到了新的虚拟机中;例如 master.key、binarystore.xml、db.properties 等。然后我执行了 bin/installService.sh [user] [group],这创建了 /etc/opt/jfrog/artifactory 配置 symlink/folder搬家。我的文件存储和 artifactory 数据库 运行 在不同的 VM 上运行,因此只需要移植 Artifactory 及其文件配置。
新的 Artifactory 6.5.3 版本启动没有问题。
sha256migrationjob 实际上 运行ning 没有任何问题。上次升级 运行 我升级了,工作正常,没有死机。
注意:我也理智地调整了队列工作者的配置值。 https://www.jfrog.com/confluence/display/RTF/Checksum-Based+Storage#Checksum-BasedStorage-ConfiguringtheMigrationProcess
tl;dr 将 artifactory.sha2.migration.job.queue.workers
减少到大约 2 - 2 * 核心数。
您遇到的是 ThreadPoolExecutor 耗尽。
线程池的大小默认为 4 * [核心数]。
在你的情况下 64(16 核 * 4)
但是,您为 sha256 迁移作业配置的线程数限制为 100。
在没有任何负载的人工实例上,这不会导致任何失败,因为有一个队列支持线程拉取(在您的情况下,大小为 10000)。
在你的情况下线程拉动和队列已满。
如果我理解正确的话,你已经解决了这个问题。但是对于遇到此线程的其他人,我建议将 artifactory.sha2.migration.job.queue.workers
的值减小到不超过线程拉取线程数的一半。
所以在你的情况下 32: (16 * 4)/2
我在 sha256_migration.log 中不断遇到以下错误消息。它在失败后不会重新启动,但是如果我重新启动人工制品服务,它会从它停止的地方开始 SHA256 迁移,直到它再次失败。
2018-11-13 10:24:35,060 [art-exec-3] [ERROR] (o.a.s.j.m.s.Sha256MigrationJob:78) - Caught unexpected exception during SHA256 Migration job, operation will break.
org.springframework.core.task.TaskRejectedException: Executor [org.artifactory.schedule.ArtifactoryConcurrentExecutor@70a2137a] did not accept task: org.artifactory.schedule.aop.AsyncAdvice$$Lambda4/1640835804@7dbf55d3
at org.springframework.core.task.support.TaskExecutorAdapter.submit(TaskExecutorAdapter.java:93)
at org.springframework.scheduling.concurrent.ConcurrentTaskExecutor.submit(ConcurrentTaskExecutor.java:143)
at org.artifactory.schedule.aop.AsyncAdvice.submitWorkQueueTask(AsyncAdvice.java:235)
at org.artifactory.schedule.aop.AsyncAdvice.submit(AsyncAdvice.java:217)
at org.artifactory.schedule.aop.AsyncAdvice.executeInvocation(AsyncAdvice.java:146)
at org.artifactory.schedule.aop.AsyncAdvice.invoke(AsyncAdvice.java:124)
at org.artifactory.schedule.aop.AsyncAdvice.invoke(AsyncAdvice.java:62)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy144.updateSha2(Unknown Source)
at org.artifactory.storage.jobs.migration.sha256.Sha256MigrationJob.migrationLogic(Sha256MigrationJob.java:134)
at org.artifactory.storage.jobs.migration.MigrationJobBase.migrationLoop(MigrationJobBase.java:106)
at org.artifactory.storage.jobs.migration.MigrationJobBase.runMigration(MigrationJobBase.java:83)
at org.artifactory.storage.jobs.migration.MigrationJobBase.onExecute(MigrationJobBase.java:73)
at org.artifactory.schedule.quartz.QuartzCommand.execute(QuartzCommand.java:48)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.artifactory.concurrent.ArtifactoryRunnable.run(ArtifactoryRunnable.java:30)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.util.concurrent.RejectedExecutionException: Task org.artifactory.concurrent.ArtifactoryRunnable@4afb003 rejected from java.util.concurrent.ThreadPoolExecutor@33daf5aa[Running, pool size = 64, active threads = 64, queued tasks = 10000, completed tasks = 120723]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
at org.artifactory.schedule.ArtifactoryConcurrentExecutor.execute(ArtifactoryConcurrentExecutor.java:69)
at org.springframework.core.task.support.TaskExecutorAdapter.submit(TaskExecutorAdapter.java:88)
... 19 common frames omitted
我的 artifactory.system.properties 关于 sha256migration
##SHA2 Migration block
artifactory.sha2.migration.job.enabled=true
artifactory.sha2.migration.job.queue.workers=100
我的设置:
- 将 Artifactory 基础设施的生产实例克隆到测试实例中(保存 IP 地址和 DNS 记录)。
- 确保克隆实例上的数据库和文件存储配置(db.properties 和 binarystore.xml)已相应更新。
我尝试过但没有成功的事情:
- 我运行 Artifactory GC 几次。
- 将 CPU 增加到 16
- 增加内存到16G
- 确保我是 运行ning 最新的 Oracle Java 8u192
我知道的:
- 运行它会保持正常一段时间直到崩溃。
- 当我重新启动工件服务时,迁移恢复并且要迁移的工件总数较低。
- 我无法在生产环境中不断重启 Artifactory 来完成 sha256migration 作业,我有超过 500k 个工件。
我的问题:
- 有什么方法可以在不重启 Artifactory 的情况下重启 SHA256MigrationJob?
- 有没有办法找到它在迁移到 SHA256 时遇到问题的工件?
- 在上面的堆栈跟踪中,我觉得问题出在 com.sun.proxy.$Proxy144.updateSha2(Unknown Source).
-- 解决方法--
我最终创建了一个新的 VM 并安装了一个干净的副本 Artifactory 6.5.3(带有最新的 Oracle Java 8 Server-JRE)。在上面的问题中,我正在就地升级,只是在一个新文件夹中。
我将etc中的必要文件移到了新的虚拟机中;例如 master.key、binarystore.xml、db.properties 等。然后我执行了 bin/installService.sh [user] [group],这创建了 /etc/opt/jfrog/artifactory 配置 symlink/folder搬家。我的文件存储和 artifactory 数据库 运行 在不同的 VM 上运行,因此只需要移植 Artifactory 及其文件配置。
新的 Artifactory 6.5.3 版本启动没有问题。
sha256migrationjob 实际上 运行ning 没有任何问题。上次升级 运行 我升级了,工作正常,没有死机。
注意:我也理智地调整了队列工作者的配置值。 https://www.jfrog.com/confluence/display/RTF/Checksum-Based+Storage#Checksum-BasedStorage-ConfiguringtheMigrationProcess
tl;dr 将 artifactory.sha2.migration.job.queue.workers
减少到大约 2 - 2 * 核心数。
您遇到的是 ThreadPoolExecutor 耗尽。 线程池的大小默认为 4 * [核心数]。 在你的情况下 64(16 核 * 4)
但是,您为 sha256 迁移作业配置的线程数限制为 100。
在没有任何负载的人工实例上,这不会导致任何失败,因为有一个队列支持线程拉取(在您的情况下,大小为 10000)。
在你的情况下线程拉动和队列已满。
如果我理解正确的话,你已经解决了这个问题。但是对于遇到此线程的其他人,我建议将 artifactory.sha2.migration.job.queue.workers
的值减小到不超过线程拉取线程数的一半。
所以在你的情况下 32: (16 * 4)/2