Ubuntu上的低延迟TCP设置


10

在我的实验室中,有一台用于测量的服务器正在Ubuntu上运行。并且有C程序,它通过TCP连接接收数据并应尽快发送答复。

组态

  • CPU:2个处理器x 4核-Intel(R)Xeon(R)CPU E5345 @ 2.33GHz
  • 内存:12 GB
  • NIC:英特尔公司80003ES2LAN千兆位以太网控制器/ 82546EB千兆位以太网控制器
  • 网络交换机:Cisco Catalyst 2960
  • 数据信息:数据块来了。每10毫秒。数据块大小约为 1000字节

接收数据包时的网络延迟非常关键(数十微秒很重要)。我对程序进行了最大程度的优化,但是我没有调整Ubuntu的经验。

在Ubuntu中可以配置什么以减少本地处理/发送数据包的延迟?


是的,我想知道服务器的品牌/型号。
ewwhite 2014年

你应该更深入地研究。阅读有关高频交易内核优化的一些知识。售售思科纸:cisco.com/c/dam/en/us/products/collat​​eral/switches/… 因此,两面都得到一块体面的PCI-E卡也可以节省一些费用。很有可能(取决于您要花多少时间),您将至少使用不同的设置来重建内核,从而删除了ubuntu确实需要但不需要的很多东西。因此,正如ewwhite确实在评论中写道,ubuntu对于最低的设置可能并不完美。
丹尼斯·诺尔特2014年

使用列出的硬件,它是2008年时代的设备(英特尔5300系列CPU)。那时,可能没有太多特殊的低延迟硬件更改。我将系统BIOS设置为在高性能模式下运行,并禁用CPU C状态。
ewwhite

@ewwhite是的,您对2008年时代的设备是正确的。我会尝试您的建议。谢谢!
Alex V

是否可以针对TCP_NODELAY调整此软件?
马特

Answers:


10

老实说,我不会为此使用Ubuntu ...但是有些选项可以应用于任何Linux变体。

您将要创建网络堆栈缓冲区:

net.core.rmem_default = 10000000
net.core.wmem_default = 10000000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

如果应用程序正在写入磁盘,则可能需要更改调度程序/电梯(例如,deadline电梯)。

在服务器级别,您可以修改CPU调速器以及电源和CPU频率管理(P状态,C状态)。

在操作系统级别,您可以更改应用程序的实时优先级(chrt),进行优化以减少中断,将其固定到一个CPU或一组CPU(taskset),并停止任何不必要的服务或守护程序。

您还可以在以下位置看到一些建议:如何对2个Linux主机之间的延迟进行故障排除

如果不了解所涉及的硬件或网络设备,就很难获得更具体的信息。


3
这实际上不是举行宗教辩论的合适场所。将其带到其他地方,例如聊天。
迈克尔·汉普顿

1
@MichaelHampton讨论中与该问题有关的有趣链接:《红帽实时调整指南》
Alex V

6

如果您要走高性能的道路,通常您将希望运行尽可能少的其他(计划的)进程,因为它们会干扰您的应用程序。

与经典的UNIX操作系统一样,Linux被设计为以公平的方式同时运行多个应用程序,并试图防止资源匮乏,而您的目标恰恰相反,除了您的应用程序之外,其他所有事物都将挨饿。在操作系统级的简单步骤,改变了不错的应用水平和实时优先级,改变调度或去一个实时内核。

通常对TCP / IP进行调整,以防止连接断开并有效利用可用带宽。为了从非常快速的链接中获得尽可能低的延迟,而不是从某些中间链接受到更多限制的连接中获得最大的带宽,您将调整网络堆栈的调整。

 sysctl -a 

将显示许多可以调整的内核设置。设置取决于您使用的是IPv4还是IPv6,以及您在应用程序中已经做过但确实感兴趣的事情可能是:

  • net.ipv4.tcp_window_scaling=1 RFC 1323-支持大于64K的IPV4 TCP窗口大小-高带宽网络通常需要
  • net.ipv4.tcp_reordering=3 IPV4数据包可以在TCP数据包流中重新排序的最大时间,而无需TCP假设数据包丢失并进入缓慢启动。
  • net.ipv4.tcp_low_latency=1旨在优先考虑低延迟而不是较高的吞吐量;设置= 1禁用IPV4 TCP预队列处理
  • net.ipv4.tcp_sack=0 设置为1将启用对IPV4的选择性确认,这需要启用tcp_timestamps并增加一些数据包开销,如果您没有数据包丢失,则不需要
  • net.ipv4.tcp_timestamps=0 仅在需要麻袋的情况下建议使用。
  • net.ipv4.tcp_fastopen=1 启用在打开的SYN数据包中发送数据。

大多数(如果不是全部)在内核源代码中都有更好的记录。

当然,您可以编码原始TCP套接字,并且基本上完全绕过内核TCP / IP堆栈。

高度优化的系统通常在受信任的网络中运行,并且会禁用其本地(iptables)防火墙。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.