はじめに
今回は、Liberty の Non-Heap メモリー(Native メモリー)の使用量を REST API で取得する方法をまとめてみました。
使用する REST API は、Liberty が REST コネクターとして以前から提供している機能です。REST コネクターを使用すると、Java の JMX MBean (Java Management Extensions (JMX) 管理 Bean) が提供する機能を REST API で実行することができます。
準備
REST コネクターを利用するには、以下の2つの準備が必要となります。
- restConnector-2.0 フィーチャーを有効にする
- administrator ロールを持つユーザーをレジストリーに登録する
詳細は、前回執筆した「Liberty のテスト接続機能を利用する」の「準備」の部分を参照してください。
MBean 属性の取得方法を確認する
上記の準備を施した Liberty を起動し、ブラウザーで下記の URL にアクセスすると、REST API のヘルプ画面が表示されます。尚、ベーシック認証で保護されていますので、上記の方法で定義した administrator ロールを持つユーザーでアクセスする必要があります。
- https://(ホスト):(ポート)/IBMJMXConnectorREST/api
この画面の左上に表示されたドロップダウンから実行したい操作を選択すると、選択した操作の呼び出し方法が確認できます。
今回は、MBean の属性を取得する操作を利用します。ドロップダウンから「Attributes > Query single Attribute」を選択すると、その方法が表示されます。
属性の取得は単純な操作なので、ヘルプ画面に示されたように、下記の URL に HTTP の GET でアクセスすれば良いわけです。
この URL も、ベーシック認証で保護されていますので、前述の方法で定義した administrator ロールを持つユーザーでアクセスすることになります。
- https://(ホスト):(ポート)/IBMJMXConnectorREST/mbeans/{objectName}/attributes/{attribute}
この URL を構成する {objectName}
は、MBean の名前のことです。次の URL にアクセスすると、その時点で利用可能な MBean の情報(objectName, クラス名、URL)がリストできます。
尚、Liberty の MBean は、該当の機能が初めて使用されるときに登録されますので、アクセスした時点で使用されていない機能の MBean はリストされません。
- https://(ホスト):(ポート)/IBMJMXConnectorREST/mbeans
> curl -s --insecure -u admin:pswd https://localhost:9443/IBMJMXConnectorREST/mbeans | jq
[
… … 省略 … …
{
"objectName": "java.lang:type=Memory",
"className": "com.ibm.lang.management.internal.ExtendedMemoryMXBeanImpl",
"URL": "/IBMJMXConnectorREST/mbeans/java.lang%3Atype%3DMemory"
},
… … 省略 … …
]
URL を構成する {attribute}
は、MBean の属性の名前で、ドキュメント等で名前と意味を確認することになります。
尚、以下の URL にアクセスすると、MBean の全ての属性をまとめて取得することができ、属性の名前も確認できます。
- https://(ホスト):(ポート)/IBMJMXConnectorREST/mbeans/{objectName}/attributes
> curl -s --insecure -u admin:pswd https://localhost:9443/IBMJMXConnectorREST/mbeans/java.lang:type=Memory/attributes | jq
[
… … 省略 … …
{
"name": "HeapMemoryUsage",
"value": {
"value": {
"committed": "65339392",
"init": "8388608",
"max": "4217110528",
"used": "54779832"
},
… … 省略 … …
{
"name": "NonHeapMemoryUsage",
"value": {
"value": {
"committed": "515547404",
"init": "429846516",
"max": "-1",
"used": "152681444"
},
… … 省略 … …
尚、Liberty や JVM の MBean の情報は、以下の URL で確認できます。
- Liberty の MBean (Liberty API)
- JVM の MBean
Non-Heap メモリーの使用量を確認する
今回は、Semeru Runtime 17 で稼働する Liberty の Non-Heap メモリーの使用量を確認します。
使用する MBean の説明
上記の実行結果で少しネタバレしていますが、Non-Heap メモリーの使用量は、java.lang:type=Memory
MBean の NonHeapMemoryUsage
属性で確認できます。
- メモリーの情報を提供する MBean の名前
java.lang:type=Memory
また、Heap および Non-Heap メモリーの詳細(内訳)は、各 MemoryPool の Usage
属性として取得できるようになっています。今回の環境に存在する MemoryPool は以下の通りです。
- Heap メモリーの MemoryPool の情報を提供する MBean の名前
java.lang:type=MemoryPool,name=nursery-allocate
java.lang:type=MemoryPool,name=nursery-survivor
java.lang:type=MemoryPool,name=tenured-SOA
java.lang:type=MemoryPool,name=tenured-LOA
- Non-Heap メモリーの MemoryPool の情報を提供する MBean の名前
java.lang:type=MemoryPool,name=class storage
java.lang:type=MemoryPool,name=JIT code cache
java.lang:type=MemoryPool,name=JIT data cache
java.lang:type=MemoryPool,name=miscellaneous non-heap storage
目的の MemoryPool が Heap なのか Non-Heap なのかは、Type
属性で確認できます。
(MBean 名のスペースを %20 でエスケープする必要があります。)
> curl -s --insecure -u admin:pswd https://localhost:9443/IBMJMXConnectorREST/mbeans/java.lang:type=MemoryPool,name=class%20storage/attributes/Type | jq
{
"value": "NON_HEAP",
"type": "java.lang.String"
}
ここでご紹介した MBean の詳細は、下記のドキュメントで確認できます。
- Semeru Runtime のドキュメント
- Java 17 のドキュメント
Non-Heap メモリーの使用量を確認してみる
MemoryPool の各 MBean から Non-Heap メモリー使用量を取得してみます。
各 MBean の Usage
属性にアクセスすると JSON 形式のデータが取得できるので、その value
だけを取り出します。(MBean 名のスペースを %20 でエスケープする必要があります。)
> curl -s --insecure -u admin:pswd https://localhost:9443/IBMJMXConnectorREST/mbeans/java.lang:type=MemoryPool,name=class%20storage/attributes/Usage | jq ".value"
{
"committed": "123015616",
"init": "83521528",
"max": "-1",
"used": "80445056"
}
> curl -s --insecure -u admin:pswd https://localhost:9443/IBMJMXConnectorREST/mbeans/java.lang:type=MemoryPool,name=JIT%20code%20cache/attributes/Usage | jq ".value"
{
"committed": "268435456",
"init": "268435456",
"max": "268435456",
"used": "11821088"
}
> curl -s --insecure -u admin:pswd https://localhost:9443/IBMJMXConnectorREST/mbeans/java.lang:type=MemoryPool,name=JIT%20data%20cache/attributes/Usage | jq ".value"
{
"committed": "8388608",
"init": "0",
"max": "402653184",
"used": "8388608"
}
> curl -s --insecure -u admin:pswd https://localhost:9443/IBMJMXConnectorREST/mbeans/java.lang:type=MemoryPool,name=miscellaneous%20non-heap%20storage/attributes/Usage | jq ".value"
{
"committed": "117735420",
"init": "94666748",
"max": "-1",
"used": "56731140"
}
同様に、java.lang:type=Memory
MBean から、Non-Heap メモリーの使用量(NonHeapMemoryUsage
属性の値)を取得してみます。
> curl -s --insecure -u admin:pswd https://localhost:9443/IBMJMXConnectorREST/mbeans/java.lang:type=Memory/attributes/NonHeapMemoryUsage | jq ".value"
{
"committed": "517584356",
"init": "446623732",
"max": "-1",
"used": "157152804"
}
当然のことではありますが、上記の結果から、java.lang:type=Memory
MBean の NonHeapMemory
属性の値が、Non-Heap MemoryPool の全 MBean の Usage
属性を合計した値にほぼ等しいことが確認できます。
蛇足となりますが、jq の処理を修正すれば、used
の値だけを抽出することも可能です。
> curl -s --insecure -u admin:pswd https://localhost:9443/IBMJMXConnectorREST/mbeans/java.lang:type=Memory/attributes/NonHeapMemoryUsage | jq ".value.used|tonumber"
154784708
ピーク値を取得する
MemoryPool の MBean には PeakUsage
属性があり、使用量のピーク値を取得することができます。(java.lang:type=Memory
MBean には、ピーク値を示す属性が無いようです。)
以下は、java.lang:type=MemoryPool,name=miscellaneous non-heap storage
MBean のピーク値を取得する例です。
> curl -s --insecure -u admin:pswd https://localhost:9443/IBMJMXConnectorREST/mbeans/java.lang:type=MemoryPool,name=miscellaneous%20non-heap%20storage/attributes/PeakUsage | jq ".value"
{
"committed": "180649980",
"init": "77889532",
"max": "-1",
"used": "117278260"
}
終わりに
Liberty の REST コネクターを使用すると、Liberty の内部状態を MBean から取得したり、MBean のメソッドを実行することで様々な操作を行うことができます。
今回は、REST コネクターを使用して、Liberty の Non-Heap メモリー(Native メモリー)の使用量を取得してみました。この情報が何かのお役に立てば幸いです。