千兆以太网卡吞吐量和丢包率优化总结

现在有很多硬件平台理论上支持千兆以太网接口,但实际传输速率远远低于千兆,并且丢包率很高。最近我做了一些以太网吞吐量和丢包率方面的优化工作,有一些心得和大家分享一下。

一、测试模型

千兆以太网卡吞吐量和丢包率优化总结_第1张图片

 

二、影响吞吐量和丢包率的因素

1. 网卡DMA缓冲区大小

    这个缓冲区决定tx ring buffer和rx ring buffer的大小,如果ring buffer太小,那么网卡缓存数据包的能力有限,当接收数据能力超过cpu处理能力时就会产生丢包现象。ring buffer越大,吞吐能力就越强,丢包的概率就越小。

 

2. CPU处理能力

    CPU处理速度越快,网卡接收到的数据包在网卡DMA缓冲区中的存留时间就越短,因此就可以腾出更多的空间来暂存新接收到的数据包。因此,CPU的处理能力直接决定了系统的吞吐量,运算速度越快,吞吐量越高。

 

3. 内存总容量

    当网卡DMA缓冲区太小时,ring buffer不够用,会造成网络数据丢包。此时,需要将数据包及时从ring buffer里面取出来,暂存到接收队列里面(发送数据时同理)。然后在合适的时机再把数据包上传给协议栈。这种处理方式会瞬时大量消耗系统内存,当吞吐量很大时,会引起内存剩余容量抖动,甚至导致内存不足的异常出现。

 

三、调试注意事项

1. 当前ring buffer是否设置为网卡最大ring buffer;

2. 高负载时注意CPU占用率,重点关注软中断和网络数据包处理线程的占用率总和;

3. 关注low memory剩余容量,长时间测试时,剩余容量是否有下降趋势;

4. 长时间测试后,查看log,系统是否有出现异常报警;

 

四、推荐优化方法

1. 提高CPU处理能力,例如提升CPU频率或者运行模式;

2. 提高内存总容量,增加系统内存或者更换更大的内存;

3. 优化软中断收发包的处理方法,将软中断处理数据包的过程分为两步处理。例如把收包放到软中断里面处理,把数据包上报协议栈放到内核线程处理,类似于上半部和下半部。这样做可以减少中断屏蔽时间,尽可能多的接收外部数据到网卡缓冲区,从而增加吞吐量。同时,用内核线程去上报数据包到协议栈可以避免丢包。

 

上面介绍了千兆网卡提升吞吐量和减小丢包率的方法,我实际测试有很大的改善,分享出来供大家参考。

当然,实际优化过程中可能会遇到更种问题,本文仅仅提供优化思路。

 

 

 

 

 

你可能感兴趣的:(Linux内核,网络/连接)