キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

IOS-XR: プロセスのメモリーリーク

 

 

プロセス内部のメモリー種別

プロセス内部のメモリー種別は大きく分けると以下になります。

 

メモリー領域   概要

プログラム テキスト領域

Program Text

プロセス内部のプログラム命令が格納された領域
プログラム データ領域

Program Data

プロセス内部の static 変数等のデータが格納された領域
プログラム スタック領域

Program Stack

プロセス内部の local 変数等のデータが格納された領域
DLL テキスト領域

DLL Text

プロセスに load された DLL内部のプログラム命令が格納された領域
DLL データ領域

DLL Data

プロセスに load された DLL内部の static 変数等が格納された領域
ヒープ領域

Dynamic

プロセス内部の動的に割り当てを行うダイナミックメモリー領域
共有メモリー領域

Shared

複数プロセスにて共有されるメモリー領域

 

 

ダイナミックメモリーリークとは?

  • プロセス、及びプロセスに load された DLL 内部にて、ダイナミックメモリーの解放漏れソフトウェア不具合により発生します
  • ある特定の処理が繰り返し実行されることにより、ダイナミックメモリー使用量が継続して増加して行く現象になります

 

メモリーリーク解析に重要な情報

  • メモリー使用量の増減は本当にメモリーリークによるものかどうか (one-time によるメモリー増加ではないか)
  • どのノード (RSP/LC) のどのプロセスにメモリーリークの被疑があるか
  • Config 変更、SNMP MIB ポーリング等、メモリーリークのトリガーとなる事象は何か
  • どのくらいのペースでメモリーリークが発生しているか (1 MBytes/day など)

 

 

メモリーリークの影響

  • プロセス毎に使用可能なダイナミックメモリーの上限値が設定されています
  • プロセス毎に使用可能なダイナミックメモリーの上限値は異なります
  • 上限値を超えた場合 Signal 31 にてプロセスがクラッシュする場合があります (下記例参照)
  • クラッシュした常駐プロセスは自動的に restart され、リークしたダイナミックメモリーは全て解放されます

 

dumper[59]: %OS-DUMPER-7-DUMP_REQUEST : Dump request for process pkg/bin/snmpd

dumper[59]: %OS-DUMPER-7-DUMP_ATTRIBUTE : Dump request with attribute 7 for process pkg/bin/snmpd

dumper[59]: %OS-DUMPER-4-SIGNAL_NUMBER : Thread 1 received SIGNAL 31, si code 0, si errno 0

dumper[59]: %OS-DUMPER-4-SIGNALCORE_INFO : Core for pid = 278830 (pkg/bin/snmpd) as signal 31 sent by pkg/bin/snmpd@node0_RSP0_CPU0

dumper[59]: %OS-DUMPER-7-PROC_PAGES : Process memory pages 925

dumper[59]: %OS-DUMPER-6-FALLBACK_CHOICE : Fall back choice:  0(harddisk:/dumper) in use

dumper[59]: %OS-DUMPER-7-REGISTERS_INFO :             r0       r1       r2       r3

dumper[59]: %OS-DUMPER-7-REGISTERS_INFO :   R0   00000004  e7fffa10  5002b0a0  00000001 

dumper[59]: %OS-DUMPER-7-REGISTERS_INFO :             r4       r5       r6       r7

dumper[59]: %OS-DUMPER-7-REGISTERS_INFO :   R4   e7fffaa8  00000001  e7fffa30  00000183 

dumper[59]: %OS-DUMPER-7-REGISTERS_INFO :             r8       r9      r10      r11

dumper[59]: %OS-DUMPER-7-REGISTERS_INFO :   R8   412e0001  00000001  00000001  501e24a9 

dumper[59]: %OS-DUMPER-7-REGISTERS_INFO :            r12      r13      r14      r15

dumper[59]: %OS-DUMPER-7-REGISTERS_INFO :   R12  501ddce4  5002b0a0  e7fffb60  00000001 

dumper[59]: %OS-DUMPER-7-REGISTERS_INFO :            r16      r17      r18      r19

dumper[59]: %OS-DUMPER-7-REGISTERS_INFO :   R16  e7fffb74  e7fffb7c  e7fffc18  00000000 

dumper[59]: %OS-DUMPER-7-REGISTERS_INFO :            r20      r21      r22      r23

dumper[59]: %OS-DUMPER-7-REGISTERS_INFO :   R20  0051626c  00000000  00000000  50028860 

dumper[59]: %OS-DUMPER-7-REGISTERS_INFO :            r24      r25      r26      r27

dumper[59]: %OS-DUMPER-7-REGISTERS_INFO :   R24  00000000  e7fffa30  e7fffaec  ec017384 

dumper[59]: %OS-DUMPER-7-REGISTERS_INFO :            r28      r29      r30      r31

dumper[59]: %OS-DUMPER-7-REGISTERS_INFO :   R28  50033684  00000001  00000001  e7fffaa8 

dumper[59]: %OS-DUMPER-7-REGISTERS_INFO :            cnt       lr      msr       pc

dumper[59]: %OS-DUMPER-7-REGISTERS_INFO :   R32  00000000  4c242678  0000d932  4c2c4ec4 

dumper[59]: %OS-DUMPER-7-REGISTERS_INFO :            cnd      xer

dumper[59]: %OS-DUMPER-7-REGISTERS_INFO :   R36  44002042  20000000 

dumper[59]: %OS-DUMPER-7-TRACE_BACK : #0  0x4c2c4ec4

dumper[59]: %OS-DUMPER-7-TRACE_BACK : #1  0x4c242678

dumper[59]: %OS-DUMPER-7-TRACE_BACK : #2  0x4c242ac4

dumper[59]: %OS-DUMPER-7-TRACE_BACK : #3  0x4c2457ec

dumper[59]: %OS-DUMPER-7-TRACE_BACK : #4  0x40011bbc

dumper[59]: %OS-DUMPER-7-TRACE_BACK : #5  0x4001346c

dumper[59]: %OS-DUMPER-7-TRACE_BACK : #6  0x40086bc0

-- snip --

dumper[59]: %OS-DUMPER-6-CORE_MD5 : harddisk:/dumper/first.snmpd_1113.by.snmpd.node0_RSP0_CPU0.ppc.Z has just been written. size:78133573 md5:04c931525d07a348370ac12d08584a3d

-- snip --

 

Signal 31 でプロセスがクラッシュした場合は、harddisk 配下にプロセスのコアダンプが保存されるため、

上記コンソールログと以下のファイルを取得して下さい。

harddisk:/dumper/first.snmpd_1113.by.snmpd.node0_RSP0_CPU0.ppc.Z

harddisk:/dumper/first.snmpd_1113.by.snmpd.node0_RSP0_CPU0.ppc.txt

harddisk:/dumper/first.snmpd_1113.by.snmpd.node0_RSP0_CPU0.ppc.cpu_info.Z

ただし、上記クラッシュ時のコアダンプからメモリーリークの被疑箇所を特定することは難しい場合があるため、

メモリーリークのトラブルシューティングでは早期発見とログ取得が重要になります。

 

メモリーリークプロセスの特定

メモリーリークが発生していると思われる場合、第 1 ステップとしてプロセスの特定が必要となります。

メモリーリークプロセスを特定するには、以下の 2 つのコマンドが利用可能です。

 

 

  • show memory compare コマンドによるモニタリング
  • show processes memory コマンドによるモニタリング
  • SNMP MIB によるモニタリング

 

 

show memory compare コマンドによるモニタリング

show memory compare コマンドにより各プロセスのメモリー増減を確認します。

 

 

  1. show memory compare start
  2. しばらく待つ (待ち時間はリーク量/スピードに応じて調整して下さい)
  3. show memory compare end
  4. show memory compare report

 

Start スナップショットの取得

RP/0/RP0/CPU0:CRS#show memory compare start

Successfully stored memory snapshot /harddisk:/malloc_dump/memcmp_start.out

 

(*) harddisk 配下に Start スナップショットファイルが作成されます。

End スナップショットの取得

RP/0/RP0/CPU0:CRS#show memory compare end 

Successfully stored memory snapshot /harddisk:/malloc_dump/memcmp_end.out

 

(*) harddisk 配下に End スナップショットファイルが作成されます。

Start/End スナップショットの比較

RP/0/RP0/CPU0:CRS#show memory compare report

JID   name                 mem before   mem after    difference mallocs restart/exit/new

---   ----                 ----------   ---------    ---------- ------- ----------------

117   arp                  662916       663040       124        2        

65819 exec                 257480       257568       88         3        

415   wdsysmon             4190296      4189240      -1056      -4        

 

 

You are now free to remove snapshot memcmp_start.out and memcmp_end.out under /harddisk:/malloc_dump

 

(*) harddisk 配下に作成された Start/End スナップショットの差分を表示します。

 

項目概要

JIDプロセスの Job ID
nameプロセス名
mem beforeスナップショット Start の時点におけるダイナミックメモリー使用量 (Bytes)
mem afterスナップショット End の時点におけるダイナミックメモリー使用量 (Bytes)
differenceスナップショット Start/End 間のダイナミックメモリー使用量の増減 (Bytes)
mallocsスナップショット Start/End 間のメモリー割り当てAPI の呼び出し回数の差分
restart/exit/newスナップショット Start/End 間にてプロセス restart/exit/start が行われたかどうかのフラグ

 

 

show processes memory コマンドによるモニタリング

show processes memory コマンドを定期的に投入し、各プロセスのダイナミックメモリーの使用量の増減をチェックします。

 

RP/0/RSP0/CPU0:ASR9K#show processes memory location 0/RSP0/CPU0

JID          Text       Data      Stack    Dynamic Process

------ ---------- ---------- ---------- ---------- -------

340        167936     110592     184320   22089728 parser_server

241        589824     970752      81920   14663680 iedged

1110       401408     131072     122880   13197312 ipv6_rib

1109       405504     131072     159744   12632064 ipv4_rib

1040      1056768    2867200     253952   10731520 bgp

1105      2396160   10485760     135168    8548352 l2vpn_mgr

60         110592      53248     139264    7630848 eth_server

1133        65536      20480      32768    7479296 schema_server

334        143360      69632      53248    7417856 nvgen_server

1011      1331200     598016     135168    6258688 ospf

-- snip --

 

(*) ダイナミックメモリー使用量の多い順に表示されます。Dynamic が継続して増加しているかを確認します。

 

 

プロセス内部のメモリーリーク箇所の特定

メモリーリークプロセスを特定した後、第 2 ステップとしてプロセス内部のメモリーリーク箇所の特定が必要となります。

メモリーリーク箇所の特定には、メモリースナップショットを 2 - 3 回ほど取得し、差分を比較することにて行います。

 

  1. プロセスのDLL情報の取得
  2. プロセスのヒープ領域の Start スナップショットの取得
  3. しばらく待つ (待ち時間はリーク量/スピードに応じて調整して下さい)
  4. プロセスのヒープ領域の End スナップショットの取得
  5. プロセスのコアダンプの取得

 

プロセス情報の取得

show processes コマンドにより被疑プロセスの情報を確認します。

RP/0/RSP0/CPU0:ASR9K#show processes snmpd

                  Job Id: 1113

                     PID: 844710071

         Executable path: /disk0/iosxr-infra-4.1.2/bin/snmpd

              Instance #: 1

              Version ID: 00.00.0000

                 Respawn: ON

           Respawn count: 2

  Max. spawns per minute: 12

                     -- snip --

 

Process ID (PID) はプロセス再起動毎に新しい値が割り当てられますが、

Job ID はプロセス再起動でも同じ値が保持される実装になっています。

 

以下、コマンド例の <jid> には上記 Job ID を指定します。

 

 

プロセスのDLLマッピング情報の取得

show dll コマンドにてプロセスのDLLマッピング情報を取得します。

 

  • show dll コマンド

RP/0/RSP0/CPU0:ASR9K#show dll <jid>

 

プロセスのヒープ領域のスナップショットの取得

プロセスのヒープ領域のスナップショットでは以下の3つの情報を取得します。

 

  • show memory heap dllname コマンド
  • show memory heap allocated dllname コマンド
  • show memory コマンド

 

 

show memory heap dllname コマンド

 

ヒープ領域のサマリー情報の取得

RP/0/RSP0/CPU0:ASR9K#show memory heap dllname <jid>

Malloc summary for pid 844710071 process snmpd:

  Heapsize 11325440: allocd 10365240, free 27120, overhead 933080, high watermark 11325440

  Calls: mallocs 95070437; reallocs 964756; frees 94961917; [core-allocs 192; core-frees 7]

-- snip --

Block Allocated List:

Total      Total      Block      Name/ID/Caller

Usize      Size       Count

0x003d2ba8 0x0040cc08 0x00007325  0x40020fd4 <N/A>

0x0022118f 0x0026b558 0x00007325  0x40020fe8 <N/A>

0x00100270 0x001002c8 0x00000009  GSP_MEM

0x00051860 0x00059ca0 0x0000104e  0x400283dc <N/A>

0x00046374 0x000535b0 0x0000161c  0x4e894c58 snmp_object_create_list

0x000212a0 0x0002c380 0x0000161c  0x4e894ccc snmp_object_create_list

0x0001e000 0x0001e008 0x00000001  0x4c5de600 chk_messaging_init_msgbuf

0x0001e000 0x0001e008 0x00000001  0x4c5de5b0 chk_messaging_init_msgbuf

0x00018316 0x000323d8 0x0000216f  0x4c2f6178 strdup

0x00015acf 0x000210e8 0x0000108d  0x4006c8a8 <N/A>

-- snip --

 

show memory heap allocated dllname コマンド

ヒープ領域のメモリーブロック情報の取得

RP/0/RSP0/CPU0:ASR9K#show memory heap allocated dllname <jid>

Block Allocated List:

Usize      Size       Address    Name/ID/Caller

0x0003fff0 0x0003fff8 0x501b6024  GSP_MEM

0x0003fff0 0x0003fff8 0x50359024  GSP_MEM

0x0003fff0 0x0003fff8 0x5042a024  GSP_MEM

0x0003fff0 0x0003fff8 0x504b3024  GSP_MEM

0x0001e000 0x0001e008 0x50080024  0x4c5de600 chk_messaging_init_msgbuf

0x0001e000 0x0001e008 0x5009f024  0x4c5de5b0 chk_messaging_init_msgbuf

0x00008400 0x00008408 0x50043aec  0x4c5dee70 chk_messaging_init

0x00007a58 0x00007a60 0x501f7024 [chunk NH RULES CHUNK hdr]: 304 bytes, 100 per blk (a=0/f=100/h=0) (blks 0, 0)][NH RULES CHUNK chunk data: 0x501f7078 free: 100]

0x00005a44 0x00005a4c 0x502d1024  0x4e8948f4 snmp_object_add_object

0x0000413c 0x00004144 0x506c4024  0x4007f12c <N/A>

-- snip --

0x00000088 0x000000a0 0x500d25c4  0x40020fd4 <N/A>

0x00000088 0x000000a0 0x50199504  0x40020fd4 <N/A>

0x00000088 0x000000a0 0x50277038  0x40020fd4 <N/A>

0x00000088 0x000000a0 0x50278e04  0x40020fd4 <N/A>

0x00000088 0x000000a0 0x5027b304  0x40020fd4 <N/A>

0x00000088 0x000000a0 0x503407d8  0x40020fd4 <N/A>

-- snip --

0x00000050 0x00000058 0x50706424  0x40020fe8 <N/A>

0x0000004d 0x00000068 0x50199284  0x40020fe8 <N/A>

0x0000004d 0x00000068 0x5023dab4  0x40020fe8 <N/A>

0x0000004d 0x00000068 0x5027887c  0x40020fe8 <N/A>

0x0000004d 0x00000068 0x5027b914  0x40020fe8 <N/A>

-- snip --

 

show memory コマンド

メモリーブロック情報の取得

RP/0/RSP0/CPU0:ASR9K#show memory <jid>

Physical Memory: 4096M total (1988M available)

Application Memory : 3915M (1988M available)

Image: 51M (bootram: 51M)

Reserved: 128M, IOMem: 2028M, flashfsys: 0

-- snip --

pkg/bin/snmpd: jid 1113

Address         Bytes           What

40000000        557056          Program Text

4c000000        67108864        DLL Text

50000000        159744          Program/DLL Data

50027000        4096            Program/DLL Data

50028000        1961984         Allocated Memory

50207000        36864           Physical Mapped Memory

50210000        131072          Allocated Memory

50237000        2011136         Allocated Memory

50429000        7254016         Allocated Memory

50b1c000        98304           Allocated Memory

50b39000        1277952         Allocated Memory

60100000        212992          Shared Memory

60134000        98304           Shared Memory

6014c000        40960           Shared Memory

 

-- snip --

ec51a000        4096            Program/DLL Data

ec745000        8192            Program/DLL Data

ec748000        8192            Program/DLL Data

ec74b000        20480           Program/DLL Data

ec751000        4096            Program/DLL Data

Total Allocated Memory: 12734464

Total Shared Memory: 844582912

 

 

プロセスのヒープ領域のスナップショットの比較

show memory heap dllname の Start/End スナップショットを比較することにより、メモリーブロックの増減を確認することが可能です。

下記の例では 赤字 のメモリーブロックが増加している事象が確認できます。

 

Start スナップショット

RP/0/RSP0/CPU0:ASR9K#show memory heap dllname <jid>

Malloc summary for pid 844710071 process snmpd:

  Heapsize 11325440: allocd 10365240, free 27120, overhead 933080, high watermark 11325440

  Calls: mallocs 95070437; reallocs 964756; frees 94961917; [core-allocs 192; core-frees 7]

-- snip --

Block Allocated List:

Total      Total      Block      Name/ID/Caller

Usize      Size       Count

0x003d2ba8 0x0040cc08 0x00007325  0x40020fd4 <N/A>

0x0022118f 0x0026b558 0x00007325  0x40020fe8 <N/A>

0x00100270 0x001002c8 0x00000009  GSP_MEM

0x00051860 0x00059ca0 0x0000104e  0x400283dc <N/A>

0x00046374 0x000535b0 0x0000161c  0x4e894c58 snmp_object_create_list

0x000212a0 0x0002c380 0x0000161c  0x4e894ccc snmp_object_create_list

-- snip --

 

End スナップショット

RP/0/RSP0/CPU0:ASR9K#show memory heap dllname <jid>

Malloc summary for pid 844710071 process snmpd:

  Heapsize 13783040: allocd 12554380, free 47572, overhead 1181088, high watermark 13783040

  Calls: mallocs 122449585; reallocs 1248003; frees 122315443; [core-allocs 247; core-frees 20]

-- snip --

Block Allocated List:

Total      Total      Block      Name/ID/Caller

Usize      Size       Count

0x004f19a8 0x0053c9dc 0x000094e5  0x40020fd4 <N/A>

0x002c1237 0x003211d8 0x000094e5  0x40020fe8 <N/A>

0x00100270 0x001002c8 0x00000009  GSP_MEM

0x00051860 0x00059ca0 0x0000104e  0x400283dc <N/A>

0x00046374 0x000535b0 0x0000161c  0x4e894c58 snmp_object_create_list

0x0002fa12 0x00063210 0x0000420b  0x4c2f6178 strdup

0x000212a0 0x0002c380 0x0000161c  0x4e894ccc snmp_object_create_list

-- snip --

 

 

プロセスのコアダンプの取得

プロセスのヒープ領域の Start/End スナップショットの比較によりメモリーリーク箇所を特定可能な場合もありますが、

メモリーリーク箇所によっては解析にプロセスのコアダンプが必要になる場合もあります。

 

プロセスのコアダンプの取得

RP/0/RSP0/CPU0:ASR9K#dumpcore running <jid>

 

上記コマンドを投入後、以下のファイルを取得して下さい。

harddisk:/dumper/first.snmpd_<jid>.by.dumper_gen.node0_RSP0_CPU0.ppc.Z

harddisk:/dumper/first.snmpd_<jid>.by.dumper_gen.node0_RSP0_CPU0.ppc.txt

harddisk:/dumper/first.snmpd_<jid>.by.dumper_gen.node0_RSP0_CPU0.ppc.cpu_info.Z

プロセスクラッシュ時に収集されるコアダンプと異なり、dumpcore コマンドによるコアダンプのファイル名には by.dumper_gen が含まれています。

バージョン履歴
改訂番号
2/2
最終更新:
‎08-31-2017 03:10 AM
更新者:
 
ラベル(1)
寄稿者: