web-dev-qa-db-ja.com

FreeBSDのng_nat停止は、パケットを定期的に渡します

私はFreeBSDルーターを持っています:

#uname
9.1-STABLE FreeBSD 9.1-STABLE #0: Fri Jan 18 16:20:47 YEKT 2013

それはたくさんのメモリを備えた強力なコンピュータです

#top -S
last pid: 45076;  load averages:  1.54,  1.46,  1.29                                      up 0+21:13:28  19:23:46
84 processes:  2 running, 81 sleeping, 1 waiting
CPU:  3.1% user,  0.0% Nice, 32.1% system,  5.3% interrupt, 59.5% idle
Mem: 390M Active, 1441M Inact, 785M Wired, 799M Buf, 5008M Free
Swap: 8192M Total, 8192M Free

  PID USERNAME    THR PRI Nice   SIZE    RES STATE   C   TIME   WCPU COMMAND
   11 root          4 155 ki31     0K    64K RUN     3  71.4H 254.83% idle
   13 root          4 -16    -     0K    64K sleep   0 101:52 103.03% ng_queue
    0 root         14 -92    0     0K   224K -       2 229:44 16.55% kernel
   12 root         17 -84    -     0K   272K WAIT    0 213:32 15.67% intr
40228 root          1  22    0 51060K 25084K select  0  20:27  1.66% snmpd
15052 root          1  52    0   104M 22204K select  2   4:36  0.98% mpd5
   19 root          1  16    -     0K    16K syncer  1   0:48  0.20% syncer

そのタスクは次のとおりです。NAT ng_nat経由およびPPPoE mpd5経由のサーバー。

通過するトラフィック-約300Mbit/s、ピーク時に約40kpps。作成されたPppoeセッション-最大350.

ng_natは、次のスクリプトによって構成されます。

 /usr/sbin/ngctl -f- <<-EOF                                            

             mkpeer ipfw: nat %s out                                                                               
             name ipfw:%s %s                                                                                       
             connect ipfw: %s: %s in                                                                               
             msg %s: setaliasaddr 1.1.%s

このようなng_natノードは20あり、約150のクライアントがあります。

時々、nat経由のトラフィックが停止します。これが発生すると、vmstatは多くのFAILカウントを報告します

vmstat -z | grep -i netgraph
ITEM                   SIZE  LIMIT     USED     FREE      REQ FAIL SLEEP
NetGraph items:          72,  10266,       1,     376,39178965,   0,   0
NetGraph data items:     72,  10266,       9,   10257,2327948820,2131611,4033

増やしてみました

net.graph.maxdata=10240                                                                                           
net.graph.maxalloc=10240

しかし、これは機能しません。

これは新しい問題です(1〜2週間)。構成は約5か月間正常に機能しており、構成の変更は行われず、問題が発生し始めました。

過去数週間で、トラフィックがわずかに増加し(270メガビットから300メガビットに)、pppoeセッションが少し増えました(300-> 350)。

私の問題を見つけて解決する方法を教えてください。

更新:ネットワークカードに関する情報:

# pciconf -lv | grep -B3 network   
em0@pci0:0:25:0:        class=0x020000 card=0x35788086 chip=0x15028086 rev=0x05 hdr=0x00
    vendor     = 'Intel Corporation'
    device     = '82579LM Gigabit Network Connection'
    class      = network
--
em1@pci0:2:0:0: class=0x020000 card=0x35788086 chip=0x10d38086 rev=0x00 hdr=0x00
    vendor     = 'Intel Corporation'
    device     = '82574L Gigabit Network Connection'
    class      = network

UPD:2つの「トップ」出力があります https://Gist.github.com/korjavin/9190181

net.isr.dispatchをハイブリッドに切り替えたとき。この後、大量のmpdプロセス(理由はわかりません)と1つのCPUで100%の割り込みが発生し、10分間の作業の後、大きなパケットが失われたために再起動されました。

UPD:再び発生しました再起動前と再起動後に「トップ」出力があります https://Gist.github.com/korjavin/9254734

cPUを大量に消費するng_queueプロセスの問題のように見えます。私の最初の投稿以来、はるかに多くのセッションとトラフィックがあります。約400pppoe、450Mbit/s

7
Korjavin Ivan

/boot/loader.confのnet.link.ifqmaxlenを10240にバンプしてみます。それを過小評価しているので、em(4)(およびigp、Intel 10gカード)ドライバー(または少なくとも82574L)はしません非IPトラフィック(pppoe)のバランスを取り、すべてが1つのng_queueに入るようにします。

インターフェイスの1つ(em0)が1つのIRQを使用し、もう1つのインターフェイス(em1)がtx、rx、およびlinkに別々のIRQを使用している理由がわかりません。両方のNICカードはMSI-X対応スロットにありますか?

あなたはおそらく私ができるよりもこれを理解することができます(私はロシア語を知りません、そしてグーグル翻訳はあまり役に立ちません):

http://forum.nag.ru/forum/index.php?s=c4da62052515736f45c73b932216af33&showtopic=82322&st=

FreeBSDフォーラムのこのスレッドにはいくつかの提案があります

ネットワークパフォーマンスチューニングに関するFreeBSD wikiは、ng_natのシングルスレッドといくつかの回避策について少し説明しています

一部の人々は、カーネル(およびmpd)でIPv6を無効にすることに成功したと報告していますが、実際のコンセンサスは見られません。

編集: 私はこれを追加するのを忘れました 、他のいくつかの関連するチューニングパラメータがあるようです、私はダミーネット関連のものが有望に見えると思いました。

何が起こるか教えてください、これは興味深い問題です...

1
quadruplebucky

解決策は次のとおりです。

deny ip from any to any dst-port 6881 out

だから、それは約NATと州の数と急流でした

0
Korjavin Ivan