IBM Support

WASネイティブ・ヒープのモニター方法(WAS-14-004)

Preventive Service Planning


Abstract

AIXおよびLinux上で動作するWASのネイティブ・ヒープのモニター方法を紹介します。

Content

更新ログ


(2014/04/17 10:16) "共通"にWindows上でもネイティブ・ヒープを確認できる旨を追記


WebSphere Application Server(以下、WAS)では、1アプリケーション・サーバー(=1JVM)を1つのJavaプロセスとして実行しており、Javaプロセスは稼動時にJavaヒープとネイティブ・ヒープという2つのメモリー領域を使用します。

WASのヒープをモニターする場合、Javaヒープは冗長ガーベッジコレクション、TPV、HeapDumpなどのWASの機能が提供されていますが、ネイティブ・ヒープはOSに管理されているためWASとして出力する機能は有しておらず、ツールやOSのコマンドで確認します。
この文章では、AIXおよびLinux上で動作するWASのネイティブ・ヒープのモニター方法を紹介します。


【対象環境】
対象OS:
AIX (V6.1, 7.1)
Linux


【前提】
Javaヒープとネイティブ・ヒープについて。
  • Javaヒープ

アプリケーションによって生成されるオブジェクトが格納されるメモリー領域です。
汎用JVM引数によって最小値(-Xms)と最大値(-Xmx)を指定することができ、Javaヒープはこの範囲内で増減します。
Javaヒープでは連続したメモリー領域が必要であるため、JVM起動時に他のプロセスから使用できないように最大値(-Xmx)で指定されたメモリー領域を確保します。
よって、OS から見た場合、その分のメモリーは他のプロセスでは使用できないことになります。
  • ネイティブ・ヒープ
クラスローダー、クラス、スレッド、JNI、JITコンパイルなどで使用されるメモリー領域です。
ネイティブ・ヒープは必要な分だけ領域を確保するように動作するため、Javaヒープのように最小値と最大値を設定することはできません。
プロセスで利用可能なメモリー領域からJavaヒープで確保されたメモリー領域(-Xmx)を除いた範囲内で増減します。


【詳細】
各OSにおけるネイティブ・ヒープのモニター方法は以下の通りです。

AIX
AIX環境においてヒープのメモリー使用量を確認する場合には、svmon コマンドを使用します。
Java ヒープは mmap() メソッドまたは shmat() メソッドを使用して割り振られ、ネイティブ・ヒープは malloc() により割り振られます。
出力結果の "Type" および "Description" フィールドを確認することで、各セグメントがどちらのヒープに割り当てられたかを判別することが可能です。
上記フィールドの出力内容はビット数によって異なり、それぞれ以下のセグメントから算出可能とされています。
  • 32ビットの場合

ネイティブ・ヒープ
Type   Description
-------------------------------
work   process private
work   working storage

Javaヒープ
Type   Description
-------------------------------
work   mmap source
mmap   maps <number> source(s)

・64bit

ネイティブ・ヒープ
Type   Description
-------------------------------
work   text data BSS heap
-      process private
-      working storage

Java ヒープ
Type   Description
-------------------------------
work   mmap source
-      default shmat/mmap
-      mapped to sid <number>
-      extended shm segments


svmon コマンドにて、ヒープ確認に有効なフラグとオプションは以下のものがあります。


[フラグ]

-P フラグ

指定したプロセスのメモリー使用率情報を取得することができます。
svmon -P <プロセスID>

-S フラグ

指定したセグメントのメモリー使用率情報を取得することができます。
svmon -S <セグメントID>

-O <options> フラグ

<options> パラメーターに有効値を指定することで、レポートの内容と表示を変更することができます。

mpss=on

混在するページ・サイズ・セグメントの値を個別のページ・サイズに分類します。
svmon -P <プロセスID> -O mpss=on

range=on

割り当てられているセグメント内のページの範囲を表示します。
svmon -P <プロセスID> -O range=on

mapping=on

セグメントが関連付けられたソース・セグメントを取得することができます。
svmon -P <プロセスID> -O mapping=on


[オプション]

-l オプション

セグメントのより詳細な情報を表示します。
svmon -P <プロセスID> -l

-r オプション

セグメントで使用されているメモリーの範囲を表示します。前述の -O フラグの range=on と同様とレポートを表示します。
svmon -S <セグメントID> -r

-m オプション

セグメントが関連付けられたソース・セグメントを表示します。前述の -O フラグの mapping=on と同様とレポートを表示します。
svmon -S <セグメントID> -m


実行例

プロセスID 553050 のメモリー使用量を確認した例です。
(AIX V6.1 64ビットで実施)


      (WAS14004Fig1.png)

ネイティブ・ヒープに割り振られたメモリー使用量

"Type" および "Description" を確認し、ネイティブ・ヒープに該当するセグメントのメモリー使用量を計算します。
"Inuse" の値に "PSize" を掛けた値がセグメントのメモリー使用量です。

40af6 -> m * 3084 = 64 KB * 3084 = 197376 KB
39fc8 -> m * 5 = 64 KB * 5 = 320 KB
5b37d -> m * 2 = 64 KB * 2 = 128 KB

上記の値を合計した 197824 KB がネイティブ・ヒープのメモリー使用量となります。

なお、"PSize" が "sm" となっている場合、"PSize"は 4 KB として計算します。
svmon コマンドの実行時に -O mpss=on または -l オプションを指定することで、"s" と "m" を分けて表示することも可能です。


    (WAS14004Fig2.png)

なお、-O mpss=on-l オプションの有無により結果は変わりません。
37eea のセグメントに注目した場合の計算結果は、以下の通りです。
  • -l オプションを指定しなかった場合

sm * 12759 = 4 KB * 12759 = 51036 KB
  • -l オプションを指定した場合

s * 6279 = 4 KB * 6279 = 25116 KB
m * 405 = 64 KB * 405 = 25920 KB
25116 KB + 25920 KB = 51036 KB


Javaヒープに割り振られたメモリー使用量

svmon -P <プロセスID> では、mmap に割り振られたメモリー使用量は取得できません。
そのため -O mapping=on もしくは -m にて対象セグメントに関連付けられたソース・セグメントのメモリー使用量を確認する必要があります。

Javaヒープに割り振られたメモリーはGCログ、PMIにて確認可能であるため、この文章では割愛いたします。


Linux

Linux環境においてヒープのメモリー使用量を確認する場合には、ps コマンドを使用します。
以下のオプションを指定して ps コマンドを実行することでプロセスが使用している仮想メモリーのサイズを取得することが可能です。

[オプション]

-p <プロセスIDリスト> オプション

ps コマンドの出力対象プロセスIDを指定します。
カンマ区切りで複数のプロセスIDを指定することが可能です。

-o <フォーマット> オプション

フォーマットに vsz を指定することで仮想メモリーの使用量をキロバイト単位で表示します。
カンマ区切りで複数のフォーマットを指定することが可能です。

実行例

プロセスID 4422,13342 のメモリー使用量を確認した例です。

# ps -p 4422,13342 -o pid,vsz
 PID  VSZ
4422 780544
13342 512184

ps コマンドで得られるのは、プロセス全体のメモリー使用量です。
ネイティブ・ヒープの使用量は「ps -p <プロセスID> -o vsz から -Xmx」になります。

なお、上記コマンドの出力結果は、IBM Support Assitant(ISA)の Garbage Collection and Memory Visualizer(GCMV)にてグラフ化することが可能です。
GCMVについては、以下のリンクをご参照ください。

WAS V8.0 によるWebシステム基盤設計ワークショップ資料 「[pdf] JVM設計」のP.38~

3. GCMVを使用したverbosegc解析方法

共通

svmon コマンドや ps コマンド以外では、以下の方法でネイティブ・ヒープを確認することが可能です。
これらの方法は、AIX/Linuxだけでなく、Windows上でもネイティブ・ヒープを確認できます。
  • Health Center を利用する

Health Center については、以下の利用ガイドをご参照ください。

developerWorks 日本語版 > テクニカル・トピックス > WebSphere
Health Center 利用ガイド
  • Javaダンプを利用する (Java6 build 2.6、Java 7 以降)

Java 6 build 2.6、また Java 7 より、ネイティブ・メモリーの使用量の情報を、Java ダンプで得られるようになりました。
詳細につきましては、以下の資料をご参照ください。

developerWorks > Technical topics > Java technology
IBM developer kits
Documentation downloads
[pdf] User guides in PDF format - AIX (P.10、P.328、P.503、P.511)
[pdf] User guides in PDF format - Linux (P.11、P.339、P.513、P.521)


【参考文献】
AIX Native Memory Problem Determination Techniques and Tools for WebSphere Application Server
IBM Monitoring and Diagnostic Tools for Java - Garbage Collection and Memory Visualizer Version 2.7
メモリーよ、ありがとう

developerWorks 日本語版 > テクニカル・トピックス > WebSphere
WebSphere Application Server V7.0によるWebシステム基盤設計ワークショップ資料 「JVM設計 -参考-」
WAS V8.0 によるWebシステム基盤設計ワークショップ資料 「JVM設計」

Diagnostics Guide for IBM SDK, Java Technology Edition, Version 6
Monitoring the native heap
svmon

IBM SDK, Java Technology Edition バージョン 7 の AIX ユーザーズ・ガイド
ネイティブ・ヒープのモニター
svmon

IBM AIX 6.1 インフォメーション・センター
プロセスごとのメモリー使用量
svmon コマンド
ps コマンド

IBM AIX 7.1 インフォメーション・センター
プロセスごとのメモリー使用量
svmon コマンド
ps コマンド


以上

[{"Product":{"code":"SSEQTP","label":"WebSphere Application Server"},"Business Unit":{"code":"BU053","label":"Cloud & Data Platform"},"Component":"Not Applicable","Platform":[{"code":"PF002","label":"AIX"},{"code":"PF016","label":"Linux"}],"Version":"All Versions","Edition":"","Line of Business":{"code":"LOB45","label":"Automation"}}]

Historical Number

505900E94D4C56EA49257CA8001D2B3C

Product Synonym

対象システム:WebSphere Application Server

Document Information

Modified date:
17 June 2018

UID

jpn1J1011671