Catalyst 3650でバッファ溢れを起こしてパケットが大量にドロップされていたからチューニングを行う必要があった。 バッファの仕組みと必要なチューニングについてメモする。
Main Memory領域とI/O Memory領域
まず、物理メモリDRAMはCisco IOSの動作に使われるMain Memory領域とパケット処理に使われるI/O Memory領域に分割される。 Main Memory領域は通常気にしなくて良い。 これらの領域がどれぐらいの容量あるかは次のコマンドで確認できる
show version | include bytes of memory
例えば次のように表示された場合はMain Memory領域が845 MB、I/O Memory領域が6 MBである。
cisco ***** processor ***** with 864936K/6147K bytes of memory.
バッファの使われ方の理解に必要なルーティング処理の種類
Catalyst 3650のルーティングは大きく次の2つに分類できる。
- CEF(cisco express forwarding)
- process switching
CEFが優先され、CEFを使えない場合にprocess switchingが行われる。 CEFはinterfaceがpublic buffer poolsを利用せず、particle poolsだけを利用するためにメモリ利用効率が良い。 public buffer poolsとparticle poolsは後述する。
public buffer poolsとparticle pools
I/O Memory領域はさらにpublic buffer poolsとparticle poolsに分けて利用される。 public buffer poolsはpunt(cisco用語。CEFできず、より高度な処理のために高いレイヤの処理に持っていくこと)されるパケット及び、自発パケットが格納される。 particle poolsはinterfaceのパケット送受信に使われる。 各interfaceは送信(TX: transmitter)用と受信(RX: receiver)用のリングバッファを持っている。 このリングバッファはポインタに過ぎず、実体はparticle poolsにある。
トラブルシューティング
とりあえずshow buffers
を実行してみる。
no memory
のカウンタ値が増えていたらメモリ確保に失敗したことを示している。
この場合は搭載する物理メモリを増やすか、メモリリークを疑う。
failuresカウンタがhitsカウンタに比べて大きいならばpublic buffer poolsのサイズが小さ過ぎるかもしれない。 ここで、public buffer poolsのサイズは自動拡張されることに注意が必要である。 あらかじめ確保しておくサイズがあまりに小さいと拡張が間に合わずにパケットがドロップされる。 Ciscoのドキュメントにはfailuresカウンタの値がhitsカウンタの0.1 %に満たないならば十分な大きさだと書かれている。
続いて各interfaceのバッファ溢れを疑う。 パケットがドロップされているinterfaceについて以下のコマンドを打つ。
show interface INTERFACE_NAME
出力のうち次の値が異常に大きければTXリングバッファの長さが小さ過ぎるかもしれない。
Total output drops:
現在のTXリングバッファの状態は次のように表示される。
Output queue: 0/40 (size/max)
TXリングバッファのサイズ変更
TXリングバッファの不足が原因でパケットがドロップされていると確定したら、コマンドでサイズを変更する。 まず、グローバルコンフィグレーションモードに入り、変更対象のinterfaceを選択する。
#configure terminal (config)#interface GigabitEthernet1/0/1 (config-if)#
そして、次のコマンドでTXリングバッファの最大サイズを変更できる。 もちろん減らすこともできる。
(config-if)#hold-queue NUM out
例えば次のコマンドでTXリングバッファのサイズを100に変更する。
(config-if)#hold-queue 100 out
ここでout
の代わりにin
を指定すればRXリングバッファの最大サイズを変更できる。
参考文献
日本語の解説スライドはここにある。
TXリングバッファ不足に関するQ&A
show interfaceのtotal output dropsカウントについて - Cisco Community
Cisco公式のバッファ周りの説明
すべての Cisco ルータのバッファ チューニング - Cisco
Cisco公式のhold-queue
コマンドの解説