Ubuntu 上的低延迟 TCP 设置

Ale*_*x V 12 networking linux ubuntu latency performance-tuning

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

配置

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

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

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

eww*_*ite 11

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

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

net.core.rmem_default = 10000000
net.core.wmem_default = 10000000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
Run Code Online (Sandbox Code Playgroud)

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

在服务器级别,您可以修改 CPU 调控器以及电源和 CPU 频率管理(P-States、C-States)。

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

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

在不了解所涉及的硬件或网络设备的情况下,很难获得更具体的信息。

  • 这真的不是进行宗教辩论的合适场所。把它带到别处,比如聊天。 (3认同)

HBr*_*ijn 7

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

与经典的 UNIX 操作系统一样,Linux 旨在以公平的方式同时运行多个应用程序,并试图防止资源匮乏,而您的目标恰恰相反,除了您的应用程序之外,其他一切都将被饿死。操作系统级别的简单步骤是更改应用程序的良好级别和实时优先级,更改调度程序或使用实时内核。

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

 sysctl -a 
Run Code Online (Sandbox Code Playgroud)

将向您展示许多可以调整的内核设置。设置取决于您使用的是 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)防火墙。