現在有很多硬件平臺理論上支持千兆以太網接口,但實際傳輸速率遠遠低於千兆,並且丟包率很高。最近我做了一些以太網吞吐量和丟包率方面的優化工作,有一些心得和大家分享一下。
一、測試模型
二、影響吞吐量和丟包率的因素
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. 優化軟中斷收發包的處理方法,將軟中斷處理數據包的過程分爲兩步處理。例如把收包放到軟中斷裏面處理,把數據包上報協議棧放到內核線程處理,類似於上半部和下半部。這樣做可以減少中斷屏蔽時間,儘可能多的接收外部數據到網卡緩衝區,從而增加吞吐量。同時,用內核線程去上報數據包到協議棧可以避免丟包。
上面介紹了千兆網卡提升吞吐量和減小丟包率的方法,我實際測試有很大的改善,分享出來供大家參考。
當然,實際優化過程中可能會遇到更種問題,本文僅僅提供優化思路。