vCenter のサービスで OutOfMemoryError : Java heap space が発生した結果、スワップメモリの使用率が 100% となり、vCenter のバックアップが " Error: database or disk is full" というエラーで失敗する
search cancel

vCenter のサービスで OutOfMemoryError : Java heap space が発生した結果、スワップメモリの使用率が 100% となり、vCenter のバックアップが " Error: database or disk is full" というエラーで失敗する

book

Article ID: 415664

calendar_today

Updated On:

Products

VMware vCenter Server

Issue/Introduction

免責事項:これは英文の記事「vCenter services experiencing OutOfMemoryError: Java heap space, causing the swap memory to be 100% utilized and due to which vCenter backup fails with " Error: database or disk is full"」の日本語訳です。記事はベストエフォートで翻訳を進めているため、ローカライズ化コンテンツは最新情報ではない可能性があります。最新情報は英語版の記事で参照してください。
  • vc-w1sa-broker サービスのメモリリークによりスワップが使い果たされます。
  • スワップ使用率がほとんど 100% となり、observability、vmware-postgres-archiver などの他のサービスに影響を及ぼします。どちらのサービスもメモリ割り当ての失敗により STOPPED ステータスとなります。
  • tmpfs(/tmp) はメモリにマウントされ、スワップ領域を使用します。VAMI で取得するバックアップは /tmp (/tmp/backup_stellardb/stellar.db) に保存されるため、スワップ領域が使い果たされるとバックアップは "database or disk is full" というエラーで失敗します。
これは free コマンドを実行することで確認できます。 
<例>
# free
               total                 used              free      shared  buff/cache   available
Mem:        21502260    10915648      186524      707668    10400088     9486496
Swap:       26206204    25806436      399768    <<< almost 98% used
  • メモリリークが発生してスワップ領域のほとんどを消費しているプロセス ID (PID) を特定してください。
次のコマンドによりスワップを最も多く使用しているプロセスを表示できます。
 <例>
root@vcenter [ ~ ]# grep Swap /proc/*/status| sort -n -k 2
/proc/1165384/status:VmSwap:         0 kB
/proc/1166238/status:VmSwap:         0 kB
--------------------------------------
/proc/10168/status:VmSwap:        525780 kB
/proc/5913/status:VmSwap:          585168 kB
/proc/1234/status:VmSwap:        20787736 kB     <<< この PID 1234 のプロセスがスワップ領域を最も多く使用しています。
root@vcenter[ ~ ]# ps -auwwx | grep 1234         <<< PID 1234 は idmserv+ (accesscontrol service) プロセスです。
idmserv+    1234 46.1  3.5 23249320 768572 ?     Sl    2024 141353:11 java -Dlog4jRootFolder=/opt/vmware/idm/accesscontrol/logs -Dlog4j.configurationFile=log4j2-base.xml,log4j2-accesscontrol.xml,/opt/vmware/idm/accesscontrol/config/log4j2-override.xml -Dlog4jRequestContextKeysToMdc=clientId,grantType -

 

less /var/log/vmware/vmon/vmon.log

YYYY-MM-DDT16:00:23.640Z In(05) host-1234 <vmware-postgres-archiver-prestart> Constructed command: /opt/vmware/vpostgres/current/scripts/pg_archiver_pre_start vpg_archiver 300
YYYY-MM-DDT16:00:23.640Z Er(02) host-1234 fork failed. Cannot allocate memory
YYYY-MM-DDT16:00:23.640Z Er(02) host-1234 <vmware-postgres-archiver> Service pre-start command could not started.
YYYY-MM-DDT16:00:23.640Z Er(02) host-1234 <vmware-postgres-archiver> Service reached max quick failure count. Give up!!!
 YYYY-MM-DDT16:00:23.640Z Er(02) host-1234 fork failed. Cannot allocate memory
YYYY-MM-DDT16:00:23.640Z Er(02) host-1234 <vmware-postgres-archiver> Service pre-start command could not started.
YYYY-MM-DDT16:00:23.640Z Wa(03) host-1234 <vmware-postgres-archiver> Service failed to recover. Try again. Fail count 1
YYYY-MM-DDT16:00:23.640Z In(05) host-1234 <vmware-postgres-archiver-prestart> Constructed command: /opt/vmware/vpostgres/current/scripts/pg_archiver_pre_start vpg_archiver 300
YYYY-MM-DDT16:00:23.640Z Er(02) host-1234 fork failed. Cannot allocate memory
YYYY-MM-DDT16:00:23.640Z Er(02) host-1234 <vmware-postgres-archiver> Service pre-start command could not started.
YYYY-MM-DDT16:00:23.640Z Wa(03) host-1234 <vmware-postgres-archiver> Service failed to recover. Try again. Fail count 2
YYYY-MM-DDT16:00:23.640Z In(05) host-1234 <vmware-postgres-archiver-prestart> Constructed command: /opt/vmware/vpostgres/current/scripts/pg_archiver_pre_start t vpg_archiver 300

 

less /var/log/vmware/vc-ws1a-broker/accesscontrol-service.log

YYYY-MM-DDT23:44:02,266 ERROR vcenter.vsphere.local:accesscontrol (vert.x-eventloop-thread-3) [-;-;-;-;-;-;-] io.vertx.core.impl.ContextBase - Unhandled exc
eption java.lang.OutOfMemoryError: Java heap space
YYYY-MM-DDT23:44:02,487 ERROR vcenter.vsphere.local:accesscontrol (vert.x-eventloop-thread-5) [-;-;-;-;-;-;-] io.vertx.core.impl.ContextBase - Unhandled exc
eption java.lang.OutOfMemoryError: Java heap space
YYYY-MM-DDT07:01:05,133 INFO  vcenter.vsphere.local:accesscontrol (acs-rds-db-ops) [-;-;-;-;-;-;-] com.vmware.vidm.accesscontrol.db.OAuth2AuthorizationCodeD
ataServiceImpl - Starting purge of expired authorization codes
YYYY-MM-DDT07:01:44,126 WARN  vcenter.vsphere.local:accesscontrol (acs-rds-db-ops) [-;-;-;-;-;-;-] org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Er
ror: 0, SQLState: null
YYYY-MM-DDT07:01:44,126 ERROR vcenter.vsphere.local:accesscontrol (acs-rds-db-ops) [-;-;-;-;-;-;-] org.hibernate.engine.jdbc.spi.SqlExceptionHelper - An att
empt by a client to checkout a Connection has timed out.
YYYY-MM-DDT07:02:08,136 ERROR vcenter.vsphere.local:accesscontrol (acs-rds-db-ops) [-;-;-;-;-;-;-] com.vmware.vidm.accesscontrol.db.OAuth2AuthorizationCodeD
ataServiceImpl - Caught exception during scheduled purging of authorization codes java.util.concurrent.CompletionException: java.lang.OutOfMemoryError: Java
heap space
        at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(Unknown Source)
        at java.base/java.util.concurrent.CompletableFuture.completeThrowable(Unknown Source)
        at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(Unknown Source)
        at com.vmware.vidm.common.async.ContextPassingExecutor.lambda$wrap$0(ContextPassingExecutor.java:48)
        at io.micrometer.core.instrument.internal.TimedRunnable.run(TimedRunnable.java:49)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.OutOfMemoryError: Java heap space
YYYY-MM-DDT07:02:13,679 ERROR vcenter.vsphere.local:accesscontrol (acs-rds-db-ops) [-;-;-;-;-;-;-] com.vmware.vidm.accesscontrol.db.AbstractDataServiceImpl
- Unexpected exception java.lang.OutOfMemoryError: Java heap space
YYYY-MM-DDT07:01:07,835 INFO  vcenter.vsphere.local:accesscontrol (acs-rds-db-ops) [-;-;-;-;-;-;-] com.vmware.vidm.accesscontrol.db.OAuth2AuthorizationCodeD
ataServiceImpl - Starting purge of expired authorization codes
YYYY-MM-DDT07:01:44,482 WARN  vcenter.vsphere.local:accesscontrol (acs-rds-db-ops) [-;-;-;-;-;-;-] org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Er
ror: 0, SQLState: null
YYYY-MM-DDT07:01:44,482 ERROR vcenter.vsphere.local:accesscontrol (acs-rds-db-ops) [-;-;-;-;-;-;-] org.hibernate.engine.jdbc.spi.SqlExceptionHelper - An att
empt by a client to checkout a Connection has timed out.
YYYY-MM-DDT07:02:52,604 ERROR vcenter.vsphere.local:accesscontrol (acs-rds-db-ops) [-;-;-;-;-;-;-] com.vmware.vidm.accesscontrol.db.DbDataStoreAutoConfigura
tion - ALERT!! Thread acs-rds-db-ops threw an uncaught exception java.lang.OutOfMemoryError: Java heap space

Environment

VMware vCenter 8.0 U2a 以降

Cause

トークン処理中にメモリリークが発生する場合があります。設定値の変更がメモリリーク発生防止に役立ちます。
この問題は vCenter 8.0 U2a 以降の不具合として報告されており、将来のリリースで修正される予定です。

Resolution

問題を解決するためには、以下の回避策に従い、以下手順でパラメータを設定してください。
  • vCenter Server に SSH ログインし、BASH に切り替え
  • 次のディレクトリ下にある設定ファイルを vi などを用いて編集
    • /var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/12/fs/opt/vmware/idm/initc/services/token/config/application.properties 
    • 注 : 最も番号の大きいスナップショットの設定ファイルを編集してください。
<例>
  • 以下のように複数のスナップショットフォルダが存在する場合があり、最も番号の大きいスナップショットの設定ファイルを編集する必要があります。

  • 以下のように 2 つの "application.properties" が異なるディレクトリに存在します。

/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/11/fs/opt/vmware/idm/initc/services/token/config/application.properties
/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/12/fs/opt/vmware/idm/initc/services/token/config/application.properties
  • 次の 3 つのパラメータを最も番号の大きいスナップショット(12 番目)のファイルに追加してください。 :
    token.delete.expired.tokens.limit=100
    revocation.delete.old.tombstones.limit=100
    revoke.by.oauthclientid.batch.size=500
  • 次のコマンドによりサービスを再起動してください。
    service-control --restart vc-ws1a-broker