このドキュメントでは、ネイティブの Cisco IOS® の MALLOCFAIL エラーと、問題解決のために Cisco Technical Assistance Center(TAC)サービス リクエストを開くか、またはデバイスをリロードする前に、実行する手順と収集する情報について説明します。 完全ではありませんが、このドキュメントでは、多くのルータおよびスイッチにおけるメモリの問題を修復するための、一般的なガイドラインを提供します。
スイッチおよびルータでは、いくつかのメモリの問題が発生します。 多くの場合、メモリ エラーが発生したデバイスは、適切なデータが収集される前にリロードされます。
メモリの問題は、ルータまたはスイッチのログに MALLOCFAIL エラーの形式で表示されます。 これらのエラーは、調査の道しるべとなる「道路標識」を提供するため、重要です。 MALLOCFAIL エラーの例を次に示します。
%SYS-2-MALLOCFAIL: Memory allocation of 65536 bytes failed
from 0x60103098,
alignment 0
Pool: Processor Free: 5453728 Cause: Memory fragmentation
Alternate Pool: None Free: 0 Cause: No Alternate pool
最初に示されるのは、割り当てに必要なメモリ量と、メモリの空き容量です。 この例は、約 5.45 MB の空き容量しかないプールから 65 KB を割り当てる必要があるシナリオを示しています。 十分な空き容量があっても、出力は、最大連続ブロックが 65 KB より小さく、メモリの割り当てが失敗したことを示しています。 一方、定義上、これはメモリのフラグメンテーションと見なされますが、通常はこれが原因ではありません。 多くの場合、単にプール自体のメモリ不足によって発生します。
2 番目に注意しなければならないのはプールのタイプです。 上記の例ではプロセッサ プールについて取り上げました。 これは、調査の道しるべとなり、調査対象を指し示す最初の「道路標識」であるため、重要です。 指定されたプールは、プロセッサまたは I/O である必要があります。 次に、I/O メモリ エラーの例を示します。
%SYS-2-MALLOCFAIL: Memory allocation of 65548 bytes failed from 0x400B8564,
alignment 32
Pool: I/O Free: 39696 Cause: Not enough free memory
Alternate Pool: None Free: 0 Cause: No Alternate pool
次のセクションでは、これらのプールについてさらに詳しく取り上げます。 プールを特定したら、該当箇所の作業に集中できるようになります。
プロセッサ プールは、その名前が示すように、ルータまたはスイッチで動作するさまざまなプロセスで使用されます。 メモリを使用するほとんどの Cisco IOS バージョンやプラットフォームの下には、特定のプロセスがあります。 たとえば、Init は、ほとんどのデバイスのブート時に確立されるプロセスで、さまざまなプラットフォーム間に存在しています。 存在が予想されるその他のプロセスは、個々のデバイスの設定に基づいています。 たとえば、音声が設定され使用されているプラットフォームでは、音声固有のプロセスがメモリを消費し、一方、より一般的な音声なしの設定では、結局これらのプロセスは同等のメモリを保持しません(あるいはまったく保持しません)。
特定のプロセスでは、他の場合よりも多くのメモリを保持します。 特定のプロセスに関する質問または懸念事項がある場合、TAC サービス リクエストを開いて調査することをお勧めします。
Cisco 2821 (revision 53.51) with 210944K/51200K bytes of memory.
show clock
show mem stat
show proc mem sorted
show mem all totals
show log
show proc mem <PID #>
show mem dead totals
show mem dead
I/O プールは I/O バッファを示し、show buffers コマンドで表示されます。 これらのバッファは、ルーティング更新やブロードキャストなどの他のもののプロセス交換トラフィックで使用されます。 I/O メモリは複数のプールに分割されます。これは show buffers コマンドの出力に表示されます。 これらのプールはパケット サイズに基づいており、必要性に応じたより効率的なメモリの割り当てを可能にします。
--------- show buffers --------
Buffer elements:
500 in free list (500 max allowed)
3220350364 hits, 0 misses, 0 created
Public buffer pools:
Small buffers, 104 bytes (total 6144, permanent 6144):
3867 in free list (2048 min, 8192 max allowed)
248913132 hits, 0 misses, 0 trims, 0 created
0 failures (0 no memory)
Medium buffers, 256 bytes (total 86401, permanent 3000, peak 86401 @ 05:18:11):
0 in free list (64 min, 3000 max allowed)
9697361 hits, 203293 misses, 2208 trims, 85609 created
167633 failures (651288 no memory)
Middle buffers, 600 bytes (total 512, permanent 512):
0 in free list (64 min, 1024 max allowed)
9284431 hits, 237750 misses, 0 trims, 0 created
224619 failures (680486 no memory)
Big buffers, 1536 bytes (total 1000, permanent 1000):
0 in free list (64 min, 1000 max allowed)
69471745 hits, 895218 misses, 0 trims, 0 created
842142 failures (1821074 no memory)
VeryBig buffers, 4520 bytes (total 10, permanent 10, peak 122 @ 1w3d):
0 in free list (0 min, 100 max allowed)
2120517 hits, 1632477 misses, 112 trims, 112 created
1632421 failures (3272987 no memory)
Large buffers, 9240 bytes (total 8, permanent 8, peak 18 @ 1w3d):
0 in free list (0 min, 10 max allowed)
9593 hits, 832217 misses, 44 trims, 44 created
832195 failures (1651309 no memory)
Huge buffers, 18024 bytes (total 2, permanent 2):
0 in free list (0 min, 4 max allowed)
1325 hits, 831497 misses, 0 trims, 0 created
831494 failures (1649904 no memory)
show clock
show mem stat
show buffers
show log
show buffer pool <pool name> packet
前述の MALLOCFAIL エラーの例は、ほとんどのルータでよく発生するものです。 スーパーバイザ エンジン(SUP)またはルート スイッチ プロセッサ(RSP)を搭載した Cisco Catalyst 6500 シリーズ スイッチおよび 7600 シリーズ ルータでは、これらのエラーは異なる場合があります。 たとえば、このエラーは、6500 シリーズ スイッチのルート プロセッサ(RP)ログからのものです。
%SYS-SP-2-MALLOCFAIL: Memory allocation of 820 bytes failed from 0x40C83B60,
alignment 32
Pool: I/O Free: 48 Cause: Not enough free memory
Alternate Pool: None Free: 0 Cause: No Alternate pool
MALLOCFAIL エラーは、RP ではなく、SUP のスイッチ プロセッサ(SP)が問題をレポートすることを示します。 問題が RP に関連付けられた場合、エラーに SP 指定は存在しません。 そのため、上記の出力は SP から取得する必要があります。 これを行うには、コマンドの前に次の文字列を追加します。
remote command switch
STDBY と表示されるエラー メッセージは、スタンバイ SUP/RSP RP または SP を示す場合もあり、結果に応じて収集する必要が生じることがあります。
このドキュメントに記載されている出力リストを収集しておけば、問題を速やかに解決し、早急にデバイスを安定させることができる可能性が高まります。 疑問がある場合や、デバイスのメモリ パフォーマンスに懸念がある場合は、TAC サービス リクエストを開いて調査することをお勧めします。