FreeBSD 的 ng_nat 停止定期传递数据包

Kor*_*van 7 freebsd nat

我有 FreeBSD 路由器:

#uname
9.1-STABLE FreeBSD 9.1-STABLE #0: Fri Jan 18 16:20:47 YEKT 2013
Run Code Online (Sandbox Code Playgroud)

这是一台拥有大量内存的强大计算机

#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
Run Code Online (Sandbox Code Playgroud)

它的任务是:通过 ng_nat 的 NAT 和通过 mpd5 的 PPPoE 服务器。

流量通过 - 约 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
Run Code Online (Sandbox Code Playgroud)

有 20 个这样的 ng_nat 节点,大约有 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
Run Code Online (Sandbox Code Playgroud)

我被试过增加

net.graph.maxdata=10240                                                                                           
net.graph.maxalloc=10240
Run Code Online (Sandbox Code Playgroud)

但这不起作用。

这是一个新问题(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
Run Code Online (Sandbox Code Playgroud)

UPD:有 2 个“顶级”输出 https://gist.github.com/korjavin/9190181

当我将 net.isr.dispatch 切换到混合时。在此之后,我有大量的 mpd 进程(不知道为什么)和一个 CPU 100% 中断,在工作 10 分钟后,由于丢失了大数据包,它重新启动。

UPD:再次发生在重新启动之前和之后有“顶部”输出 https://gist.github.com/korjavin/9254734

看起来像 ng_queue 过程中的问题,它消耗 CPU 太多。自从我的第一篇文章以来,有更多的会话和流量。约 400 pppoe 和 450Mbit/s

qua*_*cky 1

我会尝试将 /boot/loader.conf 中的 net.link.ifqmaxlen 更改为 10240。据我了解,em(4)(和 igp,Intel 10g 卡)驱动程序(或至少是您的 82574L)不会平衡非 IP 流量(您的 pppoe),以便所有内容都进入一个 ng_queue。

我不明白为什么您的一个接口 (em0) 使用一个 IRQ,而另一个接口 (em1) 对 tx、rx 和链接使用单独的 IRQ。两个 NIC 卡都位于支持 MSI-X 的插槽中吗?

你可能比我更能理解这一点(我不懂俄语,谷歌翻译也没有多大帮助):

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

FreeBSD 论坛的这个帖子有一些建议

关于网络性能调优的 FreeBSD wiki 解释了一些关于 ng_nat 中的单线程和一些解决方法

有些人报告成功在内核(和 mpd)中禁用 IPv6,但我没有看到任何真正的共识。

编辑: 我忘了添加这个,似乎还有其他几个相关的调整参数,我认为与虚拟网相关的参数看起来很有前途。

让我知道发生了什么,这是一个有趣的问题......