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 から見た場合、その分のメモリーは他のプロセスでは使用できないことになります。
- ネイティブ・ヒープ
ネイティブ・ヒープは必要な分だけ領域を確保するように動作するため、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
Was this topic helpful?
Document Information
Modified date:
17 June 2018
UID
jpn1J1011671