...

HP-UX PA-RISC から HP-UX Integrity サーバへの移行に 伴うメモリ

by user

on
Category: Documents
6

views

Report

Comments

Transcript

HP-UX PA-RISC から HP-UX Integrity サーバへの移行に 伴うメモリ
HP-UX PA-RISC から HP-UX Integrity サーバへの移行に
伴うメモリ使用量算出について
White paper
目次
はじめに ............................................................................................................................................. 2
1. 仮想アドレス空間とテキストのメモリ使用量 ........................................................................................... 3
1.1 glance コマンドの使用方法 (対話モード) ........................................................................................ 4
1.2 glance コマンドの使用方法 (アドバイザ専用モード) .......................................................................... 6
2. プログラム ファイル内の初期化済みデータのサイズ............................................................................... 8
詳細情報 .......................................................................................................................................... 12
はじめに
他のプラットフォーム向けに開発されたアプリケーションを HP-UX Integrity サーバに移行すると、コードとデータの
サイズが増加することがあります。ホワイト ペーパー『HP-UX Integrity サーバへの移行に伴うメモリ使用量の変化
(Memory Usage on HP-UX Integrity Servers - Version 1.1 (February 15, 2006))』 (「詳細情報」参照) では、この
現象が発生する原因について説明しています。また、移行に伴うサイズの増加量を予測する方法についても、ガイ
ドラインをいくつか提示していますが、具体的な手順やユーティリティへの言及はありません。本書は、HP-UX
Integrity サーバへの移行に伴い、サイズの増加量の予測に必要となるデータを効果的に収集し、解釈するために
役立つ情報を提供することを目的としています。本書の内容を十分に理解し、活用していただくためにも、『HP-UX
Integrity サーバへの移行に伴うメモリ使用量の変化』を一読し、内容を理解しておくことを強くお勧めします。
本書は、次の各項から構成されています。
• 第 1 項、「仮想アドレス空間とテキストのメモリ使用量」では、HP-UX におけるプロセスの仮想アドレス空間の概
要を示し、GlancePlus ツールの機能を使用して、プロセスのテキスト (= コード、命令) に割り当てられる物理メモ
リの容量を調べる方法を説明します。
『HP-UX Integrity サーバへの移行に伴うメモリ使用量の変化』でも述べているように、コードの増加を考慮するに
は、最初に既存システムの通常のワークロードで、メモリ内作業セットに占めるコンパイル済みコードのサイズを
調べ、その値がアップグレード後におよそ 80% 大きくなるものと想定しておきます。
• 第 2 項、「プログラム ファイル内の初期化済みデータのサイズ」では、プログラム ファイル内の初期化済みデー
タ部分のサイズを、size コマンドで調べる方法を説明します。Integrity システム用のコンパイラのオプション設
定やバージョンの違いが、初期化済みデータのサイズに与える影響を示す例も紹介しています。
『HP-UX Integrity サーバへの移行に伴うメモリ使用量の変化』でも述べているように、必要となるメモリの増加量
は、PA-RISC アプリケーション バイナリのデータ セグメントのサイズを Itanium 版バイナリの場合と比較し、その
差分に予想されるプロセス数を掛けることによって見積もることができます。
第 1 項では、次の条件がすべて満たされていることを前提としています。
• 「既存システム」は PA-RISC であること
• アプリケーションがページングやスワッピングに妨げられることなく、自身のコードとデータに最適な量の物理メモ
リを割り当てることができるように、既存システムが適切に設定されていること
• 既存システムで動作しているアプリケーションのコードが、複数のプロセス間で共有されていること。テキスト セ
グメントが非共有のアドレス空間モデル (EXEC_MAGIC など) は考慮しません。そのような特殊なケースは
GlancePlus ツールにより、標準タイプ (TEXT/Shared) とは異なるタイプ (TEXT/Priv) として、区別して表示さ
れます。
第 1 項で紹介している例と画面表示は、64 ビット PA-RISC プロセッサで動作している HP-UX 11i v1 システムの
ものです。ただし、GlancePlus ツールのさまざまな機能の使用方法や、コードに割り当てられる物理メモリ量を調べ
る方法は、次の環境でも同様です。
• 32 ビット PA-RISC で動作している HP-UX 11i v1
• 64 ビット PA-RISC (または Integrity) で動作している HP-UX 11i v2
2
1. 仮想アドレス空間とテキストのメモリ使用量
HP-UX で実行されているプロセスの仮想アドレス空間は、テキスト、データ、スタックなど、さまざまな種類の仮想ア
ドレス セグメントから構成されており、そのプロセスの仮想アドレス空間全体に、次の図のように割り当てられてい
ます。仮想アドレス セグメントは、「メモリ領域」とも呼ばれます。図の左側の仮想アドレスは、PA-RISC で実行され
ている 64 ビット プロセスから得られた例です。
0x0000000000000000
0x4000000000000000
プロセスのテキスト セグメント
0x4000000000003000
0x8000000100000000
プロセスのデータ セグメント
malloc()
brk()
0x8000000100510000
0x800003ffbffcb000
共有ライブラリ データ
(例: libc.2)
mmap()
0x800003ffbffda000
0x800003ffbfff0000
プロセスのスタック セグメント
0x800003ffc0000000
0xc000000000100000
0xc00000000021c000
共有ライブラリ テキスト
(例: libc.2)
mmap()
共有メモリ セグメント
shmat()
0xc00000000041c000
0xffffffffffffffff
プロセスが brk() システム コールの実行や malloc() などのライブラリ ルーチンの呼び出しによって仮想メモ
リを割り当てると、仮想アドレス空間内でアドレスの値が大きい方向 (図では下の方向) に向かってデータ セグメン
トが拡張されます。プロセスは、mmap() や shmat() などのシステム コールを実行することにより、自身の仮想
アドレス空間内に新しいメモリ領域を作成できます。たとえば、ダイナミック ローダは mmap() を使用して、共有ラ
イブラリのテキストとデータをプロセスの仮想アドレス空間内にマッピングします。プロセスは shmat() システム コ
ールを使用することにより、共有メモリ セグメントにアタッチできます。
メモリ領域によって、プロセスがアクセスできる仮想アドレスの範囲が決まります。ただし、プロセスは通常、その存
続期間内に、自身の仮想アドレス空間内に存在する各メモリ領域内のすべての仮想アドレスにアクセスするわけで
はありません。したがって、メモリ領域に割り当てられる物理メモリ量は、その仮想サイズより小さくなる場合があり
ます。また、HP-UX のカーネルが一時的なメモリ リソース不足により、領域に割り当てられた物理メモリを解放する
可能性もあります。このことも、メモリ領域に割り当てられる物理メモリ量が、仮想サイズより小さくなる理由の 1 つ
です。
glance と gpm は、プロセスのメモリ領域を調べるためのプログラムです。これらのプログラムを使用すると、領域
の仮想サイズ、領域に割り当てられている物理メモリの量などの情報を得ることができます。glance はキャラクタ
モードのユーザ インタフェース、gpm は Motif ベースの GUI を提供します。どちらのプログラムも、GlancePlus ツ
ールの一部です。詳細については、『GlancePlus Overview and Features』および glance(1)、gpm(1) を参照
3
してください。以降では、glance コマンドを対話モードおよびアドバイザ専用モードで使用して、プロセスのメモリ
領域を調べる方法を紹介します。
1.1 glance コマンドの使用方法 (対話モード)
コマンド ライン オプションをいっさい指定せずに glance コマンドを入力すると、デフォルトの Process List 画面が
表示されます。この画面でプロセスを選択するには "s" (小文字) を入力します。すると、プロセス ID (PID) の入力
を求められます。PID を入力すると、Process Resources 画面が表示されます。この画面で "M" (大文字) を入力す
ると、以下に示すような Process Memory Regions 画面に切り替わります。glance が 1 画面に表示できるメモリ
領域の数は、glance を実行しているターミナル ウィンドウの種類に左右されます。プロセスの全メモリ領域を 1
つの画面で表示できない場合は、"f" または "b" (小文字) を入力することにより、画面を上下にスクロールできま
す。"f" は 1 ページ先、"b" は 1 ページ前にそれぞれスクロールします。別のプロセスを選択するには、小文字の
"s" を再入力します。
前ページの図には、メモリ領域のサブセットだけを示しました。前ページの図に示した各領域には、分かりやすいよ
うに左側にアスタリスク (*) を付けています。
B3692A GlancePlus C.04.50.00
06:07:11 ........ 9000/800
Current Avg High
-------------------------------------------------------------------------------CPU Util
S
| 1%
1%
5%
Disk Util
F
| 1%
1%
1%
Mem Util
S
SU
UB
B
| 51%
51%
51%
Swap Util
U UR R
| 10%
10%
10%
-------------------------------------------------------------------------------Memory Regions PID:
379, example
PPID: 29883 euid: 10284 User: ........
*
*
*
*
*
*
Type
RefCt
RSS
VSS
Locked File Name
-------------------------------------------------------------------------------NULLDR/Shared
95
4kb
4kb
0kb <nulldref>
TEXT /Shared
2
12kb
12kb
0kb /var/tmp/test/example
UAREA /Priv
1
32kb
32kb
0kb <uarea>
DATA /Priv
1
3.2mb
5.1mb
0kb /var/tmp/test/example
MEMMAP/Priv
1
4kb
4kb
0kb /opt/.../libogltls.2
MEMMAP/Priv
1
8kb
8kb
0kb <mmap>
MEMMAP/Priv
1
4kb
4kb
0kb /usr/lib/pa20_64/libdl.1
MEMMAP/Priv
1
60kb
60kb
0kb /usr/lib/pa20_64/libc.2
MEMMAP/Priv
1
20kb
52kb
0kb <mmap>
MEMMAP/Priv
1
8kb
8kb
0kb <mmap>
MEMMAP/Priv
1
20kb
20kb
0kb /usr/lib/pa20_64/dld.sl
MEMMAP/Priv
1
8kb
8kb
0kb <mmap>
STACK /Priv
1
12kb
64kb
0kb <stack>
MEMMAP/Shared
2
180kb
252kb
0kb /usr/lib/pa20_64/dld.sl
MEMMAP/Shared
2
4kb
8kb
0kb /usr/lib/pa20_64/libdl.1
MEMMAP/Shared
2
4kb
4kb
0kb /opt/.../libogltls.2
MEMMAP/Shared
2
1.1mb
1.1mb
0kb /usr/lib/pa20_64/libc.2
SHMEM /Shared
2
1.0mb
2.0mb
0kb <shmem>
Text RSS/VSS: 12kb/ 12kb
Shmem RSS/VSS:1.0mb/2.0mb
Data RSS/VSS:3.2mb/5.1mb
Other RSS/VSS:1.4mb/1.6mb
Stack RSS/VSS: 12kb/ 64kb
Process Memory Regions 画面は、Type、RefCt、RSS、VSS、Locked、File Name の 6 つの列から構成され
ています。GlancePlus ツールでは、これらの列を「メトリック」と呼ぶこともあります。小文字の "h" を入力して画面
を glance のオンライン ヘルプに切り替え、[Current Screen Metrics] を選択すると、より詳しい説明が表示され
ます。これらの列 (メトリック) について、以下に概要を示します。
Type 列は、2 つのメトリックから構成されています。1 つはメモリ領域の種別 (テキスト、データ、スタックなど)、もう
1 つは領域が複数のプロセス間で共有されているか、1 つのプロセス専用の非共有領域であるかを示すタグです。
共有領域に割り当てられた物理メモリは、その領域を自身の仮想アドレス空間にマッピングしているすべてのプロ
セス間で共有されます。RefCt 列には、領域を共有しているプロセスの数が表示されます (選択しているプロセス
を含む)。
種別が TEXT/Shared の領域はプロセスのテキスト セグメントです。前述したように、共有ライブラリのテキストと
データは、mmap() システム コールによってプロセスの仮想アドレス空間にマッピングされます。したがって、種別
が MEMMAP/Shared の領域は、File Name 列の内容が共有ライブラリのイメージ ファイルを指している場合、
共有ライブラリ テキスト領域になります。File Name 列には、ファイル名の代わりに i ノード番号が表示されるこ
ともあります。その場合の対応方法については、glance オンライン ヘルプの Process Memory Regions 画面のメ
トリックに関する部分を参照してください。
4
RSS 列は領域に実際に割り当てられている物理メモリの量、VSS 列は領域の仮想サイズを示しています。この例
で は libc.2 の 共 有 ラ イ ブ ラ リ テ キ ス ト が 、 仮 想 ア ド レ ス 空 間 内 の 0xc000000000100000 ~
0xc00000000021c000 の 範 囲 に マ ッ ピ ン グ さ れ て い ま す 。 し た が っ て 、 こ の 領 域 の 仮 想 サ イ ズ は
0xc00000000021c000 - 0xc000000000100000 = 0x11c000 バイト = 1.1 MB (VSS) になります。glance
の出力画面に表示されているように、この領域に割り当てられている物理メモリの量も 1.1 MB (RSS) です。
具体的な使用方法
サーバ上で動作しているアプリケーションのプロセスが、さまざまな実行可能プログラム ファイルの小さな集まりで
あるインスタンスの場合、そのアプリケーションのコードに割り当てられている物理メモリの量を調べる手段として、
glance コマンドの対話モードが役立ちます。
たとえば、アプリケーションが Px、Py、Pz という 3 つのサーバ プログラムで構成されており、Px と Py がライブラ
リ Lxy、Py と Pz がライブラリ Lyz、Px、Py、Pz がライブラリ Lxyz をそれぞれ共有するとします。この場合、サ
ーバがこれらの 3 つのプログラムのインスタンスを多数動作させている場合、次の図に示すように Px、Py、Pz の
いずれのプロセスについても 1 つのインスタンスのメモリ領域を調べれば、割り当てられているメモリの量が分かり
ます。
プロセス Px
プロセス Py
プロセス Pz
Px のテキスト
RSS 0.5 MB
Py のテキスト
RSS 1.0 MB
Pz のテキスト
RSS 1.5 MB
Lxy のテキスト
RSS 2.0 MB
Lxy のテキスト
Lxyz のテキスト
RSS 3.0 MB
Lyz のテキスト
RSS 2.5 MB
Lyz のテキスト
Lxyz のテキスト
Lxyz のテキスト
したがって、プログラムと共有ライブラリのテキストに割り当てられている物理メモリの合計量は、次の式で計算でき
ます。
RSS(Px) + RSS(Py) + RSS(Pz) + RSS(Lxy) + RSS(Lyz) + RSS(Lxyz) =
0.5 MB + 1.0 MB + 1.5 MB + 2.0 MB
+ 2.5 MB
+ 3.0 MB
= 10.5 MB
Integrity サーバへの移行に伴う増加量の見積もり
『HP-UX Integrity サーバへの移行に伴うメモリ使用量の変化』で指摘しているように、通常、アプリケーションのコー
ド サイズは、データ サイズに比べると小さく、コード サイズの増加がシステムによるメモリの扱いに与える影響は
ほんのわずかです。標準的なプログラミング モデルでは、コンパイル済みコードをプロセス間で共有できるため、1
台のサーバ上であるアプリケーションが 1,000 個のプロセスを実行する場合でも、メモリにロードするコードは 1
個ですみます。一方、データについてはプロセス数と同じく 1,000 個のコピーをロードする必要があります。サーバ
の通常のワークロードでは、メモリ内のすべてのアクティブなページに占めるコードの割合は、5% 程度に過ぎませ
ん。コード サイズが 80% 増加したと仮定しても、移行に伴うメモリ使用量の増加はほんの 4% です。
過去の例から、コード サイズの増加によるメモリ使用量の増加はおよそ 80% と想定できます。たとえば、既存シス
テムのコードが 10.5 MB のメモリを消費している場合、移行後のコードのメモリ使用量は次の式で計算できます。
10.5 MB + (0.8 * 10.5 MB) = 18.9 MB
5
1.2 glance コマンドの使用方法 (アドバイザ専用モード)
次のアドバイザ構文スクリプトは、PROCESS LOOP 文と PROC_REGION LOOP 文を使用して、特定のプロセス
(この例では PID 379) のメモリ領域を調べます。PROCESS LOOP は、アクティブなすべてのプロセスを対象に繰
り返し実行されます。IF 文でプロセス ID が一致すると見出しが出力され、当該プロセスのすべてのメモリ領域を
対象に、PROC_REGION LOOP が繰り返し実行されます。各領域に、次のメトリックが出力されます。
• PROC_REGION_TYPE, PROC_REGION_PRIVATE_SHARED_FLAG
Process Memory Regions 画面の Type 列に相当します。
• PROC_REGION_RES, PROC_REGION_FILENAME
Process Memory Regions 画面の RSS 列と File Name 列に相当します。
PRINT 文により、結果が stdout (標準出力) に出力されます。
$ cat mregions.syn
PROCESS LOOP
{
IF PROC_PROC_ID == 379 THEN
#
^^^ the PID of the process to be examined
{
PRINT ""
PRINT "Memory Regions PID:", PROC_PROC_ID, ", ", PROC_PROC_NAME
PRINT ""
PRINT "Type
RSS
File Name"
PRINT "----------------------------------------",
"----------------------------------------"
PROC_REGION LOOP
{
PRINT PROC_REGION_TYPE, "/", PROC_REGION_PRIVATE_SHARED_FLAG, " ",
PROC_REGION_RES, "
", PROC_REGION_FILENAME
}
}
}
アドバイザ構文についての詳細は、『アドバイザ リファレンス ガイド (Adviser Reference Guide)』 (「詳細情報」参
照) および glance のオンライン ヘルプを参照してください。
次のコマンド ラインは glance をアドバイザ専用モード (対話ダイアログなし) で起動します。glance は起動後、
mregions.syn ファイル内のアドバイザ構文スクリプトを 2 回、繰り返し実行して終了します。スクリプトは最初に
実行された後、60 秒間待機して再度実行されます。
$ glance -adviser_only -syntax mregions.syn -iterations 2 -j 60
コマンド ライン オプションについては、glance(1) を参照してください。
アドバイザ構文スクリプト mregions.syn の出力は、対話モードの Process Memory Regions 画面に似ています。
ただしスクリプトの出力には、アプリケーションのコードに割り当てられている物理メモリの量を調べるのに特に関係
のない RefCt 列、VSS 列、および Locked 列は含まれません。次の出力例は、繰り返し実行されるスクリプトの
1 回目の出力部分だけを示しています。2 回目の出力部分は省略しており、その箇所を省略記号 ([...]) で示し
ています。また、3 ページの図で示した各領域には、分かりやすいように左側にアスタリスク (*) を付けています。
6
Memory Regions PID:
*
*
*
*
*
*
379, example
Type
RSS
File Name
-------------------------------------------------------------------------------NULLDR/Shared
4kb
<nulldref>
TEXT /Shared
12kb
/var/tmp/test/example
UAREA /Priv
32kb
<uarea>
DATA /Priv
3.2mb
/var/tmp/test/example
MEMMAP/Priv
4kb
/opt/graphics/OpenGL/lib/pa20_64/libogltls.2
MEMMAP/Priv
8kb
<mmap>
MEMMAP/Priv
4kb
/usr/lib/pa20_64/libdl.1
MEMMAP/Priv
60kb
/usr/lib/pa20_64/libc.2
MEMMAP/Priv
20kb
<mmap>
MEMMAP/Priv
8kb
<mmap>
MEMMAP/Priv
20kb
/usr/lib/pa20_64/dld.sl
MEMMAP/Priv
8kb
<mmap>
STACK /Priv
12kb
<stack>
MEMMAP/Shared
176kb
/usr/lib/pa20_64/dld.sl
MEMMAP/Shared
4kb
/usr/lib/pa20_64/libdl.1
MEMMAP/Shared
4kb
/opt/graphics/OpenGL/lib/pa20_64/libogltls.2
MEMMAP/Shared
1.1mb
/usr/lib/pa20_64/libc.2
SHMEM /Shared
1.0mb
<shmem>
[...]
glance コマンドのアドバイザ専用モードは、調査するプロセスの数によっては、対話モードより有効な場合があり
ます。前ページに示したアドバイザ構文スクリプトには、調査するプロセスの PID を適宜変更するように指示するコ
メント行があります。ただし、存続期間が短いプロセスの場合は、スクリプトが検出する前にプロセスが終了する可
能性があるため、このスクリプトが適用できない場合もあります。
コードに割り当てられている物理メモリの量を調べる具体的な方法は、「1.1 glance コマンドの使用方法 (対話モー
ド)」の 5 ページに示した方法と基本的に同じです。
7
2. プログラム ファイル内の初期化済みデータのサイズ
『HP-UX Integrity サーバへの移行に伴うメモリ使用量の変化』で説明しているように、定数ポインタ配列の使用はプ
ログラムのデータ サイズを増加させる原因になり、Integrity サーバへのアプリケーションの移行においても、物理メ
モリの使用量の増加につながります。また、具体例として Oracle サーバのバージョン 9i および 10gR1 を挙げて
いますが、その他のアプリケーションでも同様の影響が生じる可能性があります。次の組み合わせで初期化済みデ
ータのサイズを比較すれば、具体的にどの程度の影響があるかを把握できます。
• PA-RISC 用の 32 ビット プログラム ファイルと、それを Integrity に移行した 32 ビット プログラム ファイル
• PA-RISC 用の 64 ビット プログラム ファイルと、それを Integrity に移行した 64 ビット プログラム ファイル
プログラムのデータ サイズの比較には、size コマンドが非常に有効です。size コマンドは、PA-RISC (HP-UX 11i
v1/11i v2)、Integrity (HP-UX 11i v2) のいずれのプラットフォームでも、オブジェクト ファイルの種類 (32 ビット、
64 ビット) と形式 (SOM、ELF) を問わず使用できます。オブジェクト ファイルの形式については、a.out(4) を参
照してください。
size コマンドの出力には 4 つの数値が含まれています。テキスト、初期化済みデータ、BSS の各サイズ、および
これらの合計です (BSS はオブジェクト ファイル内では初期化されず、実行時にはゼロで充填されます)。
$ size example
4944 +
1048768
+ 2097184 = 3150896
初期化済みデータのサイズ、 PA-RISC と Integrity を比較
オブジェクト ファイルの内容を調べる場合は、odump コマンド (SOM 形式) や elfdump コマンド (ELF 形式) も使
用できます。詳細は odump(1) および elfdump(1) を参照してください。
『HP-UX Integrity サーバへの移行に伴うメモリ使用量の変化』で説明しているように、Itanium システム版 HP-UX
C/C++ コンパイラの A.06.10 以降のリリースでは、プログラム ファイル内で読み取り専用として扱われる可能性
があるポインタを含むすべてのデータが、条件付きの読み取り専用データ セクションに配置されます。このポインタ
は、リンカによって読み取り専用データとともにプログラム ファイル内に、または書き込み可能なデータとともに共
有ライブラリ内に配置されます。同リリースより前の Itanium システム版 HP-UX コンパイラでは、–exec オプション
または –minshared オプション付きでコンパイルする場合のみ、定数データが読み取り専用セクションに配置さ
れます。
次に、C のサンプル プログラムを通じて、Integrity システム版のコンパイラのオプションとバージョンによる、プログ
ラム ファイルにおける定数ポインタ配列の配置の違いを示します。この C プログラムは、次の 2 つのソース ファイ
ルから構成されています。
• array_subr.c
const pointers[256*1024] 配列と、その仮想アドレスを返す array_addr() 関数の定義を含むソース
ファイル
• array_main.c
main() 関数を含むソース ファイル。main() は array_addr() を呼び出し、戻り値を出力
8
$ cat array_subr.c
const char * const pointers[256*1024] = {
"string of characters 1",
"string of characters 2",
"string of characters 3"
};
char **array_addr()
{
return((char **)pointers);
}
$ cat array_main.c
char **array_addr();
main()
{
printf("virtual address of constant pointer array : 0x%p\n", array_addr());
}
次の例では +DD64 コンパイラ オプションを指定して、ポインタ サイズが 8 バイトの 64 ビット オブジェクトを作成
します。ポインタ配列は 256 * 1,024 個のエントリから構成されています。したがって、配列のサイズは 256 *
1,024 * 8 バイト = 2,097,152 バイト (0x200000) になります。
–v オプションと –x オプションを指定した場合、size コマンドはオブジェクト ファイル内の各セクションの詳細リスト
を出力します (数値は 16 進で表されます)。これらのコマンド ライン オプションについては、size(1) を参照して
ください。次の出力例は、関連するセクションだけを示しています。関係のないセクションは省略し、その箇所を省略
記号 ([...]) で示しています。
HP-UX 11i v2 でバージョン A.06.10 のコンパイラを使用する場合
ソース ファイル array_subr.c を単独でコンパイルします。バージョン A.06.10 のコンパイラは、デフォルトで
はポインタ配列を、生成するオブジェクト ファイル array_subr.o 内の専用セクション .rodata_cond 内に配
置します。このオブジェクト ファイルは、リンクしてプログラム ファイルの生成に使用できるほか、共有ライブラリに
することもできます。
$ cc array_subr.c +DD64 -V -c
cc: HP aC++/ANSI C B3910B A.06.10 [Mar 22 2006]
$ size -v -x array_subr.o
Section
Size
Virtual Address
[...]
.rodata_cond
[...]
0x200000
0x0
ソース ファイル array_main.c を単独でコンパイルします。生成されるオブジェクト ファイルを array_subr.o
とリンクして、プログラム ファイル array を作成します。ポインタ配列はリンカにより、プログラム ファイル内の専
用セクション .rodata_cond に配置されます。このセクションは実行時にプロセスのテキスト セグメントの一部に
なるため、プログラムのすべてのインスタンス間で共有されます。テキストのサイズは 2,100,576 バイトです。つま
り、テキスト部分の大半をポインタ配列が占めます。初期化済みデータは 96 バイトに過ぎません。
9
$ cc array_main.c array_subr.o +DD64 -V -o array
cc: HP aC++/ANSI C B3910B A.06.10 [Mar 22 2006]
ld: 92453-07 linker ld HP Itanium(R) B.12.33 IPF/IPF
$ size array
2100576 + 96 + 32 = 2100704
$ size -v -x array
Section
Size
Virtual Address
[...]
.rodata_cond
[...]
0x200000
0x4000000000000be0
$ ./array
virtual address of constant pointer array : 0x4000000000000be0
次の例では、–b オプションを指定してリンカを実行することにより、同じオブジェクト ファイル array_subr.o から
共有ライブラリ array.so を生成しています。この場合、ポインタ配列はリンカにより、生成されるライブラリの初
期化済みデータ部分に配置されるため、このライブラリを実行時に使用するプロセス間では共有されません。初期
化済みデータのサイズは 2,097,160 バイトです。つまり、初期化済みデータの大部分をポインタ配列が占めます。
$ ld array_subr.o -V -b -o array.so
ld: 92453-07 linker ld HP Itanium(R) B.12.33
IPF/IPF
$ size array.so
1664 + 2097160 + 24 = 2098848
HP-UX 11i v2 でバージョン A.06.00 のコンパイラを使用する場合
ソース ファイル array_subr.c を単独でコンパイルします。バージョン A.06.00 のコンパイラは、デフォルトで
はポインタ配列を、生成するオブジェクト ファイル array_subr.o 内の .data セクション内に配置します。
$ cc array_subr.c +DD64 -V -c
cc: HP aC++/ANSI C B3910B A.06.00 [Aug 25 2004]
$ size -v -x array_subr.o
Section
Size
Virtual Address
[...]
.data
[...]
0x200000
0x0
ソース ファイル array_main.c を単独でコンパイルします。生成されるオブジェクト ファイルを array_subr.o
とリンクして、プログラム ファイル array を作成します。ポインタ配列はリンカにより、プログラム ファイル内
の .data セクション内に配置されます。このセクションは実行時にプロセスのデータ セグメントの一部になります。
したがって、このプログラムのインスタンス間では共有されません。テキストのサイズは 3,360 バイトに過ぎません。
初期化済みデータは 2,097,248 バイトであるため、ポインタ配列が初期化済みデータの大部分を占めます。
$ cc array_main.c array_subr.o +DD64 -V -o array
cc: HP aC++/ANSI C B3910B A.06.00 [Aug 25 2004]
ld: 92453-07 linker ld HP Itanium(R) B.12.23 PBO 040721 (IPF/IPF)
$ size array
3360 + 2097248 + 32 = 2100640
$ size -v -x array
Section
Size
Virtual Address
[...]
.data
[...]
0x200040
0x6000000000000000
$ ./array
virtual address of constant pointer array : 0x6000000000000040
10
HP-UX 11i v2 でバージョン A.06.00 のコンパイラを –exec オプション指定で使用する場合
ソース ファイル array_subr.c を単独でコンパイルします。-exec オプションを指定すると、バージョン
A.06.00 のコンパイラはポインタ配列を、生成されるオブジェクト ファイル array_subr.o の .rodata セクシ
ョン内に配置します。このオブジェクト ファイルは、リンクしてプログラム ファイルの生成に使用できますが、共有ラ
イブラリにすることはできません。
$ cc array_subr.c +DD64 -exec -V -c
cc: HP aC++/ANSI C B3910B A.06.00 [Aug 25 2004]
$ size -v -x array_subr.o
Section
Size
Virtual Address
[...]
.rodata
[...]
0x200060
0x0
ソース ファイル array_main.c を単独でコンパイルします。生成されるオブジェクト ファイルを array_subr.o
とリンクして、プログラム ファイル array を作成します。ポインタ配列はリンカにより、プログラム ファイル内
の .rodata セクション内に配置されます。このセクションは実行時にプロセスのテキスト セグメントの一部になる
ため、プログラムのすべてのインスタンス間で共有されます。テキストのサイズは 2,100,528 バイトです。つまり、
テキストの大部分をポインタ配列が占めます。初期化済みデータは 88 バイトに過ぎません。
$ cc array_main.c array_subr.o +DD64 -V -o array
cc: HP aC++/ANSI C B3910B A.06.00 [Aug 25 2004]
ld: 92453-07 linker ld HP Itanium(R) B.12.23 PBO 040721 (IPF/IPF)
$ size array
2100528 + 88 + 32 = 2100648
$ size -v -x array
Section
Size
Virtual Address
[...]
.rodata
[...]
0x200060
0x4000000000000b20
$ ./array
virtual address of constant pointer array : 0x4000000000000b80
11
詳細情報
• 『Memory Usage on HP-UX Integrity Servers - Version 1.1 (February 15, 2006)』 (英語)
『HP-UX Integrity サーバへの移行に伴うメモリ使用量の変化』 (日本語)
• GlancePlus Overview and Features (英語)
『Adviser Reference Guide』は、[Technical resources] の [Product manuals] のリンク先ページで検索すれば見
つかります。
Glanceplus システム・パフォーマンスをリアルタイムで監視・診断 (日本語)
『アドバイザ リファレンス ガイド』は、[オンラインマニュアル] > [GlancePlus] のリンク先のページで見つかります。
• HP-UX Reference (Manpages) (英語)、HP-UX リファレンス (マンページ) (日本語)
• 本書に関するご意見、ご感想は、[email protected] までお寄せください。
お問い合わせはカスタマ インフォメーション センタへ
03-6416-6660
月~金9:00~19:00 土10:00~18:00 (日、祝祭日、年末年始および5/1を除く)
HP-UX 製品に関する情報は
HP-UX に関する技術情報は
http://www.hp.com/jp/hpux
http://www.hp.com/jp/developer
Intel、インテル、Intel Insideロゴ、Itaniumは、米国におけるIntel Corporationまたはその子会社の商標または登録商
標です。
Oracleは、米国におけるOracle Corporationの登録商標です。
記載されている会社名および商品名は、各社の商標または登録商標です。
記載事項は2006年10月現在のものです。
本書に記載された内容は、予告なく変更されることがあります。
本書中の技術的あるいは校正上の誤り、省略に対して、
いかなる責任も負いかねますのでご了承ください。
本書は、『Approach to Estimating Memory Usage when Migrating from HP-UX PA-RISC to HP-UX Integrity Servers
(6/2006)』 (英語) をもとに加筆・修正して日本語で提供するものです。
© Copyright 2006 Hewlett-Packard Development Company,L.P.
日本ヒューレット・パッカード株式会社
〒102-0076 東京都千代田区五番町七番地
PDFHS06062-01
Fly UP