linux – 如何扩展UDP读取吞吐量?

linux – 如何扩展UDP读取吞吐量?,第1张

概述设置:两个 linux(CentOS 6)服务器通过专用的GigE链路背对背连接.每台服务器有24个内核和32GB RAM 客户端:模拟器在一个线程中尽可能快地拍摄UDP数据包.每个数据包大小为256个字节.我看到最大吞吐量是~200,000包/秒. 服务器:在一个线程中接收UDP套接字上的数据包并执行轻量级解析.我看到最大吞吐量是~200,000包/秒,CPU 1个核心在处理过程中利用率为85% 设置:两个 linux(CentOS 6)服务器通过专用的GigE链路背对背连接.每台服务器有24个内核和32GB RAM

客户端:模拟器在一个线程中尽可能快地拍摄UDP数据包.每个数据包大小为256个字节.我看到最大吞吐量是~200,000包/秒.

服务器:在一个线程中接收UDP套接字上的数据包并执行轻量级解析.我看到最大吞吐量是~200,000包/秒,cpu 1个核心在处理过程中利用率为85%左右.没有数据包丢失,接收缓冲区设置为128M以防万一.

现在我有23个额外的核心我想使用,但是一旦我在服务器端添加一个线程用于接收数据,并且客户端线程通过专用套接字在客户端端发送数据,我看到很多数据包在服务器端丢失.

服务器线程完全相互独立,除了I / O外不会阻塞.它们不会在套接字上竞争,因为它们中的每一个都从它们自己的UDP套接字中吸取数据包.

我看到以下行为:

>每个核心的cpu大约为85%,如果是额外的核心,则使用大约90%的ksoftirqd / xx进程.
>我正在丢失数据包,整个每个线程下降到大约120,000个数据包/秒

Google表示ksoftirqd使用cpu来处理软中断,而重度系统调用(UDP读取)可能是此内核线程cpu使用率过高的原因之一.

我通过将我的进程固定到同一个物理插槽上的一堆核心来重复实验,我发现性能提高到150,000个数据包/秒,但仍有一些相当大的数据包丢失.

有没有办法可以提高程序的可扩展性并最大限度地减少数据包丢失?

解决方法 首先,每秒200,000个数据包,每个数据包有256个(数据?)字节,一旦考虑到UDP,IP和以太网开销,您的千兆链路的运行容量几乎只有计算带宽的一半.在您推动的每秒数据包速率下,许多交换机(例如)会倒下.

其次,你可能被IRQ杀死了.更好的网卡具有可调参数,可以让您减少更少的IRQ以增加延迟(它们每N个数据包仅中断一次).确保已启用该功能. (一个要检查的地方是以太网卡的模块参数.)

总结

以上是内存溢出为你收集整理的linux – 如何扩展UDP读取吞吐量?全部内容,希望文章能够帮你解决linux – 如何扩展UDP读取吞吐量?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1018330.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存