はじめに
このドキュメントでは、Cisco IOS® ソフトウェア プラットフォームでの MallocLite のメモリ リークをトラブルシューティングする方法を説明します。
また、Cisco Technical Assistance Center(TAC)ケースを開くか、デバイスをリロードする前に、収集する必要のある情報を指定します。問題を早く解決できるよう、このドキュメントで指定されている出力を収集して、TAC のケースに添付してください。
背景説明
MallocLite は、128 バイト以下の割り当て用に、チャンクと呼ばれる小さい固定サイズのメモリ断片を割り当てるために、メモリ マネージャによって使用されます。小さいメモリ割り当てでは、割り当てごとにブロック ヘッダーのオーバーヘッドがありません。この機能は、プロセッサ メモリ プールだけでサポートされます。
すべてのメモリ ブロック ヘッダーは約 48 バイトのメモリを使用し、最小ブロックは約 24 バイトです。各割り当てに対する Cisco IOS ソフトウェアの従来のアプローチでは、実際に割り当てる必要があるデータが 8 バイトだけの場合であっても、少なくとも 72(48 + 24)バイトのメモリが消費されました。
MallocLite では、チャンクを使用することによってこのオーバーヘッドを削減できます。それでも、チャンクの管理用に若干のオーバーヘッドがあります。ただし、チャンクは固定サイズなので、ブロックとは異なる方法で管理され、オーバーヘッドは少なくて済みます。
MallocLite のメモリを使用して適切に解放する責任は、アプリケーションにあります。MallocLite はメモリのユーザをマスクします。
トラブルシュート
注:Cisco CLI Analyzer(登録ユーザ専用)では、特定のshowコマンドをサポートしています。show コマンド出力の分析を表示するには、Cisco CLI アナライザを使用します。
リークの原因になっているアプリケーションを特定する
通常、malloclite というキーワードだけで検索した場合、既存のバグを特定するのは困難です。
この例では、*MallocLite* プロセスが異常な量のメモリを保持していることを示します。
#show processes memory sorted
Processor Pool Total: 1614282720 Used: 1544726580 Free: 69556140
I/O Pool Total: 313524224 Used: 115564032 Free: 197960192
PID TTY Allocated Freed Holding Getbufs Retbufs Process
0 0 0 0 1476043512 0 0 *MallocLite*
リークの原因になっているアプリケーションを正確に特定する必要があります。3 つの特定方法を使用できます。
- アロケータ PC を解釈する。
- MallocLite のメモリ統計情報を調査する。
- MallocLite を無効にする。
アロケータ PC を解釈する
MallocLite を有効にした場合でも、通常は、どの関数がメモリを要求したかがわかります。Show memory allocating-process totals コマンドの出力では、表示される名前は MallocLite であっても、異なる PC 値が示される場合があります。
#show memory allocating-process totals
<snip>
Allocator PC Summary for: Processor
Displayed first 2048 Allocator PCs only
PC Total Count Name
0x620BE3C4 42807572 594 MallocLite
0x620ADDD4 13597308 193 MallocLite
0x60738BB0 8909824 122 MallocLite
0x620AE0E0 2060716 31 MallocLite
0x620AE10C 1982780 30 MallocLite
Cisco TAC エンジニアは、リストの上部から PC 値を解釈できます(最大合計)。 これは、メモリ リークがあるアプリケーションの特定に役立ちます。
MallocLite のメモリ統計情報を調査する
Cisco IOS ソフトウェア リリース 15.1T で追加された機能強化の中には、各 PC によって割り当てられた MallocLite メモリのサマリを表示する新しい CLI がありました。Show memory lite-chunks コマンドを使用すると、大量の MallocLite ブロックを使用しているアプリケーションを識別できます。
show memory lite-chunks { statistics | totals } { summary { pool | { all | pool } } }
Show memory lite-chunks コマンドの詳細については、コマンド リファレンスを参照してください。
CLI : show memory lite-chunks totals
DESC : Summary of all pools, based on alloc pc.
This cli can be used to find the alloc_pc which is using large amount memory
allocated from all mlite pools
CLI : show memory lite-chunks statistics
DESC : Displays number of allocated & free mlite chunks
CLI : show memory lite-chunks summary pool pool
DESC : Show summary of particular mlite pool
This cli can be used to find the alloc_pc which is using large amount of memory
in individual mlite pool
CLI : show memory lite-chunks summary pool all
DESC : Show individual summary of all mlite pools
CLI : show memory lite-chunks pool pool
DESC : Show All chunk elements in the specified pool
CLI : show memory lite-chunks pool all
DESC : show all chunk elements in all mlite pools
このコマンドの出力の例を次に示します。
#show memory lite-chunks ?
pool Malloc lite pool
statistics Malloc lite statistics
summary Malloc Lite summary
totals Malloc Lite Allocating totals
#show memory lite-chunks statistics
Pool Inuse Free
8-Bytes 140 1904
20-Bytes 173 1313
44-Bytes 171 791
68-Bytes 24 687
96-Bytes 26 519
128-Bytes 20 410
#show memory lite-chunks totals
PC Total Count
26067AE0 2112 33
2269E68C 1932 29
2269FACC 1664 29
2269F964 1664 26
2269FA9C 1580 29
26067FB4 1360 34
23CD2A0C 1036 7
#show memory lite-chunks pool ?
128-Bytes 128 bytes pool
20-Bytes 20 bytes pool
44-Bytes 44 bytes pool
68-Bytes 68 bytes pool
8-Bytes 8 bytes pool
96-Bytes 96 bytes pool
all all pools
#show memory lite-chunks summary pool 8
8 bytes pool
PC Total Count
2269FB10 812 29
23612084 700 25
2269F9F8 700 25
2269F9EC 700 25
ここでも、TAC エンジニアは、最高の合計で PC の値を解釈し、メモリをリークしているアプリケーションを特定できます。
MallocLite を無効にする
MallocLite の機能は、デフォルトで有効になります。MallocLite のリークを調査するため、MallocLite を無効にすることができます:
(config)#no memory lite
リークされたメモリは、次のリロードまでMallocLiteに存在します。ただし、show processes memory sortedおよびshow memory allocating-process totalsコマンドを使用して、さらにリークを監視することもできます。今度は、リークは実際のプロセスに表示されるようになります。
デバイスが非常に少ないメモリで実行している場合、設定を保存してデバイスをリロードし、メモリを解放する必要があります。
#wr
#reload
時間が経つと再びメモリが減少する場合があるので、それ以降は show processes memory sorted および show memory allocating-process totals コマンドを使用してメモリの使用状況を監視します。
注:no memory liteコマンドを使用してMallocLiteを実質的に無効にし、デバイスをリロードした場合、show memory lite-chunksコマンドからの出力は空になります。
memory lite コマンドの詳細については、コマンド リファレンスを参照してください。