网卡的ring buffer

 

 

因为分配给 Ring Buffer 的空间是有限的,当收到的数据包速率大于单个 CPU 处理速度的时候 Ring Buffer 可能被占满,占满之后再来的新数据包会被自动丢弃。

如果在多核 CPU 的服务器上,网卡内部会有多个 Ring Buffer,NIC 负责将传进来的数据分配给不同的 Ring Buffer,这样存在多个 Ring Buffer 的情况下 Ring Buffer 缓存的数据也同时被多个 CPU 处理,就能提高数据的并行处理能力。

在生产实践中,因 Ring Buffer 写满导致丢包的情况很多。当环境中的业务流量过大且出现网卡丢包的时候,考虑到 Ring Buffer 写满是一个很好的思路。

1.网卡收到的数据包统计

ethtool -S eth0 | more

RX 就是收到数据,TX 是发出数据。

2.带有 drop 字样的统计和 fifo_errors 的统计

ethtool -S em1 | grep -iE "error|drop"

发送队列和接收队列 drop 的数据包数量显示在这里。并且所有 queue_drops 加起来等于 rx_fifo_errors。所以总体上能通过 rx_fifo_errors 看到 Ring Buffer 上是否有丢包。如果有的话一方面是看是否需要调整一下每个队列数据的分配,或者是否要加大 Ring Buffer 的大小。

3. 查询 Ring Buffer 大小

ethtool -g eth0

RX 和 TX 最大是 4096,当前值为 256 。队列越大丢包的可能越小,但数据延迟会增加。

4.调整 Ring Buffer 队列大小

ethtool -G eth0 rx 4096
ethtool -G eth0 tx 4096

参考

网卡的 Ring Buffer 详解 (wjhsh.net)

posted on 2022-09-09 14:10  JennyYu  阅读(531)  评论(0编辑  收藏  举报