問題点

失敗したワークフローの増加と、ワークフローインボックスのバッジの pulse.data.json 呼び出しが原因で、AEM オーサーインスタンスの動作が遅くなり、クラッシュします。ワークフローインボックスのバッジとは、タッチ操作対応 UI の右上にあるベルのアイコンのことです。

access.log を見ると、同一のユーザーが pulse.data.json に対して多数の呼び出しを実行していることがわかります。 

10.43.34.55 - user 06/Jan/2017:18:17:11 +0900 "GET /mnt/overlay/granite/ui/content/shell/header/actions/pulse.data.json?_=1483664547926 HTTP/1.1" 500 1234 "https://authorhost/sites.html/content/geometrixx/en" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0"
10.43.34.55 - user 06/Jan/2017:18:17:13 +0900 "GET /mnt/overlay/granite/ui/content/shell/header/actions/pulse.data.json?_=1483664547927 HTTP/1.1" 500 1234 "https://authorhost/sites.html/content/geometrixx/en" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0"
10.43.34.55 - user 06/Jan/2017:18:17:15 +0900 "GET /mnt/overlay/granite/ui/content/shell/header/actions/pulse.data.json?_=1483664547928 HTTP/1.1" 500 1234 "https://authorhost/sites.html/content/geometrixx/en" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0"
10.43.34.55 - user 06/Jan/2017:18:17:17 +0900 "GET /mnt/overlay/granite/ui/content/shell/header/actions/pulse.data.json?_=1483664547929 HTTP/1.1" 500 1234 "https://authorhost/sites.html/content/geometrixx/en" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0"

また、AEM サーバーでは、CPU 使用率が高く、AEM スレッドからのスレッドダンプが多くなっていることがわかります。例えば次のようになります。

"192.168.10.5 [1485896535734] GET /mnt/overlay/granite/ui/content/shell/header/actions/pulse.data.json HTTP/1.1" #1969 prio=5 os_prio=0 tid=0x0000000001a39800 nid=0xaf2 runnable [0x00007f2f5ae4f000]
   java.lang.Thread.State: RUNNABLE
	at org.apache.jackrabbit.oak.spi.state.ReadOnlyBuilder.getChildNodeNames(ReadOnlyBuilder.java:101)
	at org.apache.jackrabbit.oak.plugins.tree.impl.AbstractTree.getChildNames(AbstractTree.java:145)
	at org.apache.jackrabbit.oak.plugins.tree.impl.AbstractTree.getChildren(AbstractTree.java:322)
	at org.apache.jackrabbit.oak.security.authorization.permission.PermissionStoreImpl.loadPermissionEntries(PermissionStoreImpl.java:150)
	at org.apache.jackrabbit.oak.security.authorization.permission.PermissionStoreImpl.load(PermissionStoreImpl.java:115)
	at org.apache.jackrabbit.oak.security.authorization.permission.PermissionEntryCache.getEntries(PermissionEntryCache.java:48)
	at org.apache.jackrabbit.oak.security.authorization.permission.PermissionEntryCache.load(PermissionEntryCache.java:63)
	at org.apache.jackrabbit.oak.security.authorization.permission.PermissionEntryProviderImpl.init(PermissionEntryProviderImpl.java:109)
	at org.apache.jackrabbit.oak.security.authorization.permission.PermissionEntryProviderImpl.<init>(PermissionEntryProviderImpl.java:72)
	at org.apache.jackrabbit.oak.security.authorization.permission.CompiledPermissionImpl.<init>(CompiledPermissionImpl.java:112)
	at org.apache.jackrabbit.oak.security.authorization.permission.CompiledPermissionImpl.create(CompiledPermissionImpl.java:126)
	at org.apache.jackrabbit.oak.security.authorization.permission.PermissionProviderImpl.<init>(PermissionProviderImpl.java:71)
	at org.apache.jackrabbit.oak.security.authorization.AuthorizationConfigurationImpl.getPermissionProvider(AuthorizationConfigurationImpl.java:185)
	at org.apache.jackrabbit.oak.security.authorization.composite.CompositeAuthorizationConfiguration.getPermissionProvider(CompositeAuthorizationConfiguration.java:134)
	at org.apache.jackrabbit.oak.core.MutableRoot$1.createValue(MutableRoot.java:126)
	at org.apache.jackrabbit.oak.core.MutableRoot$1.createValue(MutableRoot.java:123)
	at org.apache.jackrabbit.oak.core.LazyValue.get(LazyValue.java:53)
	- locked <0x0000000726732148> (a org.apache.jackrabbit.oak.core.MutableRoot$1)
	at org.apache.jackrabbit.oak.core.MutableRoot$2.getExecutionContext(MutableRoot.java:311)
	at org.apache.jackrabbit.oak.query.QueryEngineImpl.executeQuery(QueryEngineImpl.java:256)
	at org.apache.jackrabbit.oak.query.QueryEngineImpl.executeQuery(QueryEngineImpl.java:233)
	at org.apache.jackrabbit.oak.plugins.identifier.IdentifierManager.resolveUUID(IdentifierManager.java:314)
	at org.apache.jackrabbit.oak.plugins.identifier.IdentifierManager.resolveUUID(IdentifierManager.java:308)
	at org.apache.jackrabbit.oak.plugins.identifier.IdentifierManager.resolveUUID(IdentifierManager.java:304)
	at org.apache.jackrabbit.oak.plugins.identifier.IdentifierManager.getTree(IdentifierManager.java:133)
	at org.apache.jackrabbit.oak.security.user.AuthorizableBaseProvider.getByContentID(AuthorizableBaseProvider.java:56)
	at org.apache.jackrabbit.oak.security.user.AuthorizableBaseProvider.getByID(AuthorizableBaseProvider.java:51)
	at org.apache.jackrabbit.oak.security.user.UserProvider.getAuthorizable(UserProvider.java:211)
	at org.apache.jackrabbit.oak.security.user.UserManagerImpl.getAuthorizable(UserManagerImpl.java:110)
	at org.apache.jackrabbit.oak.jcr.delegate.UserManagerDelegator$1.performNullable(UserManagerDelegator.java:64)
	at org.apache.jackrabbit.oak.jcr.delegate.UserManagerDelegator$1.performNullable(UserManagerDelegator.java:61)
	at org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate.performNullable(SessionDelegate.java:243)
	at org.apache.jackrabbit.oak.jcr.delegate.UserManagerDelegator.getAuthorizable(UserManagerDelegator.java:61)
	at com.adobe.granite.workflow.core.WorkflowSessionFactory.isSuperUser(WorkflowSessionFactory.java:356)
	at com.adobe.granite.workflow.core.WorkflowSessionFactory.getWorkflowSession(WorkflowSessionFactory.java:389)
	at com.adobe.granite.workflow.core.WorkflowSessionFactory.getAdapter(WorkflowSessionFactory.java:515)
	at org.apache.sling.adapter.internal.AdapterManagerImpl.getAdapter(AdapterManagerImpl.java:147)
	at com.adobe.granite.workflow.core.jcr.WorkItemAdapterFactory.getAdapter(WorkItemAdapterFactory.java:128)
	at org.apache.sling.adapter.internal.AdapterManagerImpl.getAdapter(AdapterManagerImpl.java:147)
	at com.adobe.granite.workflow.core.jcr.WorkItemManager.getInboxItems(WorkItemManager.java:289)
	at com.adobe.granite.workflow.core.WorkflowSessionImpl.getActiveInboxItems(WorkflowSessionImpl.java:711)
	at com.adobe.granite.workflow.core.WorkflowSessionImpl.getActiveInboxItems(WorkflowSessionImpl.java:618)
	at org.apache.jsp.libs.cq.gui.components.shell.badge.data_json_jsp._jspService(data_json_jsp.java:609)

環境

AEM 6.2 SP1

原因

ユーザーまたはグループの保留中のインボックス項目が多くなると、バッジの pulse.data.json 呼び出しが遅くなります。やがて pulse.data.json の呼び出しがタイムアウトするようになり、AEM に過剰な負荷がかかります。

解決策

最新の Cumulative Fix Pack をインストールしてバグを修正します。

I. 回避策を実施する

短期間で修正パックを AEM の実稼動環境にインストールすることはできないので、一時的な措置として次の手順をおこなってください。

  1. CRXDe http://aem-host:port/crx/de/index.jsp にアクセスし、管理者としてログインします。

  2. sling:Folder ノード /apps/granite/ui/components/shell/clientlibs/shell/js を基に、このフォルダー構造を作成します。

  3. 「すべて保存」をクリックします。

  4. /libs/granite/ui/components/shell/clientlibs/shell/js/badge.js のオーバーレイを参照し、コードを以下のように修正します。

    修正前:

    setInterval(function() {
    updateBadge(el, src, true);
    }, 2000);

    修正後(5 分ごとに更新するよう設定):

    setInterval(function() {
    updateBadge(el, src, true);
    }, 300000);

    ダウンロード

II.実行中の古いワークフローとタスクをパージする

ワークフロー通知バッジの間隔を修正しましたが、ユーザーのインボックス内に保留中のタスクが多すぎることも問題の原因になっています。この問題に対処するには、次の手順に沿って、不要なワークフローインボックス項目とタスクを削除する必要があります。

  1. Workflow Maintenance JMX オブジェクト(
     http://host:port/system/console/jmx/com.adobe.granite.workflow%3Atype%3DMaintenance)にアクセスします。

  2. 実行中のアクティブなワークフローが不要な場合は、purgeActivedryRun = false で実行してワークフローのパージをおこないます。

  3. http://host:port/crx/explorer/index.jsp にアクセスし、管理者としてログインします。

  4. Content Explorer を起動します。

  5. /etc/taskmanagement/tasks を参照します。

  6. フォルダーノードを右クリックし、「再帰的に削除」を選択して、タスクを削除します。

  7. 予備スキャン」を無効にし、削除を実行します。

  8. /content/projects のプロジェクトにもその他のタスクがあるので、/projects.html を使用して不要になった古いプロジェクトを削除します。

  9. CRXDe を使用して /content/projects のサブノードを参照し、不要になったタスクをすべて削除します。例えば、/content/projects/geometrixx/outdoors/jcr:content/dashboard/gadgets/tasks などです。

本作品は Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License によってライセンス許可を受けています。  Twitter™ および Facebook の投稿には、Creative Commons の規約内容は適用されません。

法律上の注意   |   プライバシーポリシー