FreeBSD在做IPsec-Gateway或作路由的情况下,当处理的数据包到达一定数量级(>15000包/每秒)时,系统的负载会很高,表现是输入任何命令响应很慢。
用TOP显示CPU的状态时,大量时间被中断(interrupt),如下:
CPU states: 0.0% user, 0.0% nice, 1.0% system, 98.8% interrupt, 0.2% idle
原因是每个数据包过来,网卡都会请求CPU中断,当包的数量过高时,CPU很难正常处理其它事情。
这时候可以利用网卡的polling模式解决这个问题,polling模式就是让cpu定期去取网卡内存中的数据包。虽然平时看上去这种方法效率低
,但在网卡处理的包数量很高时能提高CPU的处理效率。
支持polling的模式的网卡有:dc(4), em(4), fwe(4), fxp(4), nge(4), rl(4), sis(4), ste(4)
在内核配置中加入了下面两条:
options DEVICE_POLLING
options HZ=2000
用新内核起动后,运行下面命令:
/sbin/sysctl -w kern.polling.enable=1
/sbin/sysctl -w kern.polling.burst_max=600
就能大量提高CPU的效率。
用TOP显示CPU的状态时,大量时间被中断(interrupt),如下:
CPU states: 0.0% user, 0.0% nice, 1.0% system, 98.8% interrupt, 0.2% idle
原因是每个数据包过来,网卡都会请求CPU中断,当包的数量过高时,CPU很难正常处理其它事情。
这时候可以利用网卡的polling模式解决这个问题,polling模式就是让cpu定期去取网卡内存中的数据包。虽然平时看上去这种方法效率低
,但在网卡处理的包数量很高时能提高CPU的处理效率。
支持polling的模式的网卡有:dc(4), em(4), fwe(4), fxp(4), nge(4), rl(4), sis(4), ste(4)
在内核配置中加入了下面两条:
options DEVICE_POLLING
options HZ=2000
用新内核起动后,运行下面命令:
/sbin/sysctl -w kern.polling.enable=1
/sbin/sysctl -w kern.polling.burst_max=600
就能大量提高CPU的效率。