50M 流量搞死 BCM57xx(NetXtreme I Server) 网卡

BCM 网卡质量渣的问题已经延续好多年了,12 年我写过一篇《BCM 5709 网卡》的博客记录 BCM 驱动的各种问题。
最近我们又遇到因为 BCM 扛不住小包(small packet)导致 nic 狂 drop 的问题,即使升级到最新的版本依然不行。当然这个很大一部分责任归结于我们,在产品上线之初没有做一个这方面的调研。
为什么 BCM 网卡会有这么多关注?目前主流的服务器厂商默认情况下都是 ship 的 broadcom 的网卡,市场占有率最大的 Dell,HP 无一都不是跟他们合作的,如果要使用其他品牌比如 Intel igb,大部分情况下需要单独采购,并且成本相比 Broadcom 会高出不少。这里是官方的价格列表(1, 2)。  
在正常情况下,BCM 的也能凑活着用,并不会引起很大的问题,比如跑的是一些正常服务。但是如果大量的小包,BCM 就彻底废了,尤其遇到只有 4 个队列的 BCM5719。所以,我标题写的并不是那么准确,仅仅是为了强调下其性能的巨大弱势。

上一篇博客我推荐了几款做发包测试的工具,通过他们,可以很明显的对比出差异。对于网卡的性能测试,收发包的性能跟带宽的吞吐相比更加重要,当然二者还是要看适用的场景。
以发 64B 的小包为例,BCM 的在 200Kpps/s 的时候就都废了,相比之下,同样的环境,I350 在 600Kpps/s 的时候仅仅有很少的丢包,准确的说是伴随着 rx_fifo_errors 的 overruns,各个厂家实现的方式不大一样,反映到 OS 层面就比较麻烦了,有的是 dropped 有的是 overruns。

下面两张图是我们某台接受大量小包(~70B)的服务器,可以看到,200Kpps/s 时候表现就一塌糊涂了,导致系统的 rt 非常大甚至直接 timeout。

50M 就能搞死一台 BCM5719/20 机器的说法毫不夸张。