我有 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
其任务是:通过 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
有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
我尝试增加
net.graph.maxdata=10240
net.graph.maxalloc=10240
但这不起作用。
这是新问题(1-2 周)。配置已经运行良好约 5 个月,在问题出现之前没有进行任何配置更改。
在过去的几周里,我们的流量略有增加(从 270 mbits 增加到 300 mbits),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 切换为 hybrid 时。此后,我有大量 mpd 进程(不知道为什么)和一个 CPU 中断达到 100%,工作 10 分钟后,由于丢失大量数据包,它重新启动了。
UPD:再次发生重启前和重启后都有“top”输出 https://gist.github.com/korjavin/9254734
问题似乎出在 ng_queue 进程中,它消耗了太多 CPU。自从我第一篇文章以来,会话和流量都多了很多。大约 400 pppoe 和 450Mbit/s
答案1
我会尝试将 /boot/loader.conf 中的 net.link.ifqmaxlen 增加到 10240。据我了解,em(4)(和 igp,Intel 10g 卡)驱动程序(或者至少是您的 82574L)不会平衡非 IP 流量(您的 pppoe),因此所有内容都会进入一个 ng_queue。
我不明白为什么您的一个接口 (em0) 使用一个 IRQ,而另一个接口 (em1) 为 tx、rx 和 link 使用单独的 IRQ。两块 NIC 卡是否都位于支持 MSI-X 的插槽中?
你可能比我更能理解这一点(我不懂俄语,谷歌翻译也帮不上什么忙):
http://forum.nag.ru/forum/index.php?s=c4da62052515736f45c73b932216af33&showtopic=82322&st=0
FreeBSD wiki 上的网络性能调优部分对 ng_nat 中的单线程以及一些解决方法进行了简要说明
一些人报告说在内核(和 mpd)中成功禁用 IPv6,但我没有看到任何真正的共识。
编辑: 我忘了加这个了,,似乎还有其他几个相关的调整参数,我认为与 dummynet 相关的参数看起来很有希望。
让我知道发生了什么,这是一个有趣的问题......
答案2
解决方法是:
deny ip from any to any dst-port 6881 out
所以,这是关于 NAT 和状态计数以及 torrent