ARP キャッシュのチューニング

アドレス解決プロトコル (ARP) は、32 ビット IPv4 アドレスをデータ・リンク・プロトコルで必要とされる 48 ビット・ホスト・アダプター・アドレスにマップする場合に使用されます。

ARP は、システムによって透過的に処理されます。 しかし、システムは 32 ビット IP アドレスと 48 ビット・ホスト・アドレスの関連を保持するテーブルである ARP キャッシュを保守します。 多数のマシン (クライアント) を接続する環境では、ARP キャッシュのサイズを変更しなければならない場合があります。 この場合は、no および netstat コマンドを使用して行います。

no コマンドはネットワークのチューニング・パラメーターを構成します。 そして、この ARP 関連チューナブル・パラメーターは、以下のとおりです。

  • arpqsize = 12
  • arpt_killc = 20
  • arptab_bsiz = 7
  • arptab_nb = 149

ARP テーブル・サイズは、arptab_nb パラメーターで定義されている数のバケットで構成されています。 各バケットは arptab_bsiz パラメーターに定義済みのエントリー数を保持します。 デフォルトは、149 個のバケットであり、それぞれに 7 個のエントリーがあります。したがって、このテーブルは、1043 (149 x 7) 個のホスト・アドレスを保持できます。 このデフォルト設定は IP ネットワーク上で 1043 個までの他のマシンと同時に通信することができるシステムで機能します。 1 つのサーバーがネットワーク上のマシンと 1043 を超えて同時に接続されると、ARP テーブルが小さすぎて ARP テーブルがスラッシングを起こし、パフォーマンスが低下します。 オペレーティング・システムはキャッシュ内のエントリーをパージし、新しいアドレスで置き換える必要があります。 TCP または UDP のパケットは、ARP プロトコルがこの情報を交換するまでキューに入る必要があります。 arpqsize パラメーターでは、 ARP 要求から ARP 応答が戻されるまでに、いくつの待ちパケットを ARP 層でキューに入れるかを指定します。 ARP キューがオーバーランする場合、 発信 TCP または UDP パケットは破棄されます。

ARP キャッシュのスラッシングは、以下の理由によりパフォーマンスに悪影響を与える場合があります。

  1. 現在の発信パケットは、ネットワーク上の ARP プロトコルのルックアップを待つ必要があります。
  2. その他の ARP エントリーは、ARP キャッシュから除去されなければなりません。 すべてのアドレスが必要な場合、削除されるホスト・アドレスが送信済みパケットを持っていれば、別のアドレスが必要になります。
  3. ARP 出力キューがオーバーランし、パケットの破棄を引き起こす可能性があります。

arpqsizearptab_bsiz、 および arptab_nb パラメーターはいずれもリブート・パラメーターです。つまり、 これらの値を変更した場合はブート時または TCP/IP ロード時に構築されるテーブルを変更するために、 システムのリブートが必要になります。

arpt_killc パラメーターは、ARP エントリーが削除される前の分単位の時間です。 arpt_killc パラメーターのデフォルト値は 20 分です。 ARP エントリーは、ネットワーク・アダプターを取り替えるときにホスト・システム自体が 48 ビット・アドレスを変更することがあるケースをカバーするために、arpt_killc パラメーターで定義された時間 (分単位) ごとにテーブルから削除されます。 これにより、キャッシュ内の失効したエントリーは必ず削除され、 古いアドレスが削除されるまでの間このようなホストとの通信が不可になります。 この時間を長く設定すれば、システムによる ARP のルックアップの数を削減できますが、 失効したホスト・アドレスの保持時間がそれだけ長くなります。 arpt_killc パラメーターは動的パラメーターなので、システムのリブートなしで変更することができます。

netstat -p arp コマンドは、ARP 統計情報を表示します。 これらの統計情報は、合計でいくつの ARP 要求が送信されたか、および新しいエントリーの領域を作るためにエントリーを削除するときに、いくつのパケットがテーブルからパージされたかを表示します。 このパージ・カウントが高い場合は、ARP テーブル・サイズを増やす必要があります。 以下に、netstat -p arp コマンドの例を示します。
# netstat -p arp

arp:  
     6 packets sent
     0 packets purged
arp -a コマンドを使用して、ARP テーブルを表示できます。 このコマンドの出力は、どのアドレスが ARP テーブルに存在するか、 これらのアドレスがどのようにハッシュされているか、どのバケットにハッシュされているかを表示します。
 ? (10.3.6.1) at 0:6:29:dc:28:71 [ethernet] stored 
                                                   
bucket:    0     contains:    0 entries            
bucket:    1     contains:    0 entries            
bucket:    2     contains:    0 entries            
bucket:    3     contains:    0 entries            
bucket:    4     contains:    0 entries            
bucket:    5     contains:    0 entries            
bucket:    6     contains:    0 entries            
bucket:    7     contains:    0 entries            
bucket:    8     contains:    0 entries            
bucket:    9     contains:    0 entries            
bucket:   10     contains:    0 entries            
bucket:   11     contains:    0 entries            
bucket:   12     contains:    0 entries            
bucket:   13     contains:    0 entries            
bucket:   14     contains:    1 entries            
bucket:   15     contains:    0 entries            


...lines omitted...

There are 1 entries in the arp table.