PPPのtxqueuelenが小さすぎる
LinuxでイーサネットとPPPインタフェースのルーティングをすると、イーサネットからPPPインタフェースへの通信パケットをこぼしてしまうことがありました。
調べていった結果、PPPインタフェースのtxqueuelenが3(デフォルト値)であることが原因だと分かりました。
[root]# ifconfig ppp0
ppp0 Link encap:Point-to-Point Protocol
inet addr:x.x.x.x P-t-P:y.y.y.y Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1454 Metric:1
RX packets:600700 errors:0 dropped:0 overruns:0 frame:0
TX packets:1011374 errors:0 dropped:0 overruns:0 carrier:0
Collisions:0 txqueuelen:3
RX bytes:42335282 (40.3 Mb) TX bytes:1424516252 (1358.5 Mb)
txqueuelenはパケットの送信キューのサイズです。これが3つしかなかったため、イーサネットから大量にパケットが流れてくると、PPPインタフェースの送信キューからあふれてしまってました。
txqueuelenを30にしたところ、通信パケットがこぼれる現象は起こらなくなりました。
[root]# ifconfig ppp0 txqueuelen 30
手動でifconfigコマンドを使って毎回txqueuelenを設定するのは手間と感じる場合は、ip-up.localを使って自動化します。
[root]# cat /etc/ppp/ip-up.local
INTERFACE=$1
ifconfig $INTERFACE txqueuelen 30