Cisco IOS と NX-OS ソフトウェア : Cisco IOS 15.1M&T

MALLOCFAIL エラーおよび汎用メモリの問題のトラブルシューティング

2015 年 11 月 26 日 - 機械翻訳について
その他のバージョン: PDFpdf | 英語版 (2015 年 8 月 22 日) | フィードバック

概要

このドキュメントでは、ネイティブの Cisco IOS® の MALLOCFAIL エラーと、問題解決のために Cisco Technical Assistance Center(TAC)サービス リクエストを開くか、またはデバイスをリロードする前に、実行する手順と収集する情報について説明します。 完全ではありませんが、このドキュメントでは、多くのルータおよびスイッチにおけるメモリの問題を修復するための、一般的なガイドラインを提供します。

著者:Cisco TAC エンジニア、Brandon Lynch

MALLOCFAIL エラー

スイッチおよびルータでは、いくつかのメモリの問題が発生します。 多くの場合、メモリ エラーが発生したデバイスは、適切なデータが収集される前にリロードされます。

メモリの問題は、ルータまたはスイッチのログに 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 サービス リクエストを開いて調査することをお勧めします。

原因および収集対象

  1. デバイスが最近 Cisco IOS アップグレードを行っている場合は、最初に新しい画像に必要な最小 DRAM 容量を確認します。 これは、デバイス自体に搭載されている DRAM の容量以下である必要があります。 Software Download Tool 内の画像には、必要な最小 DRAM 容量が記載されています。 取り付けられている DRAM の容量を確認するには、show version コマンドを入力します。
    Cisco 2821 (revision 53.51) with 210944K/51200K bytes of memory.

    DRAM の総容量を設定するために、これらの番号を追加します。 この特定の Cisco ルータの DRAM 容量は 256 MB です。

  2. もう 1 つの原因として、Cisco IOS のバグによるメモリ リークの可能性があります。 この場合は、1 つのプロセスが終了するまで過度にメモリを消費します。 メモリが不足している場合は、情報を収集するために次のコマンドを入力します。
    show clock
    show mem stat
    show proc mem sorted
    show mem all totals
    show log

    show proc mem sorted コマンドは、メモリ保持の最大量から最小量まで、降順ですべてのプロセスを一覧表示します。 これは最も高いプロセスを識別しますが、Init を除外します。 調査が完了すると、出力の左側にそのプロセスのプロセス ID(PID)を表示し、この情報を収集します。
    show proc mem <PID #>

    最も高いプロセスが Dead の場合、前述の出力に加えて、この情報を収集します。
    show mem dead totals
    show mem dead

    特定のプロセスには、より詳細な調査が必要なものもありますが、このドキュメントでは取り上げていません。

  3. 他にも、デバイスのプロセスと設定によってメモリが使い尽くされることが、メモリの問題の原因として考えられます。 この例は、ボーダー ゲートウェイ プロトコル(BGP)ルータに見られます。 場合によっては、BGP は、使用するルートの数のために大量のメモリを保持します。 これは、Cisco IOS のバグによるものではありません。 この問題は、最適なルーティングを行い、メモリ使用量を減らすために、設定を変更して修正する必要があります。

    よくわからない場合、この問題はおそらくより詳細な調査が必要なため、前述の出力を収集(show mem dead totals および show mem dead は除外)し、TAC サービス リクエストを開いてください。

I/O プール

I/O プールは I/O バッファを示し、show buffers コマンドで表示されます。 これらのバッファは、ルーティング更新やブロードキャストなどの他のもののプロセス交換トラフィックで使用されます。 I/O メモリは複数のプールに分割されます。これは show buffers コマンドの出力に表示されます。 これらのプールはパケット サイズに基づいており、必要性に応じたより効率的なメモリの割り当てを可能にします。

原因および収集対象

  1. I/O メモリの問題は、最初に Cisco IOS のバグによる潜在的なバッファ リークを確認します。 これは通常、特定のプールで、そのバッファの量が、すでに不要であるにもかかわらず、I/O プールに戻されずに増えてしまう現象を示します。 次に例を示します。
     --------- 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)

    上記の出力は、問題が明らかに Medium プールにあることを示しています。 その合計値はプールに設定された固定量よりもはるかに高くなっています。 出力は、プール内の 86,000 を超えるバッファにも、フリー リスト内に使用できるものが何もないことを示しています。 最後に、出力では、trims の数が created の数よりはるかに少ないですが、これは、消費を増やすための I/O プールへの解放が行われなかったことを示します。 これらのフィールドの詳細については、このドキュメントの最後にある関連情報セクションのバッファ プール フィールドの定義のリンクを参照してください。

    このシナリオでは、最初に次の出力をキャプチャしてください。
    show clock
    show mem stat
    show buffers
    show log

    問題のある複数のプールが特定されたら、さらに絞り込むために、次のコマンドを入力します。
    show buffer pool <pool name> packet

    このコマンドは大量の出力を表示する可能性があります。 通常は、この出力のほんの一部のページで、これらのバッファにどのパケットが存在し、これらを割り当てた担当者が誰かを特定できます。

  2. もう 1 つの原因として可能性があるのは、ネットワーク/トラフィック イベントです。 これは通常、複数のプールにおける過度な使用を示します。 以前の出力を収集しておき、さらに show buffer pool <pool name> packet コマンドで、この使用率を示すプールについて出力し、TAC サービス リクエストを開くことをお勧めします。 これは通常、デバイスによってプロセス交換される必要がある異常な、または予期しないトラフィック フローが原因です。 フローが集中的かつ高速である場合があるため、比較的短時間で I/O メモリを使い尽くされる可能性があります。 このタイプの問題についてトラブルシューティングを行うには、通常はこのフローに異常があるかどうか確認するためにトラフィックの発信元を特定し、もし異常があれば削除するかブロックします。

  3. また、まれな例ですが、ネットワーク環境で必要な特定のトラフィックにより特定のプールの使用率が過剰になることがあります。 このトラフィックは、何らかの理由でプロセス交換が必要である可能性があり、ネットワーク上でこれを回避する方法はありません。 このシナリオの場合は、十分に調査して適切な措置を講じる必要があります。 ここでは、ステップ 1 のものと同じ出力を適用します。

調査項目

前述の 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 サービス リクエストを開いて調査することをお勧めします。

関連情報


関連するシスコ サポート コミュニティ ディスカッション

シスコ サポート コミュニティは、どなたでも投稿や回答ができる情報交換スペースです。


Document ID: 116467