キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 
cancel
5911
閲覧回数
16
いいね!
0
コメント
taisasak
Cisco Employee
Cisco Employee

 

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

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

 

プログラム テキスト領域

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 が含まれています。

Getting Started

検索バーにキーワード、フレーズ、または質問を入力し、お探しのものを見つけましょう

シスコ コミュニティをいち早く使いこなしていただけるよう役立つリンクをまとめました。みなさんのジャーニーがより良いものとなるようお手伝いします