概要
このドキュメントでは、Cisco IOS® ソフトウェア プラットフォームで MallocLite メモリのメモリ リークのトラブルシューティングを行う方法を説明します。
また、Cisco Technical Assistance Center(TAC)サービス リクエストを開いたり、デバイスをリロードしたりする前に、収集する必要のある情報を記します。 このドキュメントで説明されている出力を収集し、TAC サービス リクエストに通知すると、迅速な問題解決に役立ちます。
背景説明
MallocLite は、メモリ マネージャによって小さな固定サイズのメモリ単位を割り当てる機能です。これはチャンクとも呼ばれ、128 バイト以下の単位を割り当てます。 小さな単位のメモリ割り当てなら、割り当てごとにブロック ヘッダーのオーバーヘッドが発生することはありません。 この機能は、プロセッサ メモリ プールのみでサポートされます。
各メモリ ブロック ヘッダーは、約 48 バイトのメモリを占有します。最小のブロックは約 24 バイトを占有します。 Cisco IOS ソフトウェアの従来のアプローチによる割り当てでは、実際のデータの割り当てに 8 バイトしか必要ない場合でも、少なくとも 72(48 + 24)バイトのメモリを消費します。
MallocLite であれば、チャンクを使用することにより、このようなオーバーヘッドを減らすことができます。 ただし、チャンクを管理する必要があるため、オーバーヘッドが完全になくなるわけではありません。 それでも、チャンクは固定サイズであるため、ブロックとは異なる形式で管理され、オーバーヘッドは少なくなります。
MallocLite メモリを使用するアプリケーションは、メモリの空き容量を適切に増やす役割を担います。 また、MallocLite はメモリのユーザを非公開にします。
トラブルシューティング
注: Cisco CLI アナライザ(登録ユーザ専用)は、特定の 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 がオンになっていても、通常はどの機能がメモリを要求しているか確認できます。 レポートされた名前が MallocLite であっても、show memory allocating-process totals コマンドの出力は異なる 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 に追加された拡張機能の 1 つに、新しい CLI があります。これは、各 PC によって割り当てられた MallocLite メモリの要約を表示します。 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 コマンドの詳細については、コマンド リファレンスを参照してください。