2.网卡:板载1000M BCM5709
2.OS: RHEL 5.5 x86_64
3.KERNEL: 2.6.18-194.el5
所出现的问题
1.网卡毫无征兆的down掉,而且没有任何log信息
2.当流量增大时,不到理论上限的1/3时机器出现网络延迟严重,伴随大量的丢包
3.机器的cpu软中断不均衡,只有1个cpu处理软中断,并且该cpu的软中断周期性的达到100%
4.内外网网卡做nat丢包数据量不一致,差别很大,不在同一个数量级
想必第一个问题,大部分使用bcm网卡,rhel 5.3以后得机器都会遇到这种情况,网上的资料比较的多,我也不多啰嗦了,直接升级网卡驱动就可以解决了。第二,三,四其实是同一个问题都是由于网卡中断过多,cpu处理不过来(准确的说,cpu分配不均衡,导致只有一个cpu处理,处理不过来),引起丢包,那么为什么两个网卡丢包的数量级不一样呢,下面从原理上进行解释,既然是做nat多出口,那么就有大量的路由信息,是一个网络应用,当一个数据包请求nat时,数据包先被网卡驱动的数据接收,网卡收到数据时,触发中断。在中断执行例程中,把skb挂入输入队列,并触发软中断。稍后的某个时刻,当软中断执行时,再从该队列中把skb取下来,投递给上层协议。
在多 CPU 的环境中,还有一个中断平衡的问题,比如,网卡中断会教给哪个 CPU 处理,这个参数控制哪些 CPU 可以绑定 IRQ 中断。其中的 {number} 是对应设备的中断编号,可以用下面的命令找出:cat /proc/interrupt
比如,一般 eth0 的 IRQ 编号是 16,所以控制 eth0 中断绑定的 /proc 文件名是 /proc/irq/16/smp_affinity。上面这个命令还可以看到某些中断对应的CPU处理的次数,缺省的时候肯定是不平衡的。
设置其值的方法很简单,smp_affinity 自身是一个位掩码(bitmask),特定的位对应特定的 CPU,这样,01 就意味着只有第一个 CPU 可以处理对应的中断,而 0f(0x1111)意味着四个 CPU 都会参与中断处理。
几乎所有外设都有这个参数设置,可以关注一下。
这个数值的推荐设置,其实在很大程度上,让专门的CPU处理专门的中断是效率最高的,比如,给磁盘IO一个CPU,给网卡一个CPU,这样是比较合理的。
现在的服务器一般都是多核了,但是中断很多时候都是只用一个核,如果有些中断要求比较高,可以把它独立分配给一个cpu使用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)